Temat: Problem z postgresem
Adam Lesiak:
Mi w takim problemie pomogła zmiana parametru shared_buffers na 1024MB, bo domyślnie jest bodajże 32MB oraz work_mem na 4096MB.
http://www.postgresql.org/docs/8.4/static/runtime-conf...
work_mem na 4GB? Jednak odważni ludzie jeszcze żyją... :) Jak ramu jest te 4GB - a np. 10 klientów ma do posortowania coś na poziomie 1GB? Pierwszych 4 jedzie z sortowaniem w ramie - reszta leci z robotą do swapa.
shared_buffers to pamięć podręczna bazy - powinna być na tyle duża, żeby standardowe zapytanie nie wymagało operowania na buforach systemowych... Wiem, że to nic nie mówi. Chodzi o to, że PG polega na systemie operacyjnym, który obskakuje całe buforowanie. Jak shared_buffers ma 1GB - te dane siedzą w ramie 2 razy. Raz w shared_buffers, dwa w buforach systemowych. Co więcej - koło 9.0 poprawili checkpointa. Dla 8.4 było tak, że na checkpointa baza na hurra zrzucała wszystkie zmiany z shared_buffers do buforów systemowych i na dysk. Checkpoint w xlogu oznacza, że w tym momencie w czasie dane w tabelach były aktualne. W przypadku awarii baza nanosi zmiany z xlogów do tabel od ostatniego checkpointa. W 9.0 zrobili tak, że procedura inicjuje zrzucanie, a jak się skończy to oznacza to w logach.
Podsumowując.
Ustawiłbym shared_buffers na poziomie 128MB i potem popróbował, czy np. 64MB nie wystarczy.
work_mem - tu zgadnąć się nie da. Oczywiste jest, że 4GB to tak jak powiedzieć sesjom - bierzcie ile dacie radę. Może na początek bym ustawił coś koło 512MB i sprawdził, co konkretnie jest problemem... Może gdzieś brakuje indeksu i baza wczytuje dużą tabelkę, sortuje, a potem robi np. limit 10 i z zewnątrz wygląda to ok...
No, oczywiście jak ramu jest parę tera... cały wywód jest bez sensu.