PostgreSQL 9.3: Ridotto il consumo di memoria condivisa

PostgreSQL 9.3 rimuove alla radice una comune fonte di problemi all’avvio del server PostgreSQL: l’impostazione della memoria condivisa di sistema, in gergo “System V Shared Memory”.

I problemi sorgono, come è facile aspettarsi, al momento in cui la memoria condivisa da parte di PosgreSQL per la gestione dei buffer (ricordo essere organizzati in pagine di dati in blocchi da 8kB) supera il valore configurato nel kernel del sistema. È possibile modificare il parametro shared_buffers (ad esempio per impostarlo a 1GB) nel file postgresql.conf.

Fino a PostgreSQL 9.2, la modifica del valore shared_buffers di PostgreSQL doveva avvenire unitamente ad una modifica delle impostazioni di memoria condivisa a livello di sistema. Ad esempio, su sistemi Ubuntu 12.04 il valore impostato è ottenibile tramite:

/~$ cat /proc/sys/kernel/shmmax
 33554432

quindi 32MB. Volendo lavorare con una shared_memory di 128MB utilizzando le attuali versioni di PostgreSQL, occorrerebbe impostare tale valore come limite anche nel kernel. Ad esempio in Ubuntu 12.04 una modifica temporanea può essere apportata con il comando sysctl:

/~$ sudo sysctl -w kern.sysv.shmmax=134217728
kern.sysv.shmmax: 33554432 -> 134217728 
/~$ sudo sysctl -w kern.sysv.shmall=134217728
kern.sysv.shmmax: 2097152 -> 134217728

Generalmente i sistemi operativi lavorano con valori di shared memory molto conservativi (32MB nell’esempio visto sopra). Tuttavia, generalmente valori operativi consigliati in PostgreSQL per l’uso della memoria condivisa si attestano sul 20%-25% della RAM disponibile. Per macchine con ad esempio 64GB di RAM, è necessario modificare la shared memory di sistema a valori così elevati. PostgreSQL 9.3 risolve il problema riducendo il consumo di memoria shared tramite l’impiego di mmap.

Nota mmap è un comando di sistema Unix che si preoccupa di mappare file o dispositivi in memoria. munmap è invece il comando che deve essere chiamato una volta che la memoria non viene più usata prima di deallocare i puntatori che puntano ad essa.

In questo modo è possibile lavorare con valori di shared_buffers impostati in postgresql.conf superiori alla memoria shared impostata nel sistema. Ad esempio il valore di shared_buffers impostato di default in PostgreSQL 9.3 è pari a 128MB.

Avviando il server PostgreSQL, è possibile osservare la gestione della memoria da parte del sistema con il comando:

ps -u 1000 f u

Il risultato ottenibile è qualcosa di simile al seguente:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
1000      3979  0.0  0.1 170836 12828 pts/2    S    16:02   0:00 /home/gbroccolo/pgsql/master/DemoInstall/bin/postgres
1000      3981  0.0  0.0 170836   976 ?        Ss   16:02   0:00  \_ postgres: checkpointer process
1000      3982  0.0  0.0 170836  1764 ?        Ss   16:02   0:00  \_ postgres: writer process
1000      3983  0.0  0.0 170836   972 ?        Ss   16:02   0:00  \_ postgres: wal writer process
1000      3984  0.0  0.0 171588  2292 ?        Ss   16:02   0:00  \_ postgres: autovacuum launcher process
1000      3985  0.0  0.0  26456  1020 ?        Ss   16:02   0:00  \_ postgres: stats collector process

PostgreSQL 9.3 riesce quindi a gestire uno spazio di memoria condivisa più che compatibile con i 128MB richiesti, senza richiedere di agire sulle risorse fornite dal kernel e riducendo la complessità in fase di installazione e configurazione.

This Post Has 0 Comments

Leave A Reply