domingo, 24 de febrero de 2019

Optimizar disco SSD en Ubuntu

Optimizar disco SSD en Ubuntu

TRIM, informa a una unidad de estado sólido (SSD) los bloques de datos que ya no están en uso cuando borramos un fichero, el sistema operativo lo marca como espacio utilizable para asegurar las posteriores operaciones de escritura a plena velocidad.

Es recomendable no llenar en exceso el disco, ya que los SSD no pueden sobrescribir los datos existentes, deben ser borrados antes de escribir los nuevos.

TRIM, es un protocolo que debe tener tanto el sistema operativo como el disco SSD.



1.- Comprobar si TRIM es soportado por el SSD


Para comprobar si TRIM es soportado por nuestro disco SSD escribimos en Terminal (Abrir Terminal presionando Ctrl + Alt + T del teclado) el siguiente comando:
sudo hdparm -I /dev/sda | grep "TRIM supported"
sudo hdparm -I /dev/sda | grep "TRIM supported"




TRIM soportado

TRIM soportado




Nota: La unidad sda la debemos substituir por el disco donde se encuentra la (/) raiz del sistema operativo, ya que puede ser sdb, sdc, no poner el número de partición, en este caso es sda.



1.1- Activar TRIM



Una vez que sabemos que TRIM es soportado por nuestro disco SSD, procedemos a activarlo con el comando fstrim.
Fstrim, informa a la controladora del disco, cuales son los bloques de almacenamiento libres que se pueden utilizar en tiempo real, para mantener el rendimiento de escritura en los discos SSD.


Programamos TRIM para que se ejecute una vez a la semana, escribimos en Terminal el siguiente comando:
sudo nano /etc/cron.weekly/fstrim
sudo nano /etc/cron.weekly/fstrim





Si el fichero está vacío, escribimos el siguiente script, que comprueba los discos soportados y lo lanza en todas las particiones.
Si el fichero no está vacío, lo dejaremos como se encuentre (no lo modificamos).



Escribimos el siguiente script, si el archivo se encuentra vacío:
#!/bin/sh 
/sbin/fstrim --all || true

#!/bin/sh  /sbin/fstrim --all || true




Guardamos los cambios pulsando en el teclado:
Control + o
Luego pulsamos la tecla Intro del teclado para aceptar

Cerramos el fichero pulsando en el teclado:
Control + x


Si el fichero estaba vacio, y hemos escrito el script, le damos permisos de ejecución con:
sudo chmod +x /etc/cron.weekly/fstrim
sudo chmod +x /etc/cron.weekly/fstrim





2.- Configuración del programador I/O de disco para SSD:



CFQ o cfq es un programador I/O (entradas/salidas (E/S)) para el kernel, y predeterminado en muchas distribuciones Linux, es un componente crítico de un sistema operativo.

La programación de entrada/salida I/O (E/S), es el método que utilizan los sistemas operativos para decidir en qué orden se enviarán las operaciones de entradas/salidas I/O a los volúmenes de almacenamiento.

El planificador Noop (noop), es una cola FIFO simple, y asume que el rendimiento de I/O ha sido o será optimizado en el bloque del dispositivo SSD, para obtener un mejor ajuste de rendimiento de disco, noop utiliza la menor cantidad posible de ciclos de CPU (unidad central de proceso) para la programación de I/O.

FIFO, es un método para organizar y manipular un búfer de datos.


El programador de I/O se puede seleccionar en el momento del arranque usando el parámetro elevator del kernel, lo podemos tener configurado para usar el planificador noop.



Para cambiar el valor predeterminado en todos los discos de un sistema, escribimos en Terminal (Abrir Terminal presionando Ctrl + Alt + T del teclado) el siguiente comando:
sudo nano /etc/default/grub
sudo nano /etc/default/grub




Para posicionarnos en algún lugar del archivo utilizamos las flechas de dirección del teclado.


Nos vamos a la línea que pone: GRUB_CMDLINE_LINUX=

GRUB_CMDLINE_LINUX=



En esa linea tenemos que añadir el parámetro:
"elevator=noop"

Nos quedará la línea así:

GRUB_CMDLINE_LINUX="elevator=noop"
GRUB_CMDLINE_LINUX="elevator=noop"





Guardamos los cambios pulsando en el teclado:
Control + o
Luego pulsamos la tecla Intro del teclado para aceptar

Cerramos el fichero pulsando en el teclado:
Control + x

Guardados los cambios, regeneramos el GRUB para que utilice dichos cambios.
sudo update-grub
sudo update-grub




Suponiendo que el nombre de disco sea sda, podemos verificar qué el programador cfq está actualmente en uso con el siguiente comando:
cat /sys/block/sda/queue/scheduler
cat /sys/block/sda/queue/schedule



El planificador que está actualmente en uso, lo vemos rodeado por [ ] corchetes.



3.- Reducir el uso de la partición SWAP


La memoria RAM está para usarse. La memoria Swap o memoria de intercambio, la utiliza el equipo cuando la memoria RAM comienza a escasear.

Swappiness hace referencia al uso de la memoria Swap en relación a la RAM es una propiedad del Núcleo Linux que permite establecer un balance entre el uso del espacio de intercambio o Swap y la memoria RAM.

Podemos modificar el porcentaje de memoria swap a utilizar, de manera que apuremos el uso de memoria RAM antes de comenzar a usar la memoria de intercambio o swap.

La caché es en gran parte responsable del almacenamiento de datos virtuales, para que pueda ser recuperada cuando sea necesario. Es mas rápido para el sistema extraer datos desde la memoria RAM, que del disco duro.


El kernel de Linux tiene una serie de búferes de escritura de memoria ajustables, que definen cómo el sistema usa la memoria para retrasar las escrituras en el disco.

vm.swappiness=1
vm.swappiness, puede tener un valor entre 0 y 100, el valor predeterminado es 60. Un valor bajo hace que el kernel evite el intercambio, un valor más alto hace que el kernel intente usar el espacio de intercambio, los valores más pequeños reducen el uso del intercambio o swap.

vm.vfs_cache_pressure=50
vm.vfs_cache_pressure, el valor predeterminado es 100. Controla la tendencia del kernel a recuperar la memoria que se usa para el almacenamiento en caché de cachés VFS, en lugar de pagecache y swap, poner un valor bajo permite que las operaciones se realicen en RAM, para ganar velocidad, así como bajar la cantidad de operaciones en disco SSD, aumentando su vida util.

vm.dirty_writeback_centisecs=1500
vm.dirty_writeback_centicecs, el valor predeterminado 500 ó 5 segundos. Escrituras en el disco del búfer/retraso, es la frecuencia con la que los procesos pdflush/flush/kdmflush se activan y comprueban si es necesario trabajar.

vm.dirty_expire_centisecs=4500
vm.dirty_expire_centisecs, el valor predeterminado 3000 ó 30 segundos. Escrituras en el disco del búfer/retraso. Esto define el intervalo entre las operaciones de reescritura.

vm.dirty_ratio=30

vm.dirty_ratio, el valor predeterminado es 20%, es el porcentaje máximo de memoria que se debe usar, que puede consumir páginas sucias antes de que todos los procesos deban escribir buffers sucios de nuevo en el disco, y cuando se alcanza este valor, se bloquea toda la I/O para cualquier escritura nueva hasta que se hayan vaciado las páginas sucias.

vm.dirty_background_ratio=15
vm.dirty_background_ratio, el valor predeterminado es 10%, Cuando la cantidad de pagecache sucio excede este porcentaje, los hilos de reescritura comienzan a escribir en la memoria sucia. es el porcentaje máximo de memoria ((Caché + Libre) - Asignada)

De esta forma, solo cuando es estrictamente necesario y como último recurso, se hace uso de la memoria swap o memoria de intercambio.


Para cambiar los valores predeterminados de los parámetros del kernel, escribimos en Terminal el siguiente comando:
sudo nano /etc/sysctl.conf
sudo nano /etc/sysctl.conf




Añadimos al final del fichero:
vm.swappiness=1
vm.vfs_cache_pressure=50
vm.dirty_writeback_centisecs=1500
vm.dirty_expire_centisecs=4500
vm.dirty_ratio=30
vm.dirty_background_ratio=15


etc/sysctl.conf

etc/sysctl.conf




Guardamos los cambios pulsando en el teclado:
Control + o
Luego pulsamos la tecla Intro del teclado para aceptar

Cerramos el fichero pulsando en el teclado:
Control + x


Podemos ver las estadísticas en la página caché, en /proc/vmstat:
cat /proc/vmstat | egrep "dirty|writeback"


cat /proc/vmstat | egrep "dirty|writeback"





Estadísticas en la pagina cache
Estadísticas en la pagina cache




Con el comando free -m o free -h en Terminal, podemos observar una memoria RAM ocupada y la swap casi sin utilizar.


4.- Mover los archivos temporales a la RAM


En GNU/Linux es posible montar directorios en memoria RAM, esto nos permite obtener más velocidad en la escritura y lectura de datos, así como bajar la cantidad de operaciones en disco SSD, aumentando su vida útil al disminuir la escritura en disco.

/tmp, es un directorio volátil donde se almacenan los datos temporales utilizados por las aplicaciones y usuarios, la ventaja de montar /tmp en la RAM, es que los datos temporales que se escriben en /tmp serán mas rápidos de leer y escribir, dado que es la memoria RAM la que se usa, y no el disco SSD.

La velocidad de los programas o demonios que usan /tmp se incrementa, así como la limpieza en cada reinicio, el directorio se vacía porque reside en RAM, y no en disco.

tmpfs, normalmente también usa espacio de intercambio en situaciones en las que hay poca memoria volátil disponible, serán almacenados en RAM y no en nuestro disco duro, por lo que ganaremos en velocidad de escritura y lectura.

fstab (file systems table), se encuentra en el directorio /etc/ como parte de la configuración del sistema. Lo más destacado de este archivo es la lista de discos y particiones disponibles. En ella se indica como montar cada dispositivo y qué configuración utilizar.

El archivo /etc/fstab, es usado para definir cómo las particiones, los distintos dispositivos de bloques o sistemas de archivos remotos deben ser montados e integrados en el sistema. El punto de montaje para el sistema de ficheros.



Poniendo los temporales en la memoria RAM evitamos la escritura constante en el disco SSD, y por consiguiente extendemos su vida. Para realizarlo escribimos en Terminal el siguiente comando para modificar el archivo fstab:

sudo nano /etc/fstab
sudo nano /etc/fstab



Añadimos al final del fichero:
tmpfs /tmp tmpfs noatime,nodiratime,nodev,nosuid,mode=1777,defaults 0 0
tmpfs /var/tmp tmpfs noatime,nodiratime,nodev,nosuid,mode=1777,defaults 0 0


Temporales fstab
Temporales fstab




Guardamos los cambios pulsando en el teclado:
Control + o
Luego pulsamos la tecla Intro del teclado para aceptar

Cerramos el fichero pulsando en el teclado:
Control + x


Podríamos añadir el parámetro delimitador size antes de "defaults". Por ejemplo:
size=2G


size, marca el límite que pueden ocupar los temporales en memoria RAM, lo que no significa que necesariamente los temporales vayan a ocuparlos. Si no indicamos nada, por defecto el límite será la mitad de la RAM disponible.




5.- Montar el disco optimizando la lectura y escritura de datos



Hay tres maneras de identificar una partición o un dispositivo de almacenamiento en /etc/fstab:

Por el nombre del kernel, por la etiqueta o por la UUID (identificador único universal). La ventaja de usar etiquetas o UUID, es que no dependen del orden en el que las unidades están conectadas físicamente en el equipo.


Todas las particiones y dispositivos tienen un UUID único. Los UUID son generados por las utilidades de creación del sistema de archivos al crear o formatear una partición.



atime, Linux mantiene un registro que escribe en el disco de forma predeterminada de cada lectura efectuada en los archivos, es un inconveniente ya que incluso la lectura de un archivo desde la memoria caché (RAM) es registrado en el disco, por lo tanto este parámetro resulta contraproducente para un disco SSD al estar escribiendo constantemente nos crea un desgaste, que debemos evitar.


noatime, deshabilita completamente la actualización del tiempo de acceso a los archivos. Con esté parámetro mejoramos el rendimiento del equipo y aumentamos la vida útil del SSD. Si esta opción la configuramos en /etc/fstab, ganamos algo de velocidad y liberamos recursos de nuestro procesador y memoria.


Hay que tener cuidado al editar el fstab, ya que puede hacer que el sistema no arranque fácilmente.


Antes de nada, hacemos una copia de seguridad del archivo fstab:
sudo cp /etc/fstab /etc/fstab.old


Ahora vamos a configurar /etc/fstab añadiendo el parámetro noatime (desactiva atime), Para realizarlo escribimos en Terminal el siguiente comando para modificar el archivo fstab:
sudo nano /etc/fstab



Nos vamos a la línea de nuestra partición raiz / que pone:
UUID=xxxx-xxx-xx / ext4 errors=remount-ro 0 1 ( las x son dígitos hexadecimales )


Añadimos el parámetro:
noatime


Seguido de una coma ( , ) sin espacios delante de: errors=remount-ro 0 1



Nos queda la línea de nuestra partición raiz / de está forma:
UUID=14cc8f17-321c-4638-b87b-c071ad790c48 / ext4 noatime,errors=remount-ro 0 1

Parametros fstab

Parametros fstab




Guardamos los cambios pulsando en el teclado:
Control + o
Luego pulsamos la tecla Intro del teclado para aceptar

Cerramos el fichero pulsando en el teclado:
Control + x


Reiniciamos el equipo

 _____________________________
Más información:

https://slimbook.es/tutoriales/linux/93-optimizar-nuestro-ssd-en-linux

https://es.wikipedia.org/wiki/TRIM

https://en.wikipedia.org/wiki/I/O_scheduling

https://askubuntu.com/questions/78682/how-do-i-change-to-the-noop-scheduler

https://salmorejogeek.com/2016/05/23/discos-ssd-en-ubuntu-y-trim-lo-que-debes-saber/

https://www.atareao.es/como/prolongar-la-vida-de-tu-disco-ssd-en-ubuntu/

http://trastetes.blogspot.com/2015/06/8-cambiar-uso-memoria-ram-swappiness.html

http://trastetes.blogspot.com/2015/06/9-cambiar-uso-memoria-ram-cache.html

https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/

https://www.kernel.org/doc/Documentation/sysctl/vm.txt a 07-Jan-2019

http://hackingthesystem4fun.blogspot.com/2012/06/reducir-el-io-de-disco-para-escrituras.html

https://developer.ridgerun.com/wiki/index.php/Linux_Performance_and_Tuning_Tricks

https://wiki.archlinux.org/index.php/Fstab_(Espa%C3%B1ol)
_____________________________


Autor de las imágenes: Luis Cordero