Wie soll ich Postgresql auf 20 GB RAM einstellen?

7

Ich hatte das Glück, eine 20-GB-Linode-Instanz mit Ubuntu 64-Bit zu verwenden. Ich möchte versuchen, PostGres für diesen Dienst zu optimieren, weiß aber nicht, welche Prioritäten ich beim Ändern setzen soll.

Ich habe mehrere Datensätze mit ungefähr 20.000 Zeilen und die Berechnungen, die durchgeführt werden, sind speicherintensive Abfragen (räumliche Analysen), wobei nach jeder Anforderung eine kleine Anzahl von Zeilen geschrieben wird. Die Gesamtzahl der Benutzer ist sehr gering (10 - 50).

Ich habe diesen Artikel auf der Postgresql-Website gelesen, weiß aber nicht genug darüber, wie dies funktioniert, um zu wissen, was ich priorisieren sollte. Ich habe mir auch Ratschläge angesehen, was hier für Geo-Arbeiten geändert werden soll.

Zum Beispiel habe ich versucht, das shared_bufferszu ändern 200MB(was viel weniger als 75% von 20 GB ist). Dies führte zu der folgenden Fehlermeldung:

  • Neustart des PostgreSQL 9.1-Datenbankservers
    • Der PostgreSQL-Server konnte nicht gestartet werden. Bitte überprüfen Sie die Protokollausgabe: 2013-03-10 12:21:58 EDT FATAL: Shared Memory-Segment konnte nicht erstellt werden: Ungültiges Argument 2013-03-10 12:21:58 EDT DETAIL: Fehlgeschlagener Systemaufruf war shmget (key = 5432001 , Größe = 47742976, 03600). 2013-03-10 12:21:58 EDT-HINWEIS: Dieser Fehler bedeutet normalerweise, dass die Anforderung von PostgreSQL für ein gemeinsam genutztes Speichersegment den SHMMAX-Parameter Ihres Kernels überschritten hat. Sie können entweder die Anforderungsgröße reduzieren oder den Kernel mit größerem SHMMAX neu konfigurieren. Um die Anforderungsgröße (derzeit 47742976 Byte) zu verringern, reduzieren Sie die Nutzung des gemeinsam genutzten Speichers von PostgreSQL, möglicherweise durch Reduzierung von shared_buffers oder max_connections. Wenn die Anforderungsgröße bereits klein ist, ist sie möglicherweise kleiner als der SHMMIN-Parameter Ihres Kernels. In diesem Fall ist es erforderlich, die Anforderungsgröße zu erhöhen oder SHMMIN neu zu konfigurieren. Die PostgreSQL-Dokumentation enthält weitere Informationen zur Konfiguration des gemeinsam genutzten Speichers.

Ich habe dies auf den ursprünglichen Wert zurückgesetzt und versucht, Folgendes zu ändern:

work_mem = 50MB
maintenance_work_mem = 256MB 

Mein Problem ist, dass ich nicht weiß, welche Werte ich ändern soll oder wie ich priorisieren soll, welche Werte der Schlüssel zum Experimentieren und Testen sind. Was muss ich konkret tun, um diese Datenbank zu optimieren?


quelle
In den meisten Fällen reicht es aus, effektive_Cache-Größe auf 20 GB und gemeinsam genutzte Puffer auf xx MB festzulegen.
Die Fehlermeldung, die Sie vollständig angegeben haben (danke), bezieht sich auf die Betriebssystemeinstellungen, die Sie ändern müssen, um sie zu erhöhen shared_buffers. Siehe postgresql.org/docs/current/static/runtime-config-resource.html , postgresql.org/docs/current/static/…
Craig Ringer
Um herauszufinden, was Sie tun müssen, hängt dies von allen möglichen Faktoren ab. Ihre Arbeitsbelastung - schwer lesen oder schreiben? Viele kleine oder weniger große Anfragen? Kundenanzahl? Verbindungspooling verwenden? Viele kurze oder weniger längere Transaktionen? Wie groß ist die Datenbank auf der Festplatte und wie viel davon ist "heiß", dh aktiv und regelmäßig abgefragt? Wie ist die Leistung des zugehörigen Speichersystems?
Craig Ringer
@CraigRinger Ich erwähne einige dieser Maßnahmen in der Frage - ich bin nicht sehr vertraut mit dem Messen oder Kategorisieren von Client-Pooling. Was meinen Sie mit dem zugehörigen Speichersystem?

Antworten:

14

Ich würde die Verwendung pgtunevon Greg Smith empfehlen .

Führen Sie es einfach wie folgt auf Ihrem Server aus:

pgtune -i postgresql.conf -o postgresql-tuned.conf

Es gibt nur wenige weitere Optionen, aber nur das zu tun und generierte zu verwenden, postgresql.confwird Wunder für Ihre Serverleistung bewirken.

Ich denke, PostgreSQL sollte dies in die Standardinstallation aufnehmen und sogar standardmäßig ausführen - so dass sich die Leute nicht über schlechte PostgreSQL-Leistung beschweren können.

mvp
quelle
2
Fantastisch! Genau das brauche ich. Ich war über einige Einstellungen gestolpert, war aber nicht mit allen Dingen vertraut, die ich ändern sollte.
2
+1 Nützliches Werkzeug. Wurde seit Postgres 8.4 nicht viel aktualisiert. Funktioniert aber meistens noch für die neueste Version 9.2.
Erwin Brandstetter
Nachdem ich das SHMMAXProblem behoben hatte (Lösung hier: askubuntu.com/questions/44373/… ), pgtunefunktionierte es wie ein Zauber.
Äh, ich habe nicht bemerkt, dass Sie ein Shmmax-Problem haben, bis ich Ihre Frage noch einmal gelesen habe! Natürlich müssen Sie sysctl.conf optimieren. Übrigens, in PostgreSQL 9.3 wird dies nicht notwendig sein
mvp
1
@mvp, hier ist ein Tuner, den ich geschrieben habe.
Acumenus
4

Sie müssen die Einstellungen für shmmax, shmall, msgmax und msgmnb auf Ihrem Server erhöhen. PGTUNE sollte, wie in der anderen Antwort erwähnt, Ihnen sagen, worauf Sie sie einstellen sollen.

Sie können das so machen:

sysctl -w kernel.shmmax={{value}}
sysctl -w kernel.shmall={{value}}
sysctl -w kernel.msgmax={{value}}
sysctl -w kernel.msgmnb={{value}}

Sie können überprüfen, wie die Werte bereits lauten:

cat /proc/sys/kernel/shmmax
cat /proc/sys/kernel/shmmall
cat /proc/sys/kernel/msgmax
cat /proc/sys/kernel/msgmnb
Chris Aitchison
quelle
1
Zur Vorsicht müssen Benutzer daran denken, immer zuerst den vorhandenen Wert zu überprüfen, bevor sie ihn aktualisieren. Wenn der vorhandene Wert bereits höher ist und möglicherweise auch höher ist, muss er nicht aktualisiert werden.
Acumenus