
Parece que tengo una pérdida de memoria en el espacio del kernel, la losa muestra que kmalloc-4096 crece perpetuamente en un clip uniforme hasta que monopoliza todos los recursos de RAM en el sistema y fuerza el intercambio.
Gratis muestra gran parte de este uso de memoria como caché, pero se niega a liberarse cuando es necesario, o incluso cuando se marca para borrar manualmente. Un ejemplo de lo que estamos viendo:
$ sudo su -c "free -h && sync && echo 3 > /proc/sys/vm/drop_caches && free -h"
total used free shared buff/cache available
Mem: 15G 4.4G 166M 280M 10G 104M
Swap: 15G 7.8G 8.1G
total used free shared buff/cache available
Mem: 15G 4.4G 186M 280M 10G 115M
Swap: 15G 7.8G 8.1G
¿Debería realizar un perfil de kmalloc para determinar dónde está la fuga? Si es así, ¿cómo podría hacer para hacerlo?
Esta es una instalación estándar de Ubuntu 16.04 en un Intel i5 Skylake.
$ uname -a
Linux fire 4.4.0-78-generic #99-Ubuntu SMP Thu Apr 27 15:29:09 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
Respuesta1
La 'sincronización' no reducirá el beneficio/caché, simplemente solicita que los datos vayan a los dispositivos de bloque. El objetivo del caché es que los datos permanecen en los cachés de la RAM. Enviar un 3 a drop_caches tampoco espera a que se eliminen los cachés. ¿Podrías agregar un 'dormir 60' antes del 'gratis'? Esto podría dar algo de tiempo para que la memoria se borre antes de informar de forma gratuita.
Dejar un 'watch -n60 cat /proc/meminfo' podría ayudar a mostrar el área de memoria que está creciendo, pero el caché y el buff no son solo fugas; al consumir memoria, cumplen su propósito y hacen el mejor uso de la memoria disponible de su sistema. recurso.
Si un proceso se cambia al disco, esto no significa automáticamente que haya sucedido algo malo. El kernel está haciendo lo correcto si ese proceso no está utilizando todas sus páginas y ha quedado inactivo, existe una posibilidad razonable de que en un servidor web se necesite el contenido de la raíz www antes de que se deje ejecutando una copia de mutt. Pantalla GNU cuando el usuario ha cerrado sesión, por ejemplo.
Si aún consideras que el kernel está consumiendo la RAM a través de módulos, puedes inspeccionar esto un poco más usando:
awk '{ print $2" "$1 }' /proc/modules | sort -n
¿Estás usando ZFS? Tiene mucha hambre de RAM, pero al igual que el caché, intenta mantener la E/S del disco en la RAM en caso de que sea necesario.