PostgreSQL pg_stat_activity zeigt COMMIT

11

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_activitywir sehen, dass sich die meisten unserer Verbindungen im COMMITZustand 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 perfzeigt etwas Ähnliches wie unten, und ich habe keine Ahnung, was das 0x347ba9darstellt.

+  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
jcern
quelle
Welche Art von Festplatten hat die neue Box? Geschieht dies auf beiden Knoten oder nur auf einem von ihnen?
Trygve Laugstøl
@trygvis - Ich habe die Frage mit den Festplattenspezifikationen aktualisiert. Das Problem tritt auf dem Master-Knoten auf. Ich habe nicht versucht, den Slave zu bewerben und den Verkehr dorthin zu leiten, daher bin ich mir nicht sicher, ob es unter den gleichen Umständen auch dort ein Problem gibt. Als Slave scheint die Maschine keine Probleme zu haben.
jcern
2
Verwenden Sie das perfTool, um systemweite Profilerstellung und PostgreSQL-Profilerstellung durchzuführen. Sehen Sie, wo die CPU-Auslastung auftritt. Übrigens ist die Formatierung Ihres zweiten vmstathoffnungslos entstellt, und die Spalten des ersten sind falsch ausgerichtet, so dass es schwer zu lesen ist. Testen Sie, ob das Hinzufügen von a commit_delaydie 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 verbracht iowait? Dies scheint in einigen Berichten die CPU-Auslastung zu sein, ist es aber nicht wirklich.
Craig Ringer
@CraigRinger Der Controller verfügt über einen batteriegepufferten Schreibcache, der derzeit aktiviert ist. Warten von iostat blieb im ein- bis niedrigen zweistelligen Bereich. Wir werden weiterhin versuchen, mit perf weitere Profile zu erstellen. Ich habe auch die Formatierung des zweiten VMStat korrigiert. Vielen Dank, dass Sie darauf hingewiesen haben.
jcern

Antworten:

11

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 PagesImplementierung.

Nach dem Deaktivieren Transparent Huge Pagesmit diesem Befehl:

echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled

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.

jcern
quelle