24 jun 2012

Mejorar el I/O de disco para escrituras pequeñas, mejorar performance y cuidar el disco

Para el que no entendio el titulo del post, en lenguaje común, como para que lo entienda mi "hermana", son unos seteos que reducen el uso de entrada y salida de datos del disco y por consiguiente el uso del mismo, en lectura y escritura de datos pequeños.



Esto no solo es util porque usamos menos el disco, una pieza que tiene un desgaste mayor a otro componente de la PC, por ser mecanico, a menos que usen SSD, que no es mi caso.
Sino porque ademas, consume menos bateria, en caso de tener una notebook, el uso de la ram que del HDD.

Existen unos valores que pueden tocarse en sysctl para conseguir esto.
Primero voy a pegar la documentacion del subsistema vm del kernel Linux, para el que quiera leer mas y aprender.

http://www.kernel.org/doc/Documentation/sysctl/vm.txt

Bueno, ahora si, primero algunos "tuneos"


Si tienen mas de 2gb de RAM, digamos que hoy en dia es barata, etc, todos tienen al menos 4GB, asi que, vamos a reducir el uso de swap, añadiendo esta linea a /etc/sysctl.conf

vm.swappiness = 1

El valor por defecto es de 60, al bajar su valor, indicamos que use mas caché y menos swap.
La caché es una clase de memoria RAM estatica de acceso aleatorio (SRAM o Static Random Access Memory). Se situa entre la Unidad Central de Procesamiento (CPU) y la memoria RAM y se presenta de forma temporal y automática para el usuario proporcionado acceso rápido a los datos de
uso más frecuente. Algo que vimos como vaciar en el post de "freeram", que vaciaba las cachés de la RAM.
Al colocar este valor, le indicamos al sistema, que use menos Swap y use mas caché y RAM, incluso con el valor 1, es valido, dado que si realmente necesita swap, el sistema solo la va a usar, no es tonto el kernel!.



Luego, otra linea:

vm.vfs_cache_pressure = 50

Esto controla la tendencia del nucleo para recuperar la memoria que se utiliza para el almacenamiento en caché de objetos de directorio e inodo (dentries e inodes). El valor predeterminado de vfs_cache_pressure es de 100, el núcleo intentará reclamar dentries e inodos en una "justa" relacion con respecto a la memoria intermedia de páginas (pagecache) y swapcache. La disminución de vfs_cache_pressure hace que el núcleo prefiera conservar dentries y cachés de inodos. El aumento de vfs_cache_pressure más allá de 100 hace que el núcleo quiera recuperar dentries e inodos, es decir, liberarlos, pasandolos de RAM a disco.
Asi que un valor alto va a generar mayor trafico I/O de disco y un valor menor a 100, una disminucion del mismo.
Poner un valor bajo, permite que las operaciones se realicen en RAM, y asi ganar velocidad, como bajar la cantidad de operaciones en disco, aumentando su vida util.
El valor intermedio recomendado, es el que vimos, 50.

Otra linea:

vm.dirty_ratio = 30

El mayor porcentaje de su memoria que se puede utilizar para almacenar los "datos sucios". Si lo ajusta a un valor bajo, el kernel va a eliminar pequeñas escrituras en el disco con mas frecuencia. Los valores más altos permiten el pequeñas escrituras acumularse el stack (pila) de la memoria. Van a ir al disco en streams (pedazos) solo los pedazos mas grandes.
En servidores con 32gb de RAM, suelen ponerse valores de 80 o mas, para que sean veloces y no usen sus lerdos discos, por mas rapidos que sean, siempre serán mas lentos que una RAM, tengan eso en mente

Otra linea:

vm.dirty_background_ratio = 10

El "vm.dirty_background_ratio" dice en qué proporción debe el kernel iniciar la tarea en segundo plano de la escritura de "páginas sucias". El "vm.dirty_ratio" dice en qué proporción de todas las operaciones de I/O estas se escribirán sincrónicamente, lo que significa que no podemos hacer llamadas de I/O sin esperar a que el dispositivo subyacente las complete (lo cual es algo que nunca queremos que suceda).
Asi que bajamos su valor a 10% (en mi caso)

Otra linea:

vm.dirty_writeback_centisecs = 1500

Esto le indica al kernel cada cuantos segundos debe escribir los datos al disco. El valor por defecto es de 500, que equivale a 5 segundos, lo habran leido por ahi cuando apenas salio ext4.
Si no suelen apagar la PC a lo bestia, o tener cortes de luz, es decir, tienen bateria, una UPS, o no sufren cortes, aumentan este valor a 1000, quedando en 10 segundos. Cada 10 segundos el kernel volcará los datos al disco, a menos que sea forzado con el comando sync.
Asimismo, si ustedes tienen cortes de luz frecuentes o les falla un cable, pueden bajarlo a 2 segundos, o 1, poniendo 200 o 100 respectivamente. La unidad son centisegundos, o sea, centesimas de segundo.

Otro Tip Importante

Colocar en /etc/rc.local, este valor:

hdparm -B 255 /dev/sda

Nos dice el manpage de hdparm:

"A  value  of 255 tells hdparm to disable Advanced Power Management altogether on the drive (not all drives support disabling it, but most do)"

Eso quiere decir, que bajo ninguna circunstancia, el disco bajará sus revoluciones ni nada, como suele pasar en Windows, donde los discos duran menos en las notebook, por bajar revoluciones y a veces tocar algun plato.



Con estos seteos, obtenemos un sistema que usa poco el disco, y responde rapido ante cosas violentas, por ejemplo, hacer un make -j400 para compilar un kernel, y cuando la RAM, en mi caso, se llena hasta 3.7GB (tengo 4GB), darle un crtl+c y que corte el proceso sin freezar el sistema y se recupere rapidamente.
Asimismo, cuidamos el disco y usamos mas la ram, volcamos pequeñas cantidades de datos al disco en intervalos medianos, y no un volcado enorme cada mucho tiempo, lo que es mas trabajo, ruido y vibracion al mismo.
Por otro lado, usamos toda la paginacion de RAM posible, si, los datos sucios, asi estan en la documentacion, para minimizar el acceso a disco.
Y por ultimo desactivamos la posibilidad que ante una baja de bateria o algo, el disco baje revoluciones y toque sus platos.
Obvio que estos valores pueden cambiarse, segun test, bechmark, necesidad, no es lo mismo un server de mysql, que uno de correo, como tampoco otro que es un web server ni un desktop.
Cada equipo tiene una necesidad distinta, el mismo Torvalds dice que es bueno tunear esto, pero que no hay una medida justa para todos.

En mi caso, estos valores, junto al post sobre heavy disk I/O, fueron los optimos, para no reiniciar la PC, pueden usar el script de heavy ( LINK ) load I/O y modificarlos, y hacer sysctl -p, el cual actualiza los datos, y ajustar bien los valores, que van, en dirty de 20 a 40, y en background de 5 a 15.

1 comentario:

Dejá tu comentario