Soujiro

Fanático
Se incorporó
14 Enero 2008
Mensajes
1.428
Estimados, tengo un problema de swap en algunos servidores. Dichas maquinas tienen 128Gb de ram, de los cuales alrededor de 45Gb estan ocupados permantemente, sin embargo el sistema oeprativo comienza a ocupar el resto como "cache" o "buffers", hasta aqui nada raro. El problema surge sin embargo cuando se come 50Gb o mas en la cache, con lo cual me queda muy poca memoria libre llegando a este estado.

Código:
free -m -h
                     total        used        free      shared  buff/cache   available
Mem:           125G         56G        6.4G        339M         63G         54G

el "problema" es que si se ejecuta una aplicación "pesada" el sistema en vez de liberar la cache, manda otro proceso a swap dejando la embarrada. El swappines esta seteado en 10 en las maquinas. ¿Alguien tiene alguna idea de como evitar este comportamiento "errado", no se supone que la memoria de la cache debería ser liberada ante la demanda de mas ram, o hay algo que me estoy olvidando?
 

Veemon

El Espia que Espia
Miembro del Equipo
MOD
Reviewer
Se incorporó
15 Mayo 2011
Mensajes
1.328
Estimados, tengo un problema de swap en algunos servidores. Dichas maquinas tienen 128Gb de ram, de los cuales alrededor de 45Gb estan ocupados permantemente, sin embargo el sistema oeprativo comienza a ocupar el resto como "cache" o "buffers", hasta aqui nada raro. El problema surge sin embargo cuando se come 50Gb o mas en la cache, con lo cual me queda muy poca memoria libre llegando a este estado.

Código:
free -m -h
                     total        used        free      shared  buff/cache   available
Mem:           125G         56G        6.4G        339M         63G         54G

el "problema" es que si se ejecuta una aplicación "pesada" el sistema en vez de liberar la cache, manda otro proceso a swap dejando la embarrada. El swappines esta seteado en 10 en las maquinas. ¿Alguien tiene alguna idea de como evitar este comportamiento "errado", no se supone que la memoria de la cache debería ser liberada ante la demanda de mas ram, o hay algo que me estoy olvidando?
Parece mas un comportamiento erratico del kernel en la administracion de la memoria, porque es como tu dices, al necesitar mas ram, debe achicar el cache o liberarlo y no pasarlo a la swap .-.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
Yo se que lo que te voy a preguntar no ayuda en nada, es para saber si me puede pasar a mi.

¿Qué distro y versiones tienes ahí?
 
Upvote 0

Soujiro

Fanático
Se incorporó
14 Enero 2008
Mensajes
1.428
lamentablemente guanobunto server, pasa en versiones 16.04 con kernel 4.4.0-138-generic y 18.04 con kernel 4.15.0-39-generic
 
Upvote 0

Soujiro

Fanático
Se incorporó
14 Enero 2008
Mensajes
1.428
jaja la idea no es "limpiar" a lo bruto, de echo hay varias formas de hacerlo, sino "prevenir" este comportamiento "raro", a lo mejor es lo "normal". Gracias de todas maneras
 
Upvote 0

Harima

Pegao al tarro
Se incorporó
15 Mayo 2008
Mensajes
3.958
Tirate estos comandos para ver si por lo menos esta leyendo bien la config

#cat /proc/sys/vm/swappiness
#cat /etc/sysctl.conf | grep vm.swappiness
#free -mh (aca deben aparecer dos lineas mem: y swap:)
 
Upvote 0

Soujiro

Fanático
Se incorporó
14 Enero 2008
Mensajes
1.428
voy avanzando con el misterio, basicamente son unos rsync + las vms de windows las que se toman la "cache". Una forma de "reproducir" el problema es
Código:
find / -type f -exec cat {} >>/dev/null \;
lo cual deberia llenar la cache con referencias a los archivos del sistema
Ademas la estrategia por default de linux para hacer swapping es enviar las paginas de memoria mas viejas, afectadas por el valor de swapinnes vs la cache.
Resumiendo pareciera ser que mi proceso que lleva mil años en "ejecución" tiene paginas muy viejas, ergo aun con un valor de swappiness de 10
Código:
cat /proc/sys/vm/swappiness
10
pierde ante la cache mas reciente, el problema es que el proceso es la base de datos, y en realidad al entrar en swap se va a la B el rendimiento de la misma.
¿Como carajos desactivo el swap para un proceso?
 
Upvote 0

K3rnelpanic

non serviam
Miembro del Equipo
MOD
Se incorporó
1 Octubre 2007
Mensajes
6.065
Tirate estos comandos para ver si por lo menos esta leyendo bien la config

#cat /proc/sys/vm/swappiness
#cat /etc/sysctl.conf | grep vm.swappiness
#free -mh (aca deben aparecer dos lineas mem: y swap:)
Venia a decir lo mismo, verifica la swappiness
 
Upvote 0

Soujiro

Fanático
Se incorporó
14 Enero 2008
Mensajes
1.428
pero si les puse la salida del swappiness ciegos

cat /proc/sys/vm/swappiness
10

y el archivo del sysctl.conf tiene el vm.swappiness=10

respecto a pegarle un garrote para que se "arregle" y suelte la cache es facil, pero el "problema" es sacar el mysql de la swap sin que explote o derechamente evitar que el mysql se valla a swap. La idea es que el puto SO haga la pega que le corresponde como la gente y libere la cache antes de mandar un proceso en ejecucion a swap, por mucho que lleve mil años en ejecucion.
 
Upvote 0

Soujiro

Fanático
Se incorporó
14 Enero 2008
Mensajes
1.428
Definitivamente el algoritmo de swap por defecto es el que me trolea, aun con swappines 1. Dado que la base de datos corre en un container probare con el parametro --memory-swappiness 0
mientras tanto el siguiente procedimiento le servira a quien tenga problemas:
primero, mandar al espacio la cache de archivos del SO
Código:
sync; echo 1 > /proc/sys/vm/drop_caches
luego ejecutar este scrip de perl para "prepar" la descativacion/activacion de swap, el cual es un proceso ridículamente lento
Código:
https://gist.github.com/Someguy123/b221986a279e1dff5f1c139562f9ca73
Finalmente apagar y prender la swap
Código:
swapoff -a && swapon -a

Con eso sacar las cosas de swap deberia ser "rapido"
 
Upvote 0
Subir