Domanda

Puoi calcolare le missioni della cache come descritto qui .
Tuttavia, sono interessato a come ridurre al minimo il fenomeno in PostgreSQL 9.4.3 su X86_64-Unknown-Linux-GNU, compilato da GCC (Debian 4.9.2-10) 4.9.2, 64-bit. Ho alcuni algoritmi basati su tavoli hash, che causano molta cache manca con accesso casuale. Sono interessato a come puoi minimizzare le missioni della cache in PostgreSQL.

Come puoi minimizzare la cache Mancas in PostgreSQL in Design?

È stato utile?

Soluzione

Mantenere le cose nella cache con PostgreSQL è un equilibrio tra ciò che puoi avere in shared_buffers e ciò che hai nella cache del filesystem ed evitando entrambi spinti da altri processi.

Una delle prime cose che puoi fare su PostgreSQL 9.4 è impostato huge_pages=on nel postgresql.conf.

Ciò comporta anche fare qualche modifica del sistema operativo per consentire a PostgreSQL di iniziare con questo abilitato. La variabile sysctl appropriata è vm.nr_hugepages

È possibile eseguire un calcolo rapido e sporco di ciò che dovresti impostare vm.nr_hugepages con il seguente bit di scripting shell.

echo $(grep ^VmPeak /proc/$(cat /var/run/postgresql/9.4-main.pid)/status | sed -e 's/VmPeak://' | sed -e 's/kB//' | sed -e 's/[ \t]//g')/$(grep Hugepagesize /proc/meminfo | sed -e 's/Hugepagesize://' | sed -e 's/kB//' | sed -e 's/[ \t]//g') | bc -l | awk '{print int($1+1)}'

Questa linea prende il VMPeak dal processo di postgresql in esecuzione in /proc/$pid/status, che ti dice la dimensione della memoria virtuale di picco per il processo postgresql. Questo numero è in KB. Pulisce la spaziatura e l'output extra, quindi ottiene la misurazione del Hugepagesize da /proc/memstat (che nel mio caso era 2048 Kb), quindi la divisione appropriata, completa l'uscita al numero intero più vicino, quindi aggiunge uno per un margine di sicurezza. < / P >.

Nel mio caso, era 2147.

Rendilo permanente facendo quanto segue:

echo "vm.nr_hugepages=2147" >>/etc/sysctl.d/postgresql.conf

Questo è importante per i seguenti motivi, estratti dalla documentazione:

.

/ proc / sys / Vm / nr_hugepages indica il numero corrente di "persistente" enorme Pagine nel pool di pagine enorme del kernel. Le pagine enormi "persistenti" saranno restituito al grande pool di pagine quando viene liberato da un compito. Un utente con radice I privilegi possono assegnare dinamicamente più o gratuitamente alcune pagine enormi persistenti Aumentando o diminuendo il valore delle "nr_hugepages".

Le pagine che vengono utilizzate come pagine enormi sono riservate all'interno del kernel e non possono essere usato per altri scopi. Le pagine enormi non possono essere scambiate sotto pressione di memoria

Quindi, le pagine afferrate dal processo di postgres per Shared_Buffers non saranno scambiate sotto pressione della memoria. E avrai meno stress sul TLB anche per il tuo processore.

Seguendolo, regoliamo l'Oomkiller, perché qualcosa che uccide a caso i processi di postgres non è un buon cittadino. Queste impostazioni lo incoraggiano fortemente a non sparare.

echo "vm.overcommit_memory=2" >>/etc/sysctl.d/postgresql.conf

echo "vm.overcommit_ratio=100" >>/etc/sysctl.d/postgresql.conf

Avanti Impostiamo un paio di sysctl di scheduler del kernel:

echo "kernel.sched_autogroup_enabled=0" >>/etc/sysctl.d/postgresql.conf

echo "kernel.sched_migration_cost=5000000" >>/etc/sysctl.d/postgresql.conf

Il costo della migrazione è il tempo totale che lo scheduler considererà un processo migrato "cache hot" e quindi meno probabile che venga nuovamente rimmigrato.

Autogruppo AutoGroup abilitato in pratica gruppi Attività di Setsid () La reattività percepita è migliorata. Ma sui sistemi server, i grandi demoni come PostgreSQL saranno lanciati dallo stesso Setsid () ed essere efficacemente soffocato dai cicli della CPU a favore di compiti meno importanti.

Successivamente, possiamo regolare la swappiness, che è una manopola che controlla il grado in cui un sistema swap processa dalla memoria fisica. Un numero più alto si sposta in modo più aggressivo e un numero inferiore mantiene le cose nella cache del filesystem più a lungo. L'impostazione di questo a zero aumenterà la possibilità di uccidere oom in memoria e la pressione I / O.

echo "vm.swappiness=10" >>/etc/sysctl.d/postgresql.conf

Questi controlli Quante volte i dati sporchi vengono sincronizzati su disco dalla cache del filesystem. Poiché gli oggetti sporchi nel PageCache non possono essere liberati, la scrittura più aggressiva è possibile mantenere più pagine disponibili per l'uso e aiuta a evitare grandi raffiche di disco IO.

echo "vm.dirty_ratio=2" >>/etc/sysctl.d/postgresql.conf

echo "vm.dirty_background_ratio=1" >>/etc/sysctl.d/postgresql.conf

Dal momento che la tua versione postgresql mostra GCC 4.9, sto assumendo che stai eseguendo Debian Jessie o un derivato, quindi il kernel 3.16 eviterà alcuni problemi I / O davvero terribili che il 3,2 kernel aveva, quindi è certamente sicuramente Buone notizie

Dopo aver regolato tutte queste impostazioni, riavviare il sistema. Ciò contribuirà a garantire che le tappe ormei non siano frammentate durante l'assegnazione. Il modo migliore e più affidabile però è quello di mettere hugepages=2147 (il numero di cui avevo bisogno sul mio server), in /etc/default/grub in GRUB_CMDLINE_LINUX, ed eseguire update-grub, quindi riavviare. Ma mirerei la necessità di questo, poiché è molto più difficile cambiare rispetto al SYSCTL.

Questi dovrebbero darti una ragionevole quantità di pagine nella cache del filesystem e in shared_buffers. Dopo questo, assicurandosi che il minor numero di processi sia in esecuzione sul tuo server (perché tutti gareggiano per le risorse), dovrebbero darti gran parte della cache della pagina Miss minimizzazione che stai cercando.

Ulteriori letture su pagine enormi e i loro effetti sono in Documentazione Hughetlbpage .

Le impostazioni VM e i loro effetti sono in Documentazione VM .

Questo è un trattamento molto accessibile del sistema di memoria Linux

zione "rel=" nofollow "> Comprensione e ottimizzazione dell'utilizzo della memoria

La documentazione PostgreSQL entra in dettaglio sugli effetti delle pagine enormi nella parte inferiore del Pagina delle risorse del kernel

Spero che ti aiuti.=)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top