Mejorando rendimiento en Linux de escritorio

Las necesidades de un equipo de “escritorio” son bastante peculiares y especiales. Necesidades muy diferentes a cualquier otro tipo de equipo. Es difícilmente predecible su comportamiento y, por lo normal, bastante erróneas o ineficientes las configuraciones por defecto del kernel, concretamente de la gestión de la memoria virtual (vm) o swap. Comentaré dos opciones interesantes de modificar, la primera de ellas bastante conocida y la segunda un tema algo menos popular pero muy importante también.

Swappiness. Si alguien está muy aburrido aquí hay una discusión bastante interesante sobre el tema de swappiness en linux. El valor de swappiness es el tema principal cuando se trata de optimizar Linux para el usuario de escritorio normal. Dado que actualmente los usuarios tienen cantidades ingentes de memoria ram, es muy interesante decremente el valor de swappiness para forzar al kernel a no usar la memoria virtual y maximizar el uso de memoria ram. ¿Qué significa el valor de swappiness realmente? Es un valor entre 0 y 100, que cuanto mayor sea, más le gustará al kernel mover datos “sin usar” de memoria (RAM) a disco. Si nos situamos en el escenario de un usuario de escritorio el cual no va a usar grandes programas (e.g. base de datos con cientos de usuarios concurrentemente) con su memoria ram va a ser más que suficiente para correr todas sus aplicaciones sin usar siquiera la totalidad de su memoria, es decir, queremos forzar a no usar la memoria virtual debido a que en cualquier momento vamos a usar programas que estaban “inactivos” y dado que nos sobra ram por todos lados (yo hasta hace poco estaba con 512mb y sobrado…) mejor usarla al máximo. Esto se consigue poniendo swappiness a niveles muy bajos, simplemente editar el fichero /etc/sysctl.conf y añadir una linea con, por ejemplo:

vm.swappiness=1

Si queremos hacer inmediato el cambio ejecutamos

# sysctl -w vm.swappiness=1

Cache pressure. En Linux existen dos tipos de caches que el kernel utiliza, una de bloques de datos y otra de inodes. La primera de ellas es para datos en general (por ejemplo, copiar un archivo, ahí se está usando la ram y luego se copiará a disco cuando esos bloques se quiten de la memoria) y la segunda para información sobre el sistema de ficheros (para acciones como abrir ficheros, directorios, búsquedas y similares). En un sistema de escritorio es bastante común la segunda tarea y dado que también es muy común el operar con grandes ficheros (por ejemplo descomprimir esa discografía de 1gb que te acabas de bajar) como estos dos tipos de caches compiten entre sí para conseguir memoria mediante el uso de un valor se decidirá quien tiene prioridad. Por defecto suele venir el valor de 100 para la propiedad vm.vfs_cache_pressure que indica que hay prioridad para la cache de bloques de datos. Es conveniente decrementar este valor para que haya una igualdad, por ejemplo a 50. Para comprobar la efectividad de esto se puede realizar una prueba del estilo de:

  • buscar archivos (se están cacheando inodes)
  • copiar un archivo gordo (se eliminan inodes de la cache dependiendo del valor de la propiedad)
  • buscar archivos de nuevo y contar el tiempo (según cuantos se hayan eliminado de la cache esta operación tardará más o menos, dependiendo del valor de vm.vfs_cache_pressure)

He hecho un script tonto que realiza esto mismo, necesitas tener al menos 3GB en /tmp y cuesta unos 5-10min o así, dependiendo de cuantos archivos tengas (puesto que se realizan unos cuantos find / xD). A mi esta prueba me da una mejora cercana al 25% al usar un valor 50 en vez del 100 inicial. En este caso una solución radical (poner el valor a 0) no sería muy óptimo puesto que, por lo normal, un usuario de escritorio va a hacer uso tanto de operaciones con ficheros grandes como navegación por el sistema de ficheros, por lo que a mi parecer la mejor opción es una solución salomónica, es decir, editar el fichero /etc/sysctl.conf y añadir una linea con:

vm.vfs_cache_pressure=50

Si queremos hacer inmediato el cambio ejecutamos

# sysctl -w vm.vfs_cache_pressure=50

One Thought on “Mejorando rendimiento en Linux de escritorio

  1. Martin on 27 May, 2011 at 8:54 said:

    Muchas gracias por el dato adcional este es el unico post donde hablan de eso

Post Navigation