Extrem langsame E / A mit einfachen PostgreSQL 8.4.4-Abfragen unter Centos 5.5

10

Das seltsame und extrem langsame E / A-Muster, das ich sehe, ist folgendes (Ausgabe von 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

Ich weiß nicht, warum die Festplattenauslastung und das Warten so hoch sind und die Lese- / Schreibraten so niedrig sind. Was könnte der Grund dafür sein?

Die abgefragte Tabelle enthält lediglich mehrere varchar-Spalten, von denen eine der Nachname ist, der indiziert ist (tatsächlich lower(last_name)indiziert ist). Die Abfrage selbst ist einfach:

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

Hier ist die Erklärungsausgabe:

                                           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)

Beachten Sie auch, dass sich die Datenbank auf auto_vacuum befindet, sodass kein explizites Vakuum / Analysieren durchgeführt wurde.

ehsanul
quelle
Haben Sie Ihre postgresql.conf angepasst? Wenn CentOS die gleichen Standardeinstellungen wie RHEL 5.x hat, haben Sie wenig Speicher für Postgres, was eine Menge Festplatten-E / A erzwingen könnte. Wie groß sind die Zeilen in dieser Tabelle?
Thiago Figueiro
Die Tabelle passt in den Speicher, ebenso wie der Index. es wurde auf diese Weise aufgeteilt. Und postgresql.conf wurde entsprechend angepasst (shared_buffers, effektive_cache_size usw.). Selbst wenn dies nicht der Fall wäre, würde ich eine derart entartete Leistung nicht erwarten.
ehsanul

Antworten:

5

Die Tatsache, dass Ihr Gerät /dev/xvdb1funktioniert, bedeutet, dass Sie unter Xen ausgeführt werden. Wie ist Ihr Speicher konfiguriert? Gibt es Konkurrenzsituation für das zugrunde liegende Gerät, und wie funktioniert iostatBlick auf das ?

Wenn Sie das nicht so wahrscheinlich beseitigen können, werde ich hier auf den wirbelnden Spinner mit der Schuld an schlechter Leistung hinweisen.

Grundsätzlich besteht der allgemeine Ansatz zum Entwirren eines solchen Leistungsproblems darin, über alle Ebenen nachzudenken, auf denen ein Engpass auftreten könnte, und dann Tests zu entwickeln, um jedes einzelne zu beseitigen, bis Sie das Problem eingrenzen.

mattdm
quelle
Kein Streit. Obwohl Sie Recht haben, dass dies ein virtueller Server ist, wurde die Festplatte vollständig für diesen Server reserviert, und ich führe jeweils nur eine Datenbankabfrage ohne andere intensive Serveroperationen aus. Der Speicher ist nur eine einzelne sich drehende SATA-Festplatte. Beachten Sie, dass ich einige andere (separate) Server / Datenbanken mit fast demselben Setup habe, die jedoch bei ähnlichen Abfragen / Indizierungen erwartungsgemäß schnell mit niedrigen E / A-Vorgängen arbeiten.
ehsanul
Können Sie iostatvon dom0 aus auf der Festplatte laufen, um zu sehen, ob das Bild ähnlich ist? Können Sie einige andere grundlegende Festplatten-Benchmarks auf beiden Ebenen durchführen? Das wird zumindest helfen, einzugrenzen, wo man als nächstes suchen muss.
Mattdm
Sicher. Warum erwarten Sie eine Diskrepanz basierend darauf, woher sie ausgeführt iostatwird? Sollte es was ausmachen? Ich habe derzeit keinen direkten Zugriff auf dom0, obwohl ich es bekommen könnte. Ich werde fioin der Zwischenzeit versuchen, ein Benchmarking durchzuführen.
ehsanul
3
Zum einen: Schnappschüsse können eine solche Situation schaffen
Hubert Kario
3
Sie hatten Recht, Mattdm, es gab Streit, der auf dom0 auftauchte. Es war ein Kommunikationsproblem, mein Chef hatte ohne mein Wissen einen Teil der Festplatte einem anderen Server unter der Leitung eines anderen übergeben. Ich hatte den Eindruck, dass es gewidmet war, denn so haben wir es immer eingerichtet. Ich denke, deshalb ist es immer wichtig, Ihre Annahmen zu überprüfen. Vielen Dank!
ehsanul
1

