Niezwykle wolne IO z prostymi zapytaniami PostgreSQL 8.4.4 na Centos 5.5

10

Dziwny i wyjątkowo wolny wzorzec We / Wy, który widzę, jest następujący (wynik iostat -dxk 1 /dev/xvdb1):

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.99  0.99     7.92     3.96    12.00     1.96 2206.00 502.00  99.41

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     1.00    0.00   0.00 100.40

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     1.00    0.00   0.00 100.40

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.99  0.00     3.96     0.00     8.00     0.99 2220.00 1004.00  99.41

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     1.00    0.00   0.00 100.40

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.99  0.99  0.00     7.92     0.00    16.00     1.14 2148.00 1004.00  99.41

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     2.01    0.00   0.00 100.40

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  1.00  1.00     4.00     8.00    12.00     2.01 1874.00 502.00 100.40

Nie wiem, dlaczego wykorzystanie dysku i oczekiwanie jest tak wysokie, a szybkość odczytu / zapisu jest tak niska. Jaki może być tego powód?

Tabela, której dotyczy zapytanie, ma po prostu tylko kilka kolumn varchar, z których jedna to last_name, która jest indeksowana (faktycznie lower(last_name)jest indeksowana). Samo zapytanie jest proste:

SELECT * FROM consumer_m WHERE lower(last_name) = 'hoque';

Oto wynik wyjaśnienia:

                                           QUERY PLAN                                            
-------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on consumer_m  (cost=2243.90..274163.41 rows=113152 width=164)
   Recheck Cond: (lower((last_name)::text) = 'hoque'::text)
   ->  Bitmap Index Scan on consumer_m_last_name_index  (cost=0.00..2215.61 rows=113152 width=0)
         Index Cond: (lower((last_name)::text) = 'hoque'::text)

Zauważ też, że baza danych jest na auto_vacuum, więc nie przeprowadzono wyraźnej próżni / analizy.

ehsanul
źródło
Czy dostosowałeś swój postgresql.conf? Jeśli CentOS ma takie same ustawienia domyślne jak RHEL 5.x, będziesz miał mało pamięci na postgres, co może wymusić wiele operacji wejścia / wyjścia na dysku. Jak duże są rzędy na tym stole?
Thiago Figueiro,
Tabela pasuje do pamięci, podobnie jak indeks; został podzielony w ten sposób. I postgresql.conf został odpowiednio dostosowany (bufory współdzielone, rozmiar_pamięci_podręcznej itp.). Nawet gdyby tak nie było, nie spodziewałbym się tak zdegenerowanej wydajności.
ehsanul,

Odpowiedzi:

5

Fakt, że twoje urządzenie /dev/xvdb1sugeruje, że pracujesz pod Xenem. Jak skonfigurowana jest Twoja pamięć? Czy istnieje spór o podstawowe urządzenie i jak iostatna tym wygląda ?

Chyba że możesz wyeliminować to jako prawdopodobne, właśnie tutaj zamierzam wskazać wirujący wirnik złej wydajności.

Zasadniczo ogólnym podejściem do rozwiązania tego problemu jest pomyślenie o wszystkich warstwach, w których może wystąpić wąskie gardło, a następnie opracowanie testów w celu wyeliminowania każdej z nich, dopóki problem nie zostanie odizolowany.

