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.
performance
postgresql
hard-drive
iostat
ehsanul
quelle
quelle
Antworten:
Die Tatsache, dass Ihr Gerät
/dev/xvdb1
funktioniert, 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 funktioniertiostat
Blick 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.
quelle
iostat
von 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.iostat
wird? Sollte es was ausmachen? Ich habe derzeit keinen direkten Zugriff auf dom0, obwohl ich es bekommen könnte. Ich werdefio
in der Zwischenzeit versuchen, ein Benchmarking durchzuführen.Hier sind einige Vorschläge in mehr oder weniger zufälliger Reihenfolge:
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.
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.
Wie mattdm betont, können Sie iostat in virtualisierten Umgebungen nicht vertrauen.
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ß.
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.
quelle
/
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!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
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=
...)quelle