En los comentarios, le sugerí que creara un cgroup, lo pusiera memory.swappiness
a cero (para minimizar el intercambio) y ejecute su aplicación dentro de eso. Si hiciera eso, su aplicación probablemente no se intercambiaría a menos que estuviera ejecutando una memoria física tan increíblemente baja que el intercambio de páginas por programas en ese cgroup era la única forma de tener suficiente memoria física disponible.
Para hacer esto en RHEL 6.5:
Asegúrese de que el libcgroup
paquete esté instalado. Esto le da acceso a herramientas de espacio de usuario como cgcreate
y cgexec
.
Inicie y habilite el cgconfig
servicio para que los cambios en la configuración de cgroup sean persistentes entre reinicios. En RHEL, este servicio también debe montar los sistemas de archivos necesarios debajo del /cgroup
árbol.
Crea el cgroup con cgcreate -g memory:thunderbird
Establezca swappiness en cero en este grupo con cgset -r memory.swappiness=0 thunderbird
Utilícelo cgsnapshot -s > /etc/cgconfig.conf
para guardar una configuración persistente actualizada para el cgconfig
servicio (todos los cambios hasta ahora han sido cambios en tiempo de ejecución. Probablemente quiera guardar el archivo de configuración predeterminado en alguna parte y darle una revisión antes de convertirlo en la configuración persistente.
Ahora puede usar cgexec
para iniciar las aplicaciones deseadas dentro del grupo thunderbird
c:
[root @ xxx601 ~] # cgexec -g memoria: thunderbird ls
anaconda-ks.cfg a.out foreman.log index.html install.log install.log.syslog node.pp sleep sleep.c ssl-build stack test
[raíz @ xxx601 ~] #
En realidad no lo he thunderbird
instalado, de lo contrario lo habría hecho. No estoy seguro de por qué el formato de lo anterior está en mal estado.
Una alternativa cgexec
sería iniciar thunderbird y agregar el PID al tasks
archivo de la aplicación. Por ejemplo:
[root @ xxx601 ~] # cat / cgroup / memory / thunderbird / tareas
[root @ xxx601 ~] # pidof httpd
25926 10227 10226 10225 10163 10162 10161 10160 10159 10157 10156 10155 10152 10109
[root @ xxx601 ~] # echo 25926> / cgroup / memory / thunderbird / tareas
[root @ xxx601 ~] # cat / cgroup / memory / thunderbird / tareas
25926
Una vez más, hay que mencionar que esto técnicamente no evita el intercambio, pero a menos que se modifique la aplicación en sí, probablemente sea su mejor opción. Acabo de encontrar memory.memsw.limit_in_bytes
que parece que podría ser un control más directo para forzar que no haya intercambio, pero no he jugado lo suficiente como para sentirme cómodo diciendo que soluciona el problema por completo. Dicho esto, podría ser algo a tener en cuenta después de esto.
La respuesta real sería tener la mlock
información confidencial de la aplicación para evitar este tipo de preocupación. Sin embargo, estoy dispuesto a apostar que una aplicación como Thunderbird lo hace, pero no sé lo suficiente sobre los aspectos internos para comentar sobre eso.
cgexec
thunderbird en él. Todavía necesita acceso de root, pero esa es la resolución de nivel de administrador. Si está desarrollando su propia aplicación, usaría mlock .