mattdm
źródło
Bez sprzeciwu. Chociaż masz rację, że jest to serwer wirtualny, dysk twardy został w pełni poświęcony temu serwerowi, a ja uruchamiam tylko jedno zapytanie do bazy danych na raz, bez żadnych innych intensywnych operacji na serwerze. Pamięć masowa to tylko jeden wirujący dysk SATA. Zauważ, że mam kilka innych (osobnych) serwerów / baz danych z prawie taką samą konfiguracją, ale które działają szybko z niskim IO, zgodnie z oczekiwaniami, biorąc pod uwagę podobne zapytania / indeksowanie.
ehsanul
Czy możesz uruchomić iostatna dysku z dom0, aby zobaczyć, czy obraz jest podobny? Czy możesz wykonać inne podstawowe testy porównawcze dysków z obu poziomów? Pomoże to przynajmniej zawęzić miejsce, w którym należy szukać dalej.
mattdm,
Pewnie. Dlaczego spodziewasz się rozbieżności w zależności od tego, skąd iostatjest uruchamiany? Czy to powinno mieć znaczenie? Tak naprawdę nie mam teraz bezpośredniego dostępu do dom0, chociaż mógłbym go zdobyć. W fiomiędzyczasie spróbuję przeprowadzić testy porównawcze.
ehsanul
3
po pierwsze: migawki mogą stworzyć taką sytuację
Hubert Kario
3
Miałeś rację mattdm, pojawił się spór, pojawiający się na dom0. To był problem z komunikacją, mój szef przekazał część dysku twardego innemu serwerowi pod zarządem kogoś innego, bez mojej wiedzy. Miałem wrażenie, że był poświęcony, ponieważ tak zawsze go konfigurowaliśmy. Myślę, że dlatego zawsze ważne jest, aby dokładnie sprawdzić swoje założenia. Dzięki!
ehsanul
1

Oto kilka sugestii, w mniej lub bardziej losowej kolejności:

  1. Autovacum nie jest domyślnie włączony w CentOS. Aby go włączyć, musisz skonfigurować wiele ustawień. Sprawdź dwa razy, aby proces vacum faktycznie się uruchomił. Łatwo pominąć jedno z wymaganych ustawień.

  2. Pamiętaj, że musisz wykonać drugi krok filtrowania dla tego zapytania, co może być kosztowne w zależności od tego, co otrzymasz. Rozważałbym taki indeks jak:

    UTWÓRZ INDEKS Consumer_m_lower_last ON konsument_m (dolna (ostatnia nazwa));

    Który będzie pasował do twojego zapytania i usunie ponowne sprawdzenie.

  3. Ponadto, jak zauważa mattdm, nie można ufać iostatowi w środowiskach zwirtualizowanych.

  4. Prawdopodobnie powinieneś sprawdzić http://lonesysadmin.net/2008/02/21/elevatornoop/, jeśli masz problemy z IO w środowisku XEN. Ustawienia windy mogą mieć wpływ, ale nie tak duże.

  5. Czy dysk bazowy używa migawek LVM? Jest to bardzo przydatne z punktu widzenia zarządzania, ale może zabić wydajność IO. Jest to prawdą zarówno wtedy, gdy urządzenie blokowe, z którego korzystasz, to migawka, jak i jeśli została wykonana migawka urządzenia blokowego.

pehrs
źródło
Dziękuję za sugestie. Indeks jest w rzeczywistości niższy (nazwisko), mimo że pominąłem „niższy” od nazwy indeksu. Więc nie wiem, dlaczego tam się dzieje. Dysk zamontowany /używa w rzeczywistości migawek LVM, ale nie ten, na którym przechowywana jest baza danych. Więc nie sądzę, że o to chodzi. Zajmę się twoimi innymi sugestiami!
ehsanul,
1

Wątpię, że jest to problem z PostgreSQL, a bardziej prawdopodobne jest tylko problem z dyskowym We / Wy. Jak wspominają komentarze z innej odpowiedzi, jeśli jest to problem z dyskowym We / Wy, naprawdę powinieneś zmierzyć z Dom0, aby uzyskać obraz wszystkiego, co się dzieje.

Jakiś czas temu miałem bardzo podobny problem i okazało się, że jest to problem ze sterownikiem dysku. Bardzo wolny dostęp do dysku powodował wąskie gardło systemu podczas oczekiwania na IO dysku (co pokazało się jako bardzo wysokie średnie obciążenia i czasy oczekiwania, ale także powodowało, że procesy czekające na dysk zużywały więcej procesora niż w innym przypadku. Okazało się, że jądro nie rozpoznawał poprawnie kontrolera i wracał do oldschoolowego kontrolera IDE zamiast szybkiego sata.

Rozwiązaniem było uruchomienie z

hda=noprobe hda=none 

na końcu łańcucha jądra w /etc/grub.conf. (Oczywiście dodaj wszystkie posiadane dyski, ala: hdc=noprobe, hdc=none, hdd=...)

Jed Daniels
źródło
Dzięki, ale okazuje się, że w tym przypadku było to o wiele głupsze. Głosuj mimo to.
ehsanul