Niedawno zastąpiliśmy nasz serwer bazy danych ulepszoną maszyną z 4 x czterordzeniowymi procesorami i 32 GB pamięci RAM. Zmieniliśmy również przeznaczenie naszego starego urządzenia, aby służyło jako urządzenie podrzędne z replikacją strumieniową. Na obu urządzeniach działa CentOS 6.3 i PostgreSQL 9.2. Postgres jest jedyną rzeczą działającą na każdym z pudeł.
Ta konfiguracja istnieje od około miesiąca, kiedy nagle zaczęły się pojawiać problemy, gdy ruch zaczął się zwiększać. To, co zaczęliśmy widzieć, to czasami bardzo duże obciążenie procesora (góra pokazuje średnie obciążenie 270), a kiedy możemy spojrzeć pg_stat_activity
, zobaczymy, że większość naszych połączeń jest w COMMIT
stanie. Pozostawienie go w spokoju skończy się, a system zacznie reagować na połączenia IDLE
. Próbowaliśmy wyłączyć replikację, aby sprawdzić, czy to może być problem, ale problem nadal występuje.
Próbowaliśmy zdiagnozować, co się dzieje, i jesteśmy trochę zagubieni. Dane wyjściowe z uruchamiania perf
pokazują coś podobnego do poniższego i nie mam pojęcia, co 0x347ba9
reprezentuje.
+ 41.40% 48154 postmaster 0x347ba9 f 0x347ba9 ◆
+ 9.55% 10956 postmaster 0x2dc820 f set_config_option ▒
+ 8.64% 9946 postmaster 0x5a3d4 f writeListPage
+ 5.75% 6609 postmaster 0x5a2b0 f ginHeapTupleFastCollect ▒
+ 2.68% 3084 postmaster 0x192483 f build_implied_join_equality ▒
+ 2.61% 2990 postmaster 0x187a55 f build_paths_for_OR ▒
+ 1.86% 2131 postmaster 0x794aa f get_collation_oid ▒
+ 1.56% 1822 postmaster 0x5a67e f ginHeapTupleFastInsert ▒
+ 1.53% 1766 postmaster 0x1929bc f distribute_qual_to_rels ▒
+ 1.33% 1558 postmaster 0x249671 f cmp_numerics
Żadne z zapytań wykonywanych przez aplikację nie jest szczególnie złożone, a wyjaśnienie planów zajmuje maksymalnie 1 sekundę (większość jest znacznie szybsza). Ponadto, chociaż dzieje się tak, gdy ruch zaczyna się zwiększać, nie mówimy o dużym obciążeniu ruchem (stara maszyna była w stanie dość łatwo sobie z tym poradzić).
W tym momencie jestem trochę zakłopotany tym, co spróbować dalej. Każda pomoc lub sugestie będą mile widziane. Jeśli są jakieś dodatkowe informacje, które mogłyby pomóc, po prostu zapytaj, a ja mogę zmienić pytanie.
Konfiguracja dysku:
- Kontroler RAID Perc 6i
- 5 dysków 146 GB SAS 15 GB
- Skonfigurowany jako 2x146GB RAID-1 dla WAL i 3x146GB RAID-5 dla Systemu i danych
Aktualizacja:
Poniżej znajduje się wyjście VMStat, gdy system działa normalnie i gdy procesor wystrzeliwuje. Kiedy pojawia się problem, przerwania wydają się gwałtownie rosnąć.
Podczas normalnej pracy:
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 18938590 303763 21947154 0 0 28 52 7466 12649 2 1 97 0 0 2013-01-14 16:03:25 EST
0 0 0 18938396 303763 21947154 0 0 0 19 7107 12679 2 0 98 0 0 2013-01-14 16:03:35 EST
1 0 0 18938904 303763 21947162 0 0 0 54 7042 12708 1 1 99 0 0 2013-01-14 16:03:45 EST
1 0 0 18938520 303763 21947260 0 0 33 66 7120 12738 1 1 99 0 0 2013-01-14 16:03:55 EST
Gdy użycie procesora jest wysokie:
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---
r b swpd free buff cache si so bi bo in cs us sy id wa st
343 0 0 32680468 226279 11339612 0 0 0 214 26692 12225 80 20 0 0 0 2013-01-11 16:45:53 EST
374 1 0 32673764 226291 11340345 0 0 0 77 54893 11572 80 20 0 0 0 2013-01-11 16:46:03 EST
383 0 0 32616620 226304 11340956 0 0 0 102 55540 12922 82 18 0 0 0 2013-01-11 16:46:13 EST
315 0 0 32602038 226320 11341378 0 0 0 79 54539 12441 82 18 0 0 0 2013-01-11 16:46:23 EST
źródło
perf
narzędzia do profilowania całego systemu i niektórych profili PostgreSQL. Zobacz, gdzie występuje użycie procesora. BTW, formatowanie drugiegovmstat
jest beznadziejnie zniekształcone, a kolumny pierwszego są źle wyrównane, więc trudno jest je odczytać. Sprawdź, czy dodaniecommit_delay
poprawia rzeczy. Sprawdź, czy kontroler RAID ma pamięć podręczną zapisu z podtrzymaniem bateryjnym, a jeśli nie, zdobądź ją. Czy spędzasz dużo czasuiowait
? W niektórych raportach wygląda to na użycie procesora, ale tak naprawdę nie jest.Odpowiedzi:
Po dalszej diagnostyce i trochę googlingu natknęliśmy się na ten artykuł opisujący wiele takich samych symptomów, których doświadczamy. Podstawowa przyczyna ich problemu (i z tego, co możemy powiedzieć, również nasz) była związana z
Transparent Huge Pages
wdrożeniem.Po wyłączeniu za
Transparent Huge Pages
pomocą tego polecenia:Wygląda na to, że problem został rozwiązany. Przez ostatnie dwa tygodnie pracowaliśmy pod zwiększonym obciążeniem i problem nie pojawił się ponownie. Konteksty systemu i przerwania są konsekwentnie 1/10 tego, czym były, a także skrócił się średni czas systemu.
Nie jestem pewien, czy jest to rozwiązanie dla wszystkich, ale zamieszczam je tutaj jako możliwą przyczynę, na wypadek gdyby ktoś inny mógł rozwiązać podobny problem.
źródło