¿Cómo evitar que un programa específico se intercambie?

23

¿Es posible evitar que un programa específico (es decir, rhythmbox y sus dependencias) se intercambie alguna vez al disco?

Lo pregunto porque tengo un problema cuando un reproductor de música tiene problemas cuando Chromium ocupa demasiada memoria. ¿Hay alguna manera de evitar esto? Esto ya no es un problema en Windows, así que presumiblemente hay una manera.

Alexei Averchenko
fuente
Tomboy tiene el mismo problema. Es una de las razones por las que algunas personas se han cambiado a GNote .
Cristian Ciupitu
1
Creo que el problema del hipo no es necesariamente causado por el intercambio. Si el programa está reproduciendo algo, Linux debería notar esto y no cambiarlo. Los programas que no hacen mucho son los primeros que se intercambian. ¿Has corrido pso toppara ver si realmente se intercambia rhytmbox marcando el campo RSS/ RES? Creo que su problema se debe principalmente a una programación incorrecta. Debe intentar reniceel proceso rhytmbox o cambiar algunas de sus configuraciones, por ejemplo, el tamaño del búfer de audio.
Cristian Ciupitu
1
¡Gracias! ¿Hay alguna manera de configurar el valor inicial agradable de un programa? / etc / nicetab o algo? :)
Alexei Averchenko
relacionado: stackoverflow.com/questions/2360116/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

10

Creo que el problema del hipo no es necesariamente causado por el intercambio. Si un programa está reproduciendo algo, Linux debería notar esto y no cambiarlo. Los programas que no hacen mucho son los primeros que se intercambian. Puede verificar si el programa realmente se está intercambiando mirando el campo RSS/ RESdesde ps o arriba . RSSes el tamaño del conjunto residente, la memoria física no intercambiada que utiliza una tarea (en kiloBytes).

Creo que su problema probablemente se deba a una programación inadecuada de CPU y E / S y un poco de ineficiencia de Rhythmbox que lo hace sensible a las altas cargas del sistema. La prioridad de la CPU se puede cambiar con los comandos nice y renice . La prioridad de E / S se puede cambiar con el comando ionice . Solo el superusuario puede usar altas prioridades. También debe saber que los chicos del kernel de Linux están tratando de mejorar la capacidad de respuesta de los sistemas de escritorio con varios parches de baja latencia, por lo que podría considerar usarlos. Uno de ellos es un parche de ~ 200 líneas escrito por Mike Galbraith que ha impresionado incluso a Linus. La alternativa a este parche es el truco cgroups de Lennart Poettering que creo que será el predeterminado en Fedora 15.

De todos modos, sin esos parches hay dos opciones: iniciar el programa con alta prioridad o cambiarlo después. Para la primera opción, podría usar un script de envoltura alrededor de Rhythmbox:

#!/bin/sh
# Run Rhytmbox with high CPU and I/O priorities
nice -n -10 ionice -c 1 -n 1 su -l -c rhythmbox alexei

Deberá ejecutarlo como root. Si no desea iniciar sesión como root solo para comenzar esto, puede usar cualquiera suo sudo.

En cuanto a cambiar la prioridad después, si eres demasiado flojo para iniciar sesión como root para cambiarlo, puedes intentar usar un trabajo cron que se ejecute cada 5 minutos y establezca la prioridad del rhythmboxproceso, pero no recomendaría hacerlo:

#!/bin/sh
renice -n -10 -p `pidof rhythmbox`
ionice -c 1 -n 1 -p `pidof rhythmbox`
Cristian Ciupitu
fuente
5

Respuesta corta: no se puede y no se debe.

Hace mucho tiempo, los archivos ejecutables honraban el bit pegajoso +tque le diría al kernel que no se intercambie, pero hoy se ignora.

Si el núcleo decide que tiene que intercambiar, seguramente tiene un motivo válido. Linux es muy agresivo en el uso de la memoria, porque la RAM inactiva es un recurso desperdiciado.

