Řešení 1:
Na další otázku jsem odpověděl zde:
Gitu se nepodařilo odeslat s chybou „nedostatek paměti“
Neodpovídám zde na všechny vaše otázky, ale na otázku ve vašem nadpisu:
Jak nastavit shmall, shmmax, shmmni atd... obecně a pro postgresql
U některých distribucí jádra existují nastavení, která brání jádru přidělit maximální paměť jedinému procesu:
Nastavte parametry jádra
Upravte /etc/sysctl.conf
soubor, který obsahuje řádky vhodné pro váš operační systém:
# Red Hat Enterprise Linux 3.0 and CentOS 3.x
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmin = 1
kernel.shmseg = 10
# semaphores:
semmsl, semmns, semopm, semmni kernel.sem = 250 32000 100 128
fs.file-max = 65536
# Red Hat Enterprise Linux 4.0 and CentOS 4.x
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.shmall = 2097152
Pokud váš proces překročí limity, jádro proces ukončí, přestože je na vašem systému hlášena maximální dostupná paměť.
Poznámka:Při těchto nastaveních buďte opatrní. Pravděpodobně nebudete chtít použít nastavení v tomto příkladu, protože jsem je stáhl ze serveru v našem prostředí.
Několik poznámek navíc:
Chcete-li aktualizovat a otestovat nastavení jádra pomocí sysctl, použijte následující příkazy:
Seznam aktuálních nastavení:
sysctl -A | grep shm
sysctl -w kernel.shmmax=<value> to write in sysctl.conf
sysctl -p /etc/sysctl.conf to read/reload the values from sysctl.conf
Zakažte zabezpečený linux úpravou /etc/selinux/config
a ujistěte se, že příznak SELINUX je nastaven následovně.
SELINUX=disabled
Je to vhodné? Pokud ne (nebo ne nutně), v jakém případě by to bylo vhodné?
Nastavení jádra jsou obvykle přísněji definována v prostředích datových center, kdy poskytovatelé ISP nechtějí, aby jeden zákaznický proces zabíral všechny prostředky na sdíleném serveru.
Obvykle nemusíte nastavovat parametry paměti jádra, pokud nemáte proces, který je jádrem zabit kvůli nedostatku zdrojů.
V některých případech může postgres také alokovat více paměti na konkrétní velikosti stránek, než kolik je k dispozici ve sdílené paměti:
* The PostgreSQL server failed to start. Please check the log output:
2011-11-04 05:06:26 UTC FATAL: could not create shared memory segment: Invalid
argument
2011-11-04 05:06:26 UTC DETAIL: Failed system call was shmget(key=5432001, size
=161849344, 03600).
2011-11-04 05:06:26 UTC HINT: This error usually means that PostgreSQL’s reques
t for a shared memory segment exceeded your kernel’s SHMMAX parameter. You can
either reduce the request size or reconfigure the kernel with larger SHMMAX. To
reduce the request size (currently 161849344 bytes), reduce PostgreSQL’s shared
_buffers parameter (currently 19200) and/or its max_connections parameter (curre
ntly 53).
If the request size is already small, it’s possible that it is less than
your kernel’s SHMMIN parameter, in which case raising the request size or recon
figuring SHMMIN is called for.
The PostgreSQL documentation contains more information about shared memo
ry configuration.
…fail!
Chyby, jako je příklad výše, lze vyřešit úpravou nastavení prostředků jádra. Doporučená nastavení a metody pro určení nastavení zdrojů jsou podrobně popsány zde:
http://www.postgresql.org/docs/9.1/static/kernel-resources.html
Tato nastavení se však opravdu nemusíte dotýkat, pokud nenarazíte na situace nedostatku zdrojů související s postgresovým procesem. K těmto situacím dochází nejčastěji ve sdílených prostředích nebo serverech, kterým jsou přiděleny malé zdroje.
Může někdo vysvětlit, jak je skutečně nastavit od základů?
Pokud jde o ladění Postgres, měli byste si přečíst toto:
http://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server
Řešení 2:
Tady jsem našel skvělý nástroj pro výpočet optimální konfigurace našeho postgresql serveru.
http://pgtune.leopard.in.ua/