Hier sind einige Vorschläge in mehr oder weniger zufälliger Reihenfolge:

  1. Autovacum ist in CentOS nicht standardmäßig aktiviert. Es gibt mehrere Einstellungen, die Sie vornehmen müssen, um es zu aktivieren. Überprüfen Sie noch einmal, ob der Vakuumprozess tatsächlich ausgeführt wird. Es ist leicht, eine der erforderlichen Einstellungen zu übersehen.

  2. Beachten Sie, dass Sie für diese Abfrage einen zweiten Filterschritt ausführen müssen, der je nach dem, was Sie zurückerhalten, teuer sein kann. Ich würde einen Index in Betracht ziehen wie:

    CREATE INDEX consumer_m_lower_last ON consumer_m (niedriger (Nachname));

    Welches wird mit Ihrer Anfrage übereinstimmen und entfernen Sie die erneute Überprüfung.

  3. Wie mattdm betont, können Sie iostat in virtualisierten Umgebungen nicht vertrauen.

  4. Sie sollten wahrscheinlich http://lonesysadmin.net/2008/02/21/elevatornoop/ überprüfen, wenn Sie E / A-Probleme in einer XEN-Umgebung haben. Aufzugseinstellungen können sich auswirken, sind aber nicht so groß.

  5. Verwendet die zugrunde liegende Festplatte LVM-Snapshots? Dies ist zwar aus Managementsicht sehr nützlich, kann jedoch die E / A-Leistung beeinträchtigen. Dies gilt sowohl, wenn das von Ihnen verwendete Blockgerät ein Snapshot ist, als auch wenn ein Snapshot des Blockgeräts erstellt wurde.

pehrs
quelle
Danke für die Vorschläge. Der Index ist tatsächlich niedriger (Nachname), obwohl ich "niedriger" aus dem Namen des Index weggelassen habe. Ich weiß also nicht, warum dort eine erneute Überprüfung stattfindet. Die auf der Festplatte gemountete Festplatte /verwendet tatsächlich LVM-Snapshots, jedoch nicht die, auf der die Datenbank gespeichert ist. Ich denke also nicht, dass es das ist. Ich werde mich jedoch mit Ihren anderen Vorschlägen befassen!
ehsanul
1

Ich bezweifle, dass dies ein Problem mit PostgreSQL ist und eher nur ein Problem mit Disk IO. Wie in den Kommentaren einer anderen Antwort erwähnt, sollten Sie bei einem Festplatten-E / A-Problem wirklich von Dom0 aus messen, damit Sie ein Bild von allem erhalten, was gerade passiert.

Ich hatte vor einiger Zeit ein sehr ähnliches Problem und es stellte sich heraus, dass es ein Problem mit dem Festplattencontroller war. Ein sehr langsamer Festplattenzugriff führte zu einem Engpass im System, während auf Festplatten-E / A gewartet wurde (was sich in sehr hohen Lastdurchschnitten und Wartezeiten äußerte, aber auch dazu, dass Prozesse, die darauf warteten, dass die Festplatte mehr CPU verbrauchte als sonst. Es stellte sich heraus, dass der Kernel erkannte den Controller nicht richtig und fiel auf den IDE-Controller der alten Schule zurück, anstatt auf einen schnellen SATA-Controller.

Das Update war zu booten

hda=noprobe hda=none 

am Ende der Kernel-Zeichenfolge in /etc/grub.conf. (Fügen Sie natürlich alle Festplatten hinzu, die Sie haben, ala: hdc=noprobe, hdc=none, hdd=...)

Jed Daniels
quelle
Danke, aber es stellte sich heraus, dass es in diesem Fall viel dümmer war. Stimmen Sie trotzdem ab.
ehsanul