2012-08-01 17 views
27

tutto: ecco la mia informazioni di memoria del server con '-m libero'Redis bgsave fallito perché la forcella non può assegnare memoria

   total  used  free  shared buffers  cached 
Mem:   64433  49259  15174   0   3   31 
-/+ buffers/cache:  49224  15209 
Swap:   8197  184  8012 

mia Redis-server ha utilizzato la memoria 46G, non v'è quasi la memoria 15G lasciato libero

Come è noto, il fork è una copia in scrittura, non dovrebbe fallire quando c'è una memoria libera di 15G, che è sufficiente per malloc le strutture del kernel necessarie.

Inoltre, quando redis-server utilizzava memoria 42G, bgsave è ok e la forchetta va bene.

Esiste un parametro vm che posso regolare per rendere il ritorno a forcella riuscito?

Grazie.

+0

Ottieni 'doppio 'più memoria – surfer190

risposta

14

Da proc (5):

/proc/sys/vm/overcommit_memory 
       This file contains the kernel virtual memory accounting mode. Values are: 
       0: heuristic overcommit (this is the default) 
       1: always overcommit, never check 
       2: always check, never overcommit 
       In mode 0, calls of mmap(2) with MAP_NORESERVE set are not checked, and the default check is very weak, leading to the risk of getting a process "OOM-killed". Under Linux 2.4 
       any non-zero value implies mode 1. In mode 2 (available since Linux 2.6), the total virtual address space on the system is limited to (SS + RAM*(r/100)), where SS is the size 
       of the swap space, and RAM is the size of the physical memory, and r is the contents of the file /proc/sys/vm/overcommit_ratio. 
46

Più in particolare, dal Redis FAQ

Redis sfondo schema risparmio si basa sul copy-on-write semantico della forcella nei sistemi operativi moderni: Redis fork (crea un processo figlio) che è una copia esatta del genitore. Il processo figlio esegue il dump del DB su disco e infine esce. In teoria, il bambino dovrebbe usare tanta memoria quanto il genitore è una copia, ma in realtà grazie alla semantica copy-on-write implementata dai più moderni sistemi operativi il processo genitore e figlio condividerà le pagine di memoria comuni. Una pagina verrà duplicata solo quando cambia nel bambino o nel genitore. Dal momento che in teoria tutte le pagine possono cambiare mentre il processo figlio sta salvando, Linux non può dire in anticipo quanta memoria avrà il bambino, quindi se l'impostazione overcommit_memory è impostata su zero il fork fallirà a meno che non ci sia tanto RAM libera quanto necessario per duplicare realmente tutte le pagine di memoria parent, con il risultato che se si dispone di un set di dati Redis di 3 GB e solo 2 GB di memoria libera fallirà.

L'impostazione overcommit_memory su 1 dice a Linux di rilassarsi ed eseguire la forchetta in un modo più ottimistico di allocazione, e questo è proprio quello che si desidera per Redis.

Redis non ha bisogno di tanta memoria quanto il sistema operativo pensa di scrivere sul disco, quindi potrebbe fallire preventivamente il fork.

29

Modifica /etc/sysctl.conf e aggiungere

vm.overcommit_memory=1 

quindi riavviare sysctl da

su FreeBSD: $ sudo /etc/rc.d/sysctl ricaricare

On Linux: $ sudo sysctl -p /etc/sysctl.conf

Problemi correlati