Temat: Problem z postgresem

Hej,
Podczas zapytań (select) postgress pisze coś na dysku twardym w takich ilościach, że "serwer" prawie przestaje odpowiadać.

Ma ktoś pomysł co jest nie tak? Jak można sprawdzić co on zapisuje?

Ostatnio był przeinstalowany system operacyjny, dodałem też pamięci RAM i nadal co samo.
Daniel Podlejski

Daniel Podlejski DBA,
SysAdmin/DevOps,
backend developer

Temat: Problem z postgresem

Ogólnie: prawdopodobnie operujesz na dużych zbiorach danych, które nie mieszczą się w pamięci, przez co serwer musi pisać po dysku.
Wrzuć do konfiguracji: log_temp_files = 0
Przyjrzyj się też zużyciu swapa.

Temat: Problem z postgresem

cała baza danych to 2 GB wiec nie wydaje mi się że to wina zbyt dużych danych.
plik wymiany jest nie ruszony przez system od wczoraj.
przestawiłem w konfiguracji log_temp_files = 0, ale nie czuje jakiejś poprawy.

jakieś inne pomysły?

konto usunięte

Temat: Problem z postgresem

Karol Marian Słuszniak:
cała baza danych to 2 GB wiec nie wydaje mi się że to wina zbyt dużych danych.
plik wymiany jest nie ruszony przez system od wczoraj.
przestawiłem w konfiguracji log_temp_files = 0, ale nie czuje jakiejś poprawy.

jakieś inne pomysły?

http://www.postgresql.org/docs/9.2/static/runtime-conf...
Może być tak, że przetwarzane są duże zbiory danych. Chodzi o sortowanie, pamięć sesji. Jak się ustawi temp_file_limit na 0 - wtedy będzie wiadomo, że to to. :D Jest coś takiego jak tempfs - trzyma tempa w ramie, chociaż ja tam wolę bufory bazy danych mieć... Do testów, można spróbować. Jak problem ustąpi - będzie wiadomo, że to to. Można też użyć np. pgbouncera i podbić pamięć dla połączenia. W tym kierunku bym się przemieszczał :)
Daniel Podlejski

Daniel Podlejski DBA,
SysAdmin/DevOps,
backend developer

Temat: Problem z postgresem

jakieś inne pomysły?

Zajrzyj do logów - log_temp_files = 0 powoduje, że wszystkie pliki tymczasowe są logowane.
Co do rozmiaru bazy - nie musi być duży, wystarczy, że zrobisz joina dwóch dużych tabel i posortujesz - jeśli wynik nie zmieści się w pamięci, będą użyte pliki tymczasowe. Być może po prostu masz źle skonfigurowany serwer (pewnie jedziesz na ustawieniach domyślnych?).

Temat: Problem z postgresem

software nie jest mój - napisała go firma zewnętrzna i nie mamy z nią kontaktu od dawna.

czy temp_file_limit jest w każdej wersji postgresa? ja mam 8.3 i nie widzę takiej zmiennej. a może mam to sam jakiś z palucha zmienić?

Tak jadę na ustawieniach default... z resztą tamta firma zewnętrzna też tak zrobiła a przynajmniej tak kiedyś twierdzili.

sory za głupie pytania, ale ja "dzieckiem Microsoftu" SQLServer i C#, i zupełnie nie znam się na postgresie.
Daniel Podlejski

Daniel Podlejski DBA,
SysAdmin/DevOps,
backend developer

Temat: Problem z postgresem

temp_file_limit jest od 9.2

Ogólnie, jeśli sytuacja wygląda tak jak piszesz, to rady są dwie:
- wynajmijcie kogoś, kto się na tym zna i zrobi tuning
- przejrzyj http://thebuild.com/presentations/not-your-job.pdf - to co tam jest, plus odrobina wiedzy "ogólnouniksowej" i trochę czasu na googlanie, pozwolą rozwiązać większość prostych problemów

Temat: Problem z postgresem

dzięki za pomoc, już widzę co jest nie tak.

software "osiągnął masę krytyczną" jedna z SQL'elek zabiera 30 sekund a jest wykonywana dość często :(

Ale bez waszej pomocy nie obczaił bym logów. dzięki wielkie!

konto usunięte

Temat: Problem z postgresem

Daniel Podlejski:
temp_file_limit jest od 9.2

Ogólnie, jeśli sytuacja wygląda tak jak piszesz, to rady są dwie:
- wynajmijcie kogoś, kto się na tym zna i zrobi tuning
- przejrzyj http://thebuild.com/presentations/not-your-job.pdf - to co tam jest, plus odrobina wiedzy "ogólnouniksowej" i trochę czasu na googlanie, pozwolą rozwiązać większość prostych problemów

Fajna prezentacja.
Adam Lesiak

Adam Lesiak Web developer - JEE
/ jQuery

Temat: Problem z postgresem

Mi w takim problemie pomogła zmiana parametru shared_buffers na 1024MB, bo domyślnie jest bodajże 32MB oraz work_mem na 4096MB.

konto usunięte

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.

konto usunięte

Temat: Problem z postgresem

Work_mem to ilość pamięci dla KAŻDEJ operacji np. sortowania, które mogą być robione jednocześnie. Niektóre zapytania korzystają jednocześnie z kilku takich operacji, co oznacza, że mogą zająć wielokrotność tej wielkości w pamieci. To może boleć. Nie bez powodu standardowo jest to ustawione na poziomie 1MB. Na serwerach, które obsługują gigantyczny ruch i mają ze sto gigabajtów ramu, czasem zwiększamy to do 2MB.

Jest jeszcze ważny parametr: effective_cache_size, który proponuję ustawić na 3GB; do tego shared_buffers na 128MB i work_mem zostawić na standardowym 1MB.

Jak cała baza ma 2GB, czyli mieści się w ramie, to powyższa konfiguracja spowoduje, że po jakimś czasie, cała baza może być w pamięci systemu operacyjnego jako cache dysku i Postgres będzie korzystał z ramu.

Testy wykazały, że system operacyjny lepiej zarządza cachem danych z dysku, niż Postgres, więc ustawia się to tak, żeby Postgres tym nie zarządzał.

konto usunięte

Temat: Problem z postgresem

Karol Marian Słuszniak:
Hej,
Podczas zapytań (select) postgress pisze coś na dysku twardym w takich ilościach, że "serwer" prawie przestaje odpowiadać.

Ma ktoś pomysł co jest nie tak? Jak można sprawdzić co on zapisuje?

Ostatnio był przeinstalowany system operacyjny, dodałem też pamięci RAM i nadal co samo.

A co pokazują logi? Jaki jest plan tego zapytania? Skąd wiesz, że to jest zapisywanie, a nie odczyt danych?

hint: jak nie ma odpowiedniego indeksu, to baza może chcieć odczytać całe 2GB z dysku i je posortować, to może boleć. Jak jest indeks, ale zapytanie jest do dupy, to może być indeks nieużywany.

Następna dyskusja:

Dziwny problem w funkcji T-...




Wyślij zaproszenie do