Si realmente no desea intercambiar, obtenga más RAM, o simplemente # swapoff -a(no recomendado, puede inutilizar su sistema si ya tiene problemas).

Shouldn'tocurre cuando estás desarrollando alguna aplicación y no quieres que se intercambie en absoluto. Echa un vistazo a esta publicación en stackoverflow .

Torian
fuente
2
No creo que reservar alrededor de 100 MiB matará mi sistema. ¿Quizás haya otra forma de resolver mi problema particular (vea la pregunta editada)?
Alexei Averchenko
1
Si tiene la intención de mantener un proceso con un alto nivel de capacidad de respuesta sobre otros procesos, la respuesta es buena (debe ser root para hacerlo). No es fácil jugar con la paginación de memoria si no quiere ensuciarse las manos (toque el código, vuelva a compilar o incluso LD_PRELOADing una biblioteca personalizada para engañar el proceso y ajustar la función utilizada para asignar memoria, de nuevo, no es recomendable) . Consejo ? renice el proceso, obtenga más RAM o deje de abrir pestañas;)
Torian
55
"Si el núcleo decide que tiene que intercambiarse, seguramente tiene un motivo válido", eso no es cierto. Hoy tenía 1,3G de memoria libre. El kernel de Linux puso mis procesos httpd en el intercambio (370M).
bluszcz
@bluszcz (bueno, otros que leen esto dada la antigüedad de ese comentario): Eso podría deberse a que decidió que la memoria caché de disco para los archivos servidos por su httpd es más importante que las partes raramente utilizadas de su propio httpd - vea las otras respuestas mencionando "swappiness".
Jan Schejbal
@ JanSchejbal eso es porque Linux, al menos sin que alguien se lo diga, no sabe qué procesos son importantes o no. En un entorno de servidor, debe poder decirle al sistema qué procesos son importantes y cuáles no. "No me importan otras cosas, pero estos procesos son los más importantes para el funcionamiento de este servidor"
Rahly
3

Hay varias maneras de hacer eso. Puede intentar probar es "dice" que Linux trabaje menos con swap (generalmente):

echo 10 > /proc/sys/vm/swappiness

De: https://www.kernel.org/doc/Documentation/sysctl/vm.txt

intercambio

Este control se utiliza para definir qué tan agresivo el núcleo intercambiará páginas de memoria. Los valores más altos aumentarán la agresividad, los valores más bajos disminuyen la cantidad de intercambio.

El valor predeterminado es 60.

Otra opción es usar el administrador de kernel de cgroups, esto es específico para cada proceso, pero tendrá que hacer "trabajo": Respondido aquí: /unix/10214/per-process-swapiness-for -linux # 10227

ceinmart
fuente
1
Esto afecta el intercambio globalmente, no el proceso específico.
Lorenzo Von Matterhorn
1
Sí, puede notar que en "(en general)" escribí. La opción de ser por proceso es el enlace a otra respuesta, usando cgroups.
ceinmart
Entonces eso no es de ayuda, ¿verdad?
Ken Sharp
Ken Sharp: Esta respuesta es la única que se vincula directamente con lo que parece (al menos a primera vista) como la mejor solución al problema. Entonces ... más o menos lo contrario de lo que dijiste.
phils
@phils No entiendes cómo funciona esto.
Ken Sharp
0

Puedes usar mlockall()syscall. mlockall () fuerza que el proceso de memoria sea residente (= sin intercambio, sin sobrecompromiso, etc.). AFAIK, no hay un comando de shell para hacerlo, pero es fácil crear uno. Se vería así:

if (mlockall(MCL_FUTURE | MCL_CURRENT))
     perror("mlockall");
execvp(argv[0], argv);

Tenga en cuenta que debe ser root para llamar mlockall().

Sin embargo, como se dijo en otra respuesta, no creo que sea realmente lo que quieres.

Jérôme Pouiller
fuente
1
El código no funcionará en absoluto ya que execvp es una interfaz para ejecutar lo que deshace mlockall. Consulte la sección de Notas en la página de manual de mlock.
Johannes Matokic