Postgres DISK IO sehr hoch. Was kann ich tun, um es sofort zu reduzieren?

13

Ich bin mir bewusst, dass schnellere Festplatten als die von mir verwendeten helfen, aber das Einsetzen dauert länger und ich versuche, einige Notfallmaßnahmen zu ergreifen, um die Festplatten-E / A zu verringern. atop meldet die DSK-Nutzung fast ständig im roten Bereich. Dies ist für Postgres 8.3.

Meine Einstellung für shared_buffers liegt bei 24 MB, obwohl der Server über 16 GB RAM verfügt, die nicht voll ausgelastet sind. Mein erster Gedanke war, der Datenbank so viel RAM wie möglich zu geben, aber ich bin mir nicht sicher, wie ich das machen soll (dies ist ein dedizierter Datenbankserver).

Jede Lösung, die keinen Neustart erfordert, ist vorzuziehen, aber ich nehme an, was ich an dieser Stelle bekommen kann.

Vielen Dank!

Harel
quelle
Diese Frage sollte bei Serverfault
Francisco R am
Sie können versuchen, shared_buffersdie Konfigurationsdatei postgresql.conf zu vergrößern . Diese Änderung erfordert einen Neustart. Möglicherweise müssen Sie auch den Wert /proc/sys/kernel/shmmaxdavor erhöhen .
Khaled

Antworten:

12

Die Einstellung "shared_buffers" von 24 MB ist die konservative Standardeinstellung. Ich würde sagen, dass sie für eine dedizierte Datenbank mit 16 GB verfügbarem RAM erheblich höher sein muss. Aber ja, Sie müssen den Server neu starten, um die Größe zu ändern. http://wiki.postgresql.org/wiki/Performance_Optimization ist ein guter Ausgangspunkt für Richtlinien zur Leistungskonfiguration. Sinnvoller erscheint es, die shared_buffers auf 4GB oder 6GB zu setzen.

Beachten Sie, dass Sie unter Linux die Einstellung kernel.shmmax sysctl anpassen müssen (in /etc/sysctl.conf oder indem Sie einfach / proc / sys / kernel / shmmax schreiben), um einen Block dieses viel gemeinsam genutzten Speichers zuzuweisen. Wenn Sie keinen Fehler erhalten, der angibt, wie viel angefordert wurde, müssen Sie kernel.shmmax höher einstellen.

Da Sie über viel Arbeitsspeicher verfügen, sollten Sie auch in Betracht ziehen, den Standardwert für work_mem höher festzulegen, damit Sortierungen und Hashes (group / order / distinct usw.) eher im Arbeitsspeicher als in temporären Dateien ausgeführt werden. Dazu muss der Server nicht neu gestartet werden. Aktualisieren Sie einfach die Konfigurationsdatei, laden Sie den Dienst neu, und neue Sitzungen erhalten die neue Einstellung. Der Standardarbeitsspeicher für eine Sitzung ist 1 MB. Sie können das Maximum berechnen, das gleichzeitig verwendet werden darf, work_mem * max_client_connectionsund die Auswirkungen abschätzen.

Sie sollten außerdem effective_cache_size erhöhen, um dem Planer anzuzeigen, dass der Kernel-FS-Layer wahrscheinlich viele Seiten im Speicher außerhalb der gemeinsam genutzten Puffer von postgresql zwischenspeichert.

usw. usw. Ich hoffe, das bringt Sie zu einem guten Start.

araqnid
quelle
Guter Beitrag, nur Ihre Speicherverbrauchsschätzung ist ein bisschen gefährlich. work_mem ist ein Maximum pro Sortier- / Hash-Operation, sodass komplexe Abfragen mehrere Sortier- / Hash-Operationen haben und daher viel mehr als ein work_mem verwenden können.
Eelke
Danke, es hat sehr geholfen! Eine weitere bedeutende Änderung waren checkpoint_segment und checkpoint_completion_target, die einen großen Einfluss auf meine Datenträgernutzung und die Gesamtleistung hatten. Krise abgewendet. ( wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server )
Harel
3

Hängen Sie die Festplatten mit noatime wieder ein

jamespo
quelle
2

Abgesehen von den hier gegebenen Vorschlägen möchten Sie möglicherweise auch Ihre Einstellungen für die automatische Vakuumpumpe überprüfen. Standardmäßig wird es nach ungefähr 50 Aktualisierungen ausgelöst, und wenn Ihre Datenbank viele Aktualisierungen / Einfügungen ausführt, kann dies eine unnötige Anzahl von Vakuumanweisungen auslösen, die viele E / A-Vorgänge verursachen.

jishi
quelle
1

Auf einem System, das während des normalen Betriebs dem maximalen E / A-Durchsatz sehr nahe kommt, empfiehlt es sich, checkpoint_completion_target zu erhöhen, um die E / A-Belastung von Prüfpunkten zu verringern . Dies hat den Nachteil, dass sich das Verlängern der Checkpoints auf die Wiederherstellungszeit auswirkt, da für eine mögliche Verwendung bei der Wiederherstellung mehr WAL-Segmente in der Nähe aufbewahrt werden müssen

Sehen Sie hier mehr .

Christian
quelle
0

Wenn die diskio von postgresql sehr hoch ist, sollten Sie die ausgeführten Anweisungen überprüfen, insbesondere auf Anweisungen, die eine "Sortierung auf der Festplatte" durchführen, und die richtigen Indizes festlegen.

Suchen Sie einfach bei Google nach "Postgresql Performance Tuning" (Leistungsoptimierung für Postgresql).

Thomas Berger
quelle