Una solución es asegurarse de que el controlador cgroup de memoria esté habilitado (creo que está habilitado de forma predeterminada incluso en kernels semirecientes; de lo contrario, deberá agregar cgroup_enable=memory
a la línea de comandos del núcleo). Luego puede ejecutar su tarea intensiva de E/S en un cgroup con un límite de memoria, lo que también limita la cantidad de caché que puede consumir.
Si está utilizando systemd, puede configurar +MemoryAccounting=yes
y MemoryHigh
/MemoryMax
o MemoryLimit
(depende de si está usando cgroup v1 o v2) en la unidad, o una porción que lo contiene. Si es una porción, puede usar systemd-run
para ejecutar el programa en el segmento.
Ejemplo completo de uno de mis sistemas para ejecutar Firefox con un límite de memoria. Tenga en cuenta que esto usa cgroups v2 y está configurado como mi usuario, no como root (una de las ventajas de v2 sobre v1 es que delegar esto a no root es seguro, por lo que systemd lo hace).
$ systemctl --user cat mozilla.slice
# /home/anthony/.config/systemd/user/mozilla.slice
[Unit]
Description=Slice for Mozilla apps
Before=slices.target
[Slice]
MemoryAccounting=yes
MemoryHigh=5G
MemoryMax=6G
$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/firefox &
$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/thunderbird &
Descubrí que para que el usuario funcionara, tenía que usar un segmento. El sistema uno funciona simplemente colocando las opciones en el archivo de servicio (o usando systemctl set-property
en el servicio).
Aquí hay un servicio de ejemplo (usando cgroup v1), tenga en cuenta las dos últimas líneas. Esto es parte de la instancia del sistema (pid=1).
[Unit]
Description=mount S3QL filesystem
Requires=network-online.target
After=network-online.target
[Install]
WantedBy=multi-user.target
[Service]
Type=forking
User=s3ql-user
Group=s3ql-user
LimitNOFILE=20000
ExecStartPre=+/bin/sh -c 'printf "S3QL_CACHE_SIZE=%%i\n" $(stat -c "%%a*%%S*.90/1024" -f /srv/s3ql-cache/ | bc) > /run/local-s3ql-env'
ExecStartPre=/usr/bin/fsck.s3ql --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo --log none «REDACTED»
EnvironmentFile=-/run/local-s3ql-env
ExecStart=/usr/bin/mount.s3ql --keep-cache --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo --cachesize ${S3QL_CACHE_SIZE} --threads 4
ExecStop=/usr/bin/umount.s3ql /mnt/S3QL/
TimeoutStopSec=2m
MemoryAccounting=yes
MemoryLimit=1G
La documentación está en systemd.resource-control(5)
.
Parece que después de un día de inactividad, el kernel cree que la GUI completa ya no es necesaria y la borra de la RAM (la cambia al disco).
El núcleo está haciendo The Right Thing™ creyéndolo ¿Por qué mantendría la memoria no utilizada en la RAM y, por lo tanto, la desperdiciaría en lugar de usarla como caché o algo así?
No creo que el kernel de Linux esté intercambiando páginas de forma gratuita o anticipada, por lo que si lo hace, debe ser para almacenar algo más en la RAM, mejorando así el rendimiento de su tarea de ejecución prolongada, o al menos con este objetivo.
Si sabe con anticipación cuándo necesitará reutilizar su computadora portátil, puede usar el at
comando (o crontab
) para programar una limpieza de intercambio (swapoff -a;swapon -a
).
Como limpiar el intercambio puede ser excesivo e incluso desencadenar el asesino OOM si, por alguna razón, no todo cabe en la RAM, es posible que simplemente "desintercambie" todo lo relacionado con las aplicaciones en ejecución que desea revivir.
Una forma de hacerlo sería adjuntar un depurador como gdb
a cada uno de los procesos afectados y activar una generación de volcado del núcleo:
# gdb -p <pid>
...
generate-core-dump /dev/null
...
quit
Como escribió, su aplicación de ejecución prolongada no está reutilizando los datos que lee después del pase inicial, por lo que se encuentra en un caso específico en el que el almacenamiento en caché a largo plazo no es útil. Luego, omitir el caché usando E/S directa como sugirió Will Crawford debería ser una buena solución.
Alternativamente, puede vaciar regularmente el caché de archivos haciendo eco de 1
o 3
al /proc/sys/vm/drop_caches
pseudo-archivo antes de que el sistema operativo piense que es una buena idea cambiar las aplicaciones y el entorno de la GUI.
Consulte ¿Cómo se vacían los búferes y la memoria caché en un sistema Linux? para más detalles.
Sin usar en el sentido:no se usa más activamente desde un período de tiempo significativo, la memoria sigue siendo relevante para sus propietarios.
Volver a colocar en RAM las páginas almacenadas en el área de intercambio.
Tener un intercambio tan grande hoy en día es a menudo una mala idea. En el momento en que el sistema operativo intercambió solo unos pocos GB de memoria para intercambiar, su sistema ya se había arrastrado hasta la muerte (como lo que vio)
Es mejor usar zram
con una pequeña partición de intercambio de respaldo . Muchos sistemas operativos como ChromeOS, Android y varias distribuciones de Linux (Lubuntu, Fedora) han habilitado zram de forma predeterminada durante años, especialmente para sistemas con menos RAM. Es mucho más rápido que intercambiar en HDD y puede sentir claramente la capacidad de respuesta del sistema en este caso. Menos en un SSD, pero de acuerdo con los resultados de referencia aquí, todavía parece más rápido incluso con el algoritmo lzo predeterminado. Puede cambiar a lz4 para obtener un rendimiento aún mejor con una relación de compresión un poco menor. Su velocidad de decodificación es casi 5 veces más rápida que lzo según el punto de referencia oficial
De hecho, Windows 10 y macOS también utilizan técnicas de compresión de archivos de paginación similares de forma predeterminada
También hay zswap
aunque nunca lo he usado. Probablemente valga la pena intentarlo y comparar cuál es mejor para sus casos de uso
Después de eso, otra sugerencia es reducir la prioridad de esos procesos vinculados a IO y posiblemente deje una terminal ejecutándose con mayor prioridad para que pueda ejecutar comandos en ella de inmediato, incluso cuando el sistema tiene una carga alta
Lecturas adicionales
- Arch Linux - Mejora del rendimiento - Zram o zswap
- Habilite ZSwap para aumentar el rendimiento
- Habilite zRAM para mejorar el manejo de la memoria y menos intercambio
- ¿Te estás quedando sin RAM en Ubuntu? Habilitar ZRAM
- Diferencia entre ZRAM y ZSWAP
- Guía definitiva de zram vs zswap vs zcache:cuándo usar cuál
- Linux, SSD e intercambio
- https://wiki.debian.org/ZRam
- https://www.kernel.org/doc/Documentation/blockdev/zram.txt
- https://wiki.gentoo.org/wiki/Zram