Wir haben kürzlich unseren Datenbankserver durch einen aktualisierten Computer mit 4 Quad-Core-CPUs und 32 GB RAM ersetzt. Wir haben auch unsere alte Box neu verwendet, um als Slave mit Streaming-Replikation zu dienen. Auf beiden Boxen laufen CentOS 6.3 und PostgreSQL 9.2. Postgres ist das einzige, was auf jeder der Boxen läuft.
Diese Konfiguration ist seit ungefähr einem Monat vorhanden, als wir plötzlich auf einige Probleme stießen, als der Verkehr anstieg. Was wir zu sehen begonnen haben, ist manchmal eine extrem hohe CPU-Auslastung (oben zeigt einen Auslastungsdurchschnitt von 270), und wenn wir uns das ansehen können, werden pg_stat_activity
wir sehen, dass sich die meisten unserer Verbindungen im COMMIT
Zustand befinden. Wenn es alleine gelassen wird, wird dies irgendwann beendet und das System reagiert mit den Verbindungen, die werden IDLE
. Wir haben versucht, die Replikation zu deaktivieren, um festzustellen, ob dies das Problem sein könnte, aber das Problem besteht weiterhin.
Wir haben versucht zu diagnostizieren, was passiert, und sind ein bisschen verloren. Die Ausgabe von running perf
zeigt etwas Ähnliches wie unten, und ich habe keine Ahnung, was das 0x347ba9
darstellt.
+ 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
Keine der von der App ausgeführten Abfragen ist besonders komplex. Erklärungspläne dauern höchstens 1 Sekunde (die meisten sind viel schneller). Während dies passiert, wenn der Verkehr zu steigen beginnt, sprechen wir nicht über eine große Verkehrslast (die alte Maschine war früher in der Lage, dies ziemlich einfach zu handhaben).
An diesem Punkt bin ich etwas ratlos darüber, was ich als nächstes versuchen soll. Jede Hilfe oder Anregungen wäre dankbar. Wenn es zusätzliche Informationen gibt, die helfen könnten, fragen Sie einfach und ich kann die Frage ändern.
Festplattenkonfiguration:
- Perc 6i RAID Controller
- 5 x 146 GB 15K SAS-Laufwerke
- Konfiguriert als 2x146 GB RAID-1 für WAL und 3x146 GB RAID-5 für System und Daten
Aktualisieren:
Unten sehen Sie die VMStat-Ausgabe, wenn das System normal funktioniert und die CPU hochfährt. Wenn es ein Problem gibt, scheinen die Interrupts in die Höhe zu schnellen.
Während des normalen Betriebs:
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
Wenn die CPU-Auslastung hoch ist:
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
quelle
perf
Tool, um systemweite Profilerstellung und PostgreSQL-Profilerstellung durchzuführen. Sehen Sie, wo die CPU-Auslastung auftritt. Übrigens ist die Formatierung Ihres zweitenvmstat
hoffnungslos entstellt, und die Spalten des ersten sind falsch ausgerichtet, so dass es schwer zu lesen ist. Testen Sie, ob das Hinzufügen von acommit_delay
die Dinge verbessert. Überprüfen Sie, ob Ihr RAID-Controller über einen batteriegepufferten Rückschreibcache verfügt, und besorgen Sie sich einen, falls dies nicht der Fall ist. Wird viel Zeit in verbrachtiowait
? Dies scheint in einigen Berichten die CPU-Auslastung zu sein, ist es aber nicht wirklich.Antworten:
Nach weiteren Diagnosen und etwas Googeln stießen wir auf diesen Artikel , in dem viele der gleichen Symptome beschrieben wurden, die wir hatten. Die Hauptursache für ihr Problem (und nach allem, was wir sagen können, auch für unser Problem) war die
Transparent Huge Pages
Implementierung.Nach dem Deaktivieren
Transparent Huge Pages
mit diesem Befehl:Das Problem scheint behoben worden zu sein. Wir haben in den letzten zwei Wochen eine erhöhte Arbeitsbelastung und das Problem ist nicht erneut aufgetreten. Die Kontexte und Interrupts des Systems sind durchweg 1/10 dessen, was sie waren, und die durchschnittliche Systemzeit hat sich ebenfalls verringert.
Ich bin mir nicht sicher, ob es die Lösung für alle ist, aber ich poste es hier als mögliche Ursache, falls es anderen helfen kann, ein ähnliches Problem zu lösen.
quelle