Ejecutar Ubuntu en un kernel 2.6.31-302 x86-64. El problema general es que tengo memoria en la categoría 'en caché' que sigue subiendo y no se liberará ni usará incluso cuando nuestra aplicación lo necesite.
Entonces, esto es lo que obtengo del comando 'gratis'. Nada de esto parece fuera de lo común a primera vista.
# free
total used free shared buffers cached
Mem: 7358492 5750320 1608172 0 7848 1443820
-/+ buffers/cache: 4298652 3059840
Swap: 0 0 0
Lo primero que alguien va a decir es "No te preocupes, Linux administra esa memoria automáticamente". Sí, sé cómo se supone que funciona el administrador de memoria; El problema es que no está haciendo lo correcto. El "caché" de 1,4 GB parece estar reservado e inutilizable.
Mi conocimiento de Linux me dice que 3 GB es "gratis"; pero el comportamiento del sistema dice lo contrario. Cuando los 1.6 GB de memoria libre real se usan durante el uso pico, tan pronto como se demanda más memoria (y el 'libre' en la primera columna se acerca a 0) se invoca el asesino OOM, se eliminan los procesos y comienzan a surgir problemas a pesar de que el 'libre' en la fila - / + buffers / cache todavía tiene alrededor de 1.4 GB 'gratis'.
He ajustado los valores de oom_adj en los procesos clave para que no ponga de rodillas al sistema, pero incluso así se eliminarán procesos importantes, y nunca queremos llegar a ese punto. Especialmente cuando, teóricamente, 1.4GB todavía está "libre" si solo desalojara el caché del disco.
¿Alguien tiene alguna idea de lo que está pasando aquí? Internet está inundado de preguntas tontas sobre el comando 'libre' de Linux y "por qué no tengo memoria libre" y no puedo encontrar nada sobre este problema debido a eso.
Lo primero que me viene a la cabeza es que el intercambio está desactivado. Tenemos un administrador de sistemas que es inflexible al respecto; Estoy abierto a explicaciones si están respaldados. ¿Podría esto causar problemas?
Aquí es gratis después de correr echo 3 > /proc/sys/vm/drop_caches
:
# free
total used free shared buffers cached
Mem: 7358492 5731688 1626804 0 524 1406000
-/+ buffers/cache: 4325164 3033328
Swap: 0 0 0
Como puede ver, se libera una cantidad minúscula de caché, pero alrededor de 1,4 GB parecen estar "atascados". El otro problema es que este valor parece aumentar con el tiempo. En otro servidor, 2.0 GB está atascado.
Realmente me gustaría recuperar este recuerdo ... cualquier ayuda sería muy apreciada.
Aquí está cat /proc/meminfo
si vale algo:
# cat /proc/meminfo
MemTotal: 7358492 kB
MemFree: 1472180 kB
Buffers: 5328 kB
Cached: 1435456 kB
SwapCached: 0 kB
Active: 5524644 kB
Inactive: 41380 kB
Active(anon): 5492108 kB
Inactive(anon): 0 kB
Active(file): 32536 kB
Inactive(file): 41380 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 320 kB
Writeback: 0 kB
AnonPages: 4125252 kB
Mapped: 42536 kB
Slab: 29432 kB
SReclaimable: 13872 kB
SUnreclaim: 15560 kB
PageTables: 0 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 3679244 kB
Committed_AS: 7223012 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 7696 kB
VmallocChunk: 34359729675 kB
DirectMap4k: 7340032 kB
DirectMap2M: 0 kB
fuente
Respuestas:
He descubierto la respuesta a mi propia pregunta, gracias a la ayuda de womble (envíe una respuesta si lo desea).
lsof -s
muestra los identificadores de archivo en uso, y resulta que había varios gigabytes de archivos de registro mmap'd ocupando el caché.Implementar un logrotate debería resolver el problema por completo y permitirme aprovechar más memoria.
También volveré a habilitar el intercambio para que no tengamos problemas con el asesino OOM en el futuro. Gracias.
fuente
lsof -s
no muestra ningún uso inusual. Sin embargo, estoy usando un ramfs como dijiste [y el kernel 2.6.10, que no tiene la función drop_caches]. ¿Cuál crees que es el probable sospechoso?lsof -s | sort -rnk 7 | less
a mi caja de herramientas ahora. Una nota para otros lectores: esto puede ser una gran entrada/proc/net/rpc/nfs4.nametoid/channel
, pero no resultó ser el culpable en mi caso./proc/meminfo
páginas "inevitables".Aparentemente, los postgres
shared_buffers
pueden aparecercached
, sin ser realmente descartables ... Ver OOM a pesar de la memoria disponible (caché)fuente