Wie man shmall, shmmax, shmmin usw. im Allgemeinen und für postgresql einstellt


11

Ich habe die Dokumentation von PostgreSQL verwendet , um beispielsweise diese Konfiguration festzulegen:

>>> cat /proc/meminfo 
MemTotal:       16345480 kB
MemFree:         1770128 kB
Buffers:          382184 kB
Cached:         10432632 kB
SwapCached:            0 kB
Active:          9228324 kB
Inactive:        4621264 kB
Active(anon):    7019996 kB
Inactive(anon):   548528 kB
Active(file):    2208328 kB
Inactive(file):  4072736 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:              3432 kB
Writeback:             0 kB
AnonPages:       3034588 kB
Mapped:          4243720 kB
Shmem:           4533752 kB
Slab:             481728 kB
SReclaimable:     440712 kB
SUnreclaim:        41016 kB
KernelStack:        1776 kB
PageTables:        39208 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     8172740 kB
Committed_AS:   14935216 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      399340 kB
VmallocChunk:   34359334908 kB
HardwareCorrupted:     0 kB
AnonHugePages:    456704 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       12288 kB
DirectMap2M:    16680960 kB

>>> ipcs -l          

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 4316816
max total shared memory (kbytes) = 4316816
min seg size (bytes) = 1

------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767

------ Messages Limits --------
max queues system wide = 31918
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384

sysctl.conf-Auszug , berechnet von mir:

kernel.shmall = 1079204
kernel.shmmax = 4420419584

postgresql.conf nicht standardmäßig , von mir berechnet:

max_connections = 60            # (change requires restart)
shared_buffers = 4GB            # min 128kB
work_mem = 4MB              # min 64kB
wal_sync_method = open_sync     # the default is the first option
checkpoint_segments = 16        # in logfile segments, min 1, 16MB each
checkpoint_completion_target = 0.9  # checkpoint target duration, 0.0 - 1.0
effective_cache_size = 6GB

Ist das angemessen? Wenn nicht (oder nicht unbedingt), in welchem ​​Fall wäre es angemessen?

Wir haben mit dieser Konfiguration nette Leistungsverbesserungen festgestellt. Wie würden Sie sie verbessern?

Wie berechnet man die Kernel-Speicherverwaltungsparameter?

Kann jemand erklären, wie man sie wirklich von Grund auf aufbaut?


Das sind viele Fragen, und Sie haben uns nicht gesagt, was Ihr aktuelles Problem ist (falls vorhanden) oder wie Ihr Nutzungsmuster ist. Es könnte sich lohnen, ein Buch über die Leistung von PostgreSQL zu lesen.
Hmallett

Mein Problem ist, dass ich nicht davon überzeugt bin, die richtigen Einstellungen vorgenommen zu haben. Ich denke, Kernel-Speicherverwaltungsoptionen sind nicht PostgreSQL-spezifisch. Ich bin mir auch nicht sicher, ob PostgreSQL der beste Ort ist, um über diese Optionen zu sprechen. Sicher, sie werden in jedem Artikel über die PostgreSQL-Leistung stark erwähnt, aber das sind Linux-Optionen, und ich freue mich darauf, wirklich zu verstehen, wie man sie im Allgemeinen optimiert.
JPI

Antworten:


11

Ich habe dies für eine andere Frage hier beantwortet:

Git kann nicht mit dem Fehler "Nicht genügend Speicher" pushen.

Ich beantworte hier nicht alle Ihre Fragen, sondern die Frage in Ihrem Titel:

Wie man shmall, shmmax, shmmni usw. im Allgemeinen und für postgresql einstellt

Bei einigen Kernel-Distributionen gibt es Einstellungen, die verhindern, dass der Kernel einem einzelnen Prozess maximalen Speicher zuweist:

Kernel-Parameter einstellen

Ändern Sie die /etc/sysctl.confDatei so, dass sie die für Ihr Betriebssystem geeigneten Zeilen enthält:

# Red Hat Enterprise Linux 3.0 and CentOS 3.x 
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmin = 1
kernel.shmseg = 10

# semaphores: 
semmsl, semmns, semopm, semmni kernel.sem = 250 32000 100 128
fs.file-max = 65536

# Red Hat Enterprise Linux 4.0 and CentOS 4.x 
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.shmall = 2097152

Wenn Ihr Prozess die Grenzwerte überschreitet, beendet der Kernel den Prozess, obwohl auf Ihrem System maximaler Speicher verfügbar ist.

Hinweis: Seien Sie vorsichtig mit diesen Einstellungen. Sie möchten die Einstellungen in diesem Beispiel wahrscheinlich nicht verwenden, da ich sie von einem Server in unserer Umgebung abgerufen habe.

Ein paar zusätzliche Anmerkungen zu erwähnen:

Verwenden Sie die folgenden Befehle, um die Kerneleinstellungen mit sysctl zu aktualisieren und zu testen:

Aktuelle Einstellungen auflisten:

sysctl -A | grep shm
sysctl -w kernel.shmmax=<value> to write in sysctl.conf
sysctl -p /etc/sysctl.conf to read/reload the values from sysctl.conf

Deaktivieren Sie sicheres Linux, indem Sie die /etc/selinux/configDatei bearbeiten und sicherstellen, dass das SELINUX-Flag wie folgt gesetzt ist.

SELINUX=disabled

Ist das angemessen? Wenn nicht (oder nicht unbedingt), in welchem ​​Fall wäre es angemessen?

Die Kerneleinstellungen werden in Rechenzentrumsumgebungen normalerweise strenger definiert, wenn ISP-Anbieter nicht möchten, dass ein einzelner Kundenprozess alle Ressourcen auf einem gemeinsam genutzten Server beansprucht.

Normalerweise müssen Sie die Kernel-Speicherparameter nicht festlegen, es sei denn, Sie haben einen Prozess, der vom Kernel aufgrund von Ressourcenmangel beendet wird.

In einigen Fällen kann Postgres bestimmten Seitengrößen auch mehr Mem zuweisen, als im freigegebenen Speicher verfügbar sind:

* The PostgreSQL server failed to start. Please check the log output:
2011-11-04 05:06:26 UTC FATAL: could not create shared memory segment: Invalid
argument
2011-11-04 05:06:26 UTC DETAIL: Failed system call was shmget(key=5432001, size
=161849344, 03600).
2011-11-04 05:06:26 UTC HINT: This error usually means that PostgreSQL’s reques
t 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 161849344 bytes), reduce PostgreSQL’s shared
_buffers parameter (currently 19200) and/or its max_connections parameter (curre
ntly 53).
If the request size is already small, it’s possible that it is less than
your kernel’s SHMMIN parameter, in which case raising the request size or recon
figuring SHMMIN is called for.
The PostgreSQL documentation contains more information about shared memo
ry configuration.
…fail!

Fehler wie im obigen Beispiel können behoben werden, indem Sie die Einstellungen Ihrer Kernelressourcen anpassen. Die empfohlenen Einstellungen und Methoden zum Bestimmen der Ressourceneinstellungen werden hier ausführlich beschrieben:

http://www.postgresql.org/docs/9.1/static/kernel-resources.html

Sie müssen diese Einstellungen jedoch wirklich nicht berühren, es sei denn, Sie stoßen auf Situationen des Ressourcenmangels im Zusammenhang mit dem Postgres-Prozess. Diese Situationen treten meistens in gemeinsam genutzten Umgebungen oder Servern auf, denen nur geringe Ressourcen zugewiesen sind.

Kann jemand erklären, wie man sie wirklich von Grund auf aufbaut?

Was das Postgres-Tuning betrifft, sollten Sie Folgendes lesen:

http://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server


1
"Hinweis: Seien Sie vorsichtig mit diesen Einstellungen. Sie möchten die Einstellungen in diesem Beispiel wahrscheinlich nicht verwenden, da ich sie von einem Server in unserer Umgebung abgerufen habe." Wie soll ich sie für meine Umgebungen berechnen?
jpic

1
Hey jpic, ich habe aktualisiert, um mehr Details zu den Kerneleinstellungen bereitzustellen.
Jason Huntley

2

Oh!! Ich finde hier ein wunderbares Tool, um die Optimus Mem-Konfiguration unseres Postgresql-Servers zu berechnen.

http://pgtune.leopard.in.ua/


Dieses Tool berechnet nicht die Optimus-Konfiguration, sondern bietet Ihnen einen Ausgangspunkt für die Optimierung Ihres Servers, da es Ihnen eine Antwort gibt, die hauptsächlich auf Ihren Hardwareeinstellungen basiert. Datenbankgröße, Anzahl der Abfragen und Größen sind ebenfalls wichtig, um die Konfigurationsparameter zu optimieren.
EAmez

1

Diese Kernelkonfigurationen sind global und nicht prozessspezifisch. Daher sollten Sie sie festlegen sysctl.conf.


Bei der Frage geht es darum, Werte für die Kernel-Shared-Memory-Verwaltungsparameter zu ermitteln, das "Wie", nicht das "Wo" ... Vielen Dank für den Aufwand, der in Ihre Antwort gesteckt wurde.
JPIC

ja. dort wo ist trivial. das wie ist das fleisch davon.
Henley Chiu

0

Nun, es hängt davon ab, was sonst noch auf dem Server ausgeführt wird. Wenn dies ein reiner PostgreSQL-Server ist, ist PostgreSQL der richtige Ort, um nach diesen Einstellungen zu suchen.
Wenn Sie andere Anwendungen / Dienste ausführen, die bestimmte Speicheranforderungen haben, müssen Sie eine optimale Einstellung zwischen diesen verschiedenen Anwendungen finden.

Wenn Sie eine erhöhte Leistung in der Datenbank und keinen Leistungsverlust in anderen Anwendungen feststellen, würde ich mir darüber keine Sorgen machen.

Im Allgemeinen reagieren Datenbanken am empfindlichsten auf Speichereinstellungen, da sie höchstwahrscheinlich auch den Engpass bei der Anwendungsleistung darstellen. Es ist sinnvoll, Ihr System für die Datenbank zu optimieren.


Wie "eine optimale Einstellung zwischen diesen verschiedenen Anwendungen finden"? Ich habe kein Leistungsproblem. Ich suche nach einer kanonischen Methode zum Konfigurieren der Kerneleinstellungen für gemeinsam genutzten Speicher. Wie würde ein echter Profi das tun? Angenommen, jemand verwaltet einen laufenden Server mit einer Handvoll Diensten und bezahlt Sie dafür, nur die Einstellungen für die Speicherverwaltung festzulegen. Was würden Sie tun?
jpic

Es gibt keine goldene Regel, Sie schauen nur, was der Anbieter sagt, und testen es. Wenn mehrere Anwendungen auf demselben Computer ausgeführt werden, versuchen Sie, die speicherintensivste Anwendung zu optimieren, in den meisten Fällen die Datenbank. Aber abgesehen von den Vorschlägen der Anbieter und deren Prüfung gibt es keine einzige richtige Lösung
Sibster

Ich weiß, dass es keine goldene Regel gibt. Ich hoffte, dass das Kopfgeld vielleicht jemanden motivieren würde, der dies tatsächlich vollständig versteht, einige Anweisungen zu schreiben. Aber ich denke, niemand versteht das wirklich vollständig - da niemand eine einfache Erklärung geben kann.
JPIC
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.