El kernel de Linux intercambia la mayoría de las páginas de la memoria cuando ejecuto una aplicación que usa la mayoría de los 16 GB de memoria física. Una vez que finaliza la aplicación, cada acción (escribir comandos, cambiar áreas de trabajo, abrir una nueva página web, etc.) tarda mucho en completarse porque las páginas relevantes primero deben volver a leerse desde el intercambio.
¿Hay alguna manera de decirle al kernel de Linux que copie páginas del intercambio en la memoria física sin tocar manualmente (y esperar) cada aplicación? Ejecuto muchas aplicaciones, por lo que la espera siempre es dolorosa.
A menudo uso swapoff -a && swapon -a
para hacer que el sistema responda nuevamente, pero esto borra las páginas del intercambio, por lo que deben escribirse nuevamente la próxima vez que ejecute el script.
¿Existe una interfaz de kernel, tal vez usando sysfs, para indicar al kernel que lea todas las páginas del intercambio?
Editar: De hecho, estoy buscando una manera de hacer que todos los intercambios se intercambien en caché. (¡Gracias, Derobert!)
[PS serverfault.com/questions/153946/… y serverfault.com/questions/100448/… son temas relacionados, pero no abordan la cuestión de cómo hacer que el kernel de Linux copie páginas del intercambio de nuevo en la memoria sin borrar el intercambio.]
Respuestas:
Basado en el programa memdump originalmente encontrado aquí , he creado un script para leer selectivamente las aplicaciones especificadas nuevamente en la memoria.
remember
:Uso: algo como
Salta rápidamente sobre la memoria no intercambiada (gigabytes por segundo) y se ralentiza cuando se necesita el intercambio.
fuente
Podría ayudar a subir
/proc/sys/vm/page-cluster
(por defecto: 3).De la documentación del núcleo (
sysctl/vm.txt
):La documentación no menciona un límite, por lo que posiblemente podría establecer este nivel absurdamente alto para que todo el intercambio se lea de nuevo muy pronto. Y, por supuesto, volver a un valor razonable después.
fuente
page-cluster
valor puede mejorar el rendimiento.Puede intentar agregar los programas que más le interesan a un cgroup y ajustar el intercambio para que la próxima vez que la aplicación ejecute los programas que agregue sean menos propensos a ser candidatos para el intercambio.
Es probable que algunas de sus páginas aún se intercambien, pero puede solucionar sus problemas de rendimiento. Una gran parte de esto es probablemente el comportamiento de "detener y comenzar" cuando muchas páginas de un programa están en intercambio y el programa tiene que pausar continuamente para intercambiar sus páginas en RAM, pero solo en incrementos de 4k.
Alternativamente, puede agregar la aplicación que se está ejecutando a un cgroup y ajustar el intercambio para que la aplicación sea la que más utilice el archivo de intercambio. Disminuirá la velocidad de la aplicación pero ahorrará el resto del sistema.
fuente
Me parece que no puedes mágicamente "hacer que el sistema responda de nuevo". O incurres en la penalización o lees páginas desde el espacio de intercambio a la memoria ahora o incurres más tarde, pero de una forma u otra incurres en ella. De hecho, si hace algo así
swapoff -a && swapon -a
, puede sentir más dolor en lugar de menos, porque obliga a que algunas páginas se vuelvan a copiar en la memoria que de otra manera nunca hubieran sido necesarias y finalmente se caigan sin ser leídas (piense: abandona una aplicación mientras gran parte de su montón se intercambia; esas páginas se pueden descartar por completo sin tener que volver a leerlas en la memoria).Bueno, casi todas las páginas que se copian desde el intercambio a la memoria principal están a punto de modificarse de todos modos, por lo que si alguna vez fuera necesario volver a cambiar para intercambiar en el futuro, de todos modos tendría que escribirse nuevamente en el intercambio. Tenga en cuenta que el intercambio es principalmente memoria de almacenamiento dinámico, no páginas de solo lectura (que generalmente están respaldadas por archivos).
Creo que tu
swapoff -a && swapon -a
truco es tan bueno como cualquier cosa que se te ocurra .fuente
swapoff -a && swapon -a
no será bueno para ti. Supongo que en ese caso necesitaría algo que escanee/proc/<each-process>/mem
y lea cada página de memoria para asegurarse de que exista en la RAM. No sé si eso existe.Hay una muy buena discusión aquí http://rudd-o.com/en/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that lo que se reduce a la disminución del intercambio, con la idea de que para aumentar la capacidad de respuesta percibida del sistema, uno debe evitar el intercambio del código (y esto es lo que sucede). Esto no es realmente una respuesta a su pregunta, pero puede evitar que aparezca el problema (sus aplicaciones simplemente no se intercambian, solo datos no utilizados y caché de páginas)
fuente