Freitag, 1. August 2014

PostgreSQL unter Ubuntu optimal einstellen, insbesondere für einen performante odoo/OpenERP Server

Der PostgreSQL Server ist in der Grundinstallation sehr minimalistisch eingestellt, damit er überall passt. In diesem Beitrag beschreibe ich die Vorgehensweise für eine optimale Konfiguration.

Mein Referenzsystem ist dabei Ubuntu 12 LTS 64 Bit mit einem PostgreSQL 9.1. Jedoch kann man die Vorgehensweise auch auf andere Systeme anwenden.

Zunächst müssen wir ein neues Paket installieren:
$ sudo apt-get update
$ sudo apt-get install pgtune
PGTune von Gregory Smith ermittelt später die optimale Einstellung für unseren PostgreSQL basierend auf unseren Systemdaten.

Jetzt müssen wir die Speichereinstellungen vornehmen, da PostgreSQL bis 9.3 "SysV shared memory" verwendet. Ab 9.3 wird "Posix shared memory and mmap" für die Speicherverwaltung benutzt.

Hierzu Dank an Alexey Vasiliew und seinem Blog-Eintrag. Versucht man nämlich den Speicher in der "postgresql.conf" zu erhöhen, kommt mitunter folgende Meldung:
This error usually means that PostgreSQL's request for a shared memory
segment exceeded your kernel's SHMMAX parameter. You can either
reduce the request size or reconfigure the kernel with larger SHMMAX.
To reduce the request size (currently 4011376640 bytes), reduce
PostgreSQL's shared_buffers parameter (currently 50000) and/or
its max_connections parameter (currently 12).
Deshalb muss man die Speichergrenzen erhöhen. Dazu gehen wir wie folgt vor:
$ sudo su
Damit wechselt man unter Ubuntu in den root-User Modus:
$ nano shmsetup
Hier kopiert man folgende Zeilen rein:
#!/bin/bash
# simple shmsetup script
page_size=`getconf PAGE_SIZE`
phys_pages=`getconf _PHYS_PAGES`
shmall=`expr $phys_pages / 2`
shmmax=`expr $shmall \* $page_size`
echo kernel.shmmax = $shmmax
echo kernel.shmall = $shmall
Nach dem Abspeichern muss man die Datei noch ausführbar machen:
$ sudo chmod +x shmsetup
Wenn man die Datei jetzt ausführt
$ sudo ./shmsetup
sollte bei einem 2 GB Server folgende Werte erscheinen:
kernel.shmmax = 1055092736
kernel.shmall = 257591
Diese werden nun im System hinterlegt:
$ sudo ./shmsetup >> /etc/sysctl.conf
mit
$ sudo sysctl -p
kann man es überprüfen. Wie oben genannt, muss man dies bei PostgreSQL 9.3 nicht mehr machen.

PostgreSQL mit pgtune optimieren


Einfach das Programm mit den aufgeführten Parametern aufrufen. Es erstellt dann eine optimierte Einstellung am Ende der Konfiguration. Bei Version 9.3 ist der Pfad abweichend. Meist nur 9.1 zu 9.3 ändern.
$ sudo pgtune -i /etc/postgresql/9.1/main/postgresql.conf -o /etc/postgresql/9.1/main/postgresql.conf.tuned
$ sudo mv /etc/postgresql/9.1/main/postgresql.conf  /etc/postgresql/9.1/main/postgresql.conf.old
$ sudo mv /etc/postgresql/9.1/main/postgresql.conf.tuned  /etc/postgresql/9.1/main/postgresql.conf
Die alte Konfiguration wird umbenannt und die optimierte zur aktuellen.

Bei einem 32 GB Server ermittelt "pgtune" z.B. folgendes:
#------------------------------------------------------------------------------
# CUSTOMIZED OPTIONS
#------------------------------------------------------------------------------

#custom_variable_classes = ''  # list of custom variable class names
default_statistics_target = 50 # pgtune wizard 2014-08-01
maintenance_work_mem = 1GB # pgtune wizard 2014-08-01
constraint_exclusion = on # pgtune wizard 2014-08-01
checkpoint_completion_target = 0.9 # pgtune wizard 2014-08-01
effective_cache_size = 22GB # pgtune wizard 2014-08-01
work_mem = 192MB # pgtune wizard 2014-08-01
wal_buffers = 8MB # pgtune wizard 2014-08-01
checkpoint_segments = 16 # pgtune wizard 2014-08-01
shared_buffers = 7680MB # pgtune wizard 2014-08-01
max_connections = 80 # pgtune wizard 2014-08-0
Hängt natürlich vom System und den Zugriffen ab.

Das wäre es fast schon gewesen:
$ sudo /etc/init.d/postgresql stop
und neu starten:
$ sudo /etc/init.d/postgresql start
Bingo!