Das Festlegen von shared_buffers in postgresql.conf scheint nicht wirksam zu werden

9

Wir sind auf CentOS Release 6.6, PostgreSQL Version 8.4.20. (Ja, das ist keine blutige Kante.)

In postgresql.confhaben wir:

shared_buffers = 4096MB

Kernel-Shm-Werte sind nett und hoch eingestellt:

[root@green data]# sysctl -a | grep shm
kernel.shmmax = 15922077696
kernel.shmall = 3887226
kernel.shmmni = 4096
kernel.shm_rmid_forced = 0

Wir haben viel Gedächtnis:

[root@green data]# free
             total       used       free     shared    buffers     cached
Mem:      31097812   30474972     622840    2873672    1961088   20565360
-/+ buffers/cache:    7948524   23149288
Swap:      1959920      93852    1866068

Der von shared_buffersgemeldete Wert pg_settingsbeträgt jedoch nur 512 MB, nicht die eingestellten 4 GB postgresql.conf:

postgres=# select name, setting, min_val, max_val, context from  
pg_settings where name='shared_buffers';
      name      | setting | min_val |  max_val   |  context   
----------------+---------+---------+------------+------------
 shared_buffers | 524288  | 16      | 1073741823 | postmaster

Ja, wir haben einen vollständigen Neustart durchgeführt und SHOW config_filebestätigen, dass ich das Recht bearbeitet habe postgresql.conf.

Mein großer Dank geht an alle, die Einblick in dieses Geheimnis geben können.

Tom Swiss
quelle

Antworten:

12

Die kanonische Einheit für shared_buffersist Seiten von 8kB, daher ist der tatsächlich in Bytes zugewiesene Speicher:

524288* 8192= 4294967296oder 4096*1024*1024wie gewünscht.

Sie können auch die Größe des Speichersegments mit überprüfen ipcs -m

Daniel Vérité
quelle
qalc ist ein nettes Werkzeug, um mit diesen Konvertierungen umzugehen. Befehl : qalc 524288*8 kibibytes to mebibytes , Zurück: 524288 * (8 * kibibyte) = 4096 mebibytes
Eduardo Baitello
5

Was @Daniel so genau erklärt hat , wird ziemlich offensichtlich, wenn Sie Ihrer Anfrage die entsprechende Spalte hinzufügen:

SELECT name, setting, unit, min_val, max_val, context
FROM   pg_settings WHERE name = 'shared_buffers';

Oder nur:

SELECT * FROM pg_settings WHERE name = 'shared_buffers';

Beachten Sie die Projektrichtlinien für Ihre Postgres-Version (nicht veraltet und nicht unterstützt).

Erwin Brandstetter
quelle
0

habe das gleiche Problem und als ich die folgende Abfrage ausgeführt habe:

select * from pg_settings 

Ich habe eine Quelldatei erhalten, die auf postgresql.auto.conf verweist. Daher wurde die Datei entfernt, da nur der Wert für shared_buffers in der Datei festgelegt und neu gestartet wurde

select *  from pg_settings where name='shared_buffers';

-[ RECORD 1 ]---+-------------------------------------------------------------
name            | shared_buffers
sourcefile      | /u02/pgsql/data/postgresql.conf
Postgres Hilfe
quelle