Skip to content

Instantly share code, notes, and snippets.

@rubenher55
Created June 26, 2020 17:32
Show Gist options
  • Select an option

  • Save rubenher55/b00785d1e5f83527177c4e77033b7f50 to your computer and use it in GitHub Desktop.

Select an option

Save rubenher55/b00785d1e5f83527177c4e77033b7f50 to your computer and use it in GitHub Desktop.
OPTIMIZACION SSD ARCHLINUX
1. TRIM
REQUISITOS PARA PODER ACTIVAR TRIM
Para activar TRIM deberemos cumplir con las siguientes condiciones:
El sistema operativo tiene que soportar TRIM. Todas los sistemas operativos a partir de Windows 7 y las distros linux con un kernel igual o posterior al 2.6.28 soportan TRIM.
Disponer de una unidad SSD con un firmware que soporte TRIM. La totalidad de unidades SSD actuales tienen pleno soporte.
El sistema de archivos de vuestro equipo tiene que ser btrfs, ext3, ext4 gfs2m jfs, vfat, f2fs, ntfs, ocfs2 o xfs.
¿CÓMO ACTIVAR TRIM DE FORMA CORRECTA EN LINUX?
Existen dos modos de activar TRIM. Los modos son los siguientes:
TRIM Continuo: En modo continuo ejecutará TRIM cada vez que borremos un archivo de nuestra unidad de almacenamiento.
TRIM periódico: Se aplicará TRIM de forma periódica y automática en la fecha y hora que especifiquemos. Normalmente es suficiente ejecutar TRIM una vez por semana.
¿Hay que usar TRIM en modo continuo o en modo periódico?
En mi caso recomiendo activar TRIM de forma periódica. Activar TRIM en modo continuo genera los siguientes inconvenientes:
Reducción de la vida útil de la unidad de almacenamiento. TRIM en modo continuo implica lecturas y escrituras adicionales a nuestra unidad de almacenamiento.
Rendimiento inferior al esperado. En determinados casos se pueden producir congelaciones y corrupción del sistema de archivos. Por ejemplo, en mi caso de forma aleatoria se me congela Chrome durante segundos.
Imposibilidad de recuperar archivos borrados. Si borramos un fichero por equivocación nos será prácticamente imposible recuperarlo.
Por lo tanto, en este artículo aprenderemos a configurar y activar TRIM para que únicamente se ejecute de forma periódica.
Al usar TRIM en modo periódico únicamente recomiendo no andar justos de capacidad de almacenamiento en nuestro SSD.
1. Activar TRIM periódico en Linux usando systemd
Para poder usar fstrim tenemos que asegurar que el paquete util-linux esté instalado. Para ello ejecutamos el siguiente comando en la terminal:
sudo apt install util-linux
Nota: En el caso que no usen el gestor de paquete apt deberán modificar el comando que acabamos de ejecutar.
En el caso que sean usuarios de Debian 8 y 9 ejecuten el siguiente comando para crear los servicios de Systemd:
sudo cp /usr/share/doc/util-linux/examples/fstrim.{service,timer} /etc/systemd/system
A continuación, todos los usuarios de cualquier distro deberán ejecutar el siguiente comando para habilitar TRIM:
sudo systemctl enable fstrim.timer
Acto seguido ejecutaremos el siguiente comando para iniciar el servicio:
sudo systemctl start fstrim.timer
En estos momento el soporte TRIM debería estar habilitado. Para comprobar que está habilitado tan solo tenemos que ejecutar el siguiente comando:
sudo systemctl status fstrim.timer
El resultado obtenido en mi caso es el siguiente:
● fstrim.timer - Discard unused blocks once a week
Loaded: loaded (/lib/systemd/system/fstrim.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Fri 2019-02-22 19:47:05 CET; 22min ago
Trigger: Mon 2019-02-25 00:00:00 CET; 2 days left
Docs: man:fstrim
Si analizamos la salida del comando vemos la palabras active y waiting. Por lo tanto TRIM está habilitado. Otra información que podremos encontrar es la siguiente:
Se ejecutará TRIM una vez por semana en todas las particiones montadas de nuestra unidad de almacenamiento SSD.
Se aplicará todos los Lunes a las 00:00 horas.
La hora en que se ha levantado el servicio fstrim.
2. Activar TRIM en volúmenes LVM
NO LO HE ACTIVADO
Para activar TRIM en volúmenes LVM deberemos ejecutar el siguiente comando en la terminal:
sudo nano /etc/lvm/lvm.conf
Cuando se abra el editor de textos cambiaremos el valor issue_discards de 0 a 1. De tal forma que quede del siguiente modo:
# [...]
devices {
# [...]
issue_discards = 1
# [...]
}
# [...]
Una vez aplicados los cambios los guardamos y reiniciamos el ordenador.
Activar TRIM en particiones cifradas con dm-crypt
3. Para habilitar TRIM en particiones cifradas realizaremos lo siguiente. Abriremos una terminal y ejecutaremos el siguiente comando:
NO LO HE ACTIVADO
sudo nano /etc/crypttab
Cuando se abra el editor de textos añadiremos la opción discard en el apartado <options>.
<target name> <source device> <key file> <options>
sda3_crypt /dev/sda3 none luks,discard
Una vez realizadas las modificaciones guardamos los cambios y cerramos el fichero.
Finalmente actualizaremos la configuración de arranque del sistema ejecutando el siguiente comando en la terminal:
sudo update-initramfs -u -k all
Ver la periodicidad con que se ejecuta TRIM
Para ver la periodicidad con que se ejecutará TRIM tan solo tenemos que ejecutar el siguiente comando en la terminal:
cat /etc/systemd/system/timers.target.wants/fstrim.timer
En mi caso el resultado obtenido es el siguiente:
[Unit]
Description=Discard unused blocks once a week
Documentation=man:fstrim
[Timer]
OnCalendar=weekly
AccuracySec=1h
Persistent=true
[Install]
WantedBy=timers.target
Analizando la salida del comando podemos observar lo siguiente:
TRIM se ejecuta una vez a la semana. La frecuencia es más que correcta y no recomiendo que se modifique. Si quisierais cambiar la frecuencia tan solo tendríamos que reemplazar weekly por otro valor como por ejemplo Mon,Tue *-*-01..04 12:00:00. Está ejemplo ejecutaría TRIM los 4 primeros días del mes siempre y cuando sean Lunes o Martes a las 12 del mediodía.
La precisión temporal con que se ejecutará la tarea TRIM será de ± 1 hora.
El valor de persistencia está fijado en True. De este modo, aunque el ordenador no esté abierto a la hora que se tiene que ejecutar, TRIM se ejecutará al abrirlo.
Comprobar la última vez que se ejecuto TRIM
Para comprobar la última vez que se aplico TRIM ejecutamos el siguiente comando en la terminal:
systemctl list-timers fstrim.timer --all
El resultado obtenido en mi caso es el siguiente:
NEXT LEFT LAST PASSED UNIT ACTIVATES
Mon 2019-02-18 00:00:00 CET 1 day 13h left Mon 2019-02-11 08:39:42 CET 5 days ago fstrim.timer fstrim.service
Si analizamos la salida del comando vemos lo siguiente:
Trim se ejecutará el próximo Lunes a las 00:00 horas.
Falta 1 día y 13 ahora para que se ejecute Trim.
La última vez en que se ejecuto fue el pasado Lunes a la 08:39:42h. No se ejecuto a las 00:00 porque en este momento el ordenador estaba apagado. Por lo tanto cuando TRIM se ejecuto cuando abrí el ordenador
Consultar los logs de TRIM
Si queremos consultar los logs de TRIM podemos ejecutar el siguiente comando en la terminal:
sudo journalctl -u fstrim.timer
Cada vez que reiniciemos el ordenador o servidor se borrará el log de fstrim.timer. Si queréis que el log sea persistente tendréis que realizar lo siguiente.
Inicialmente crearemos la carpeta que almacenará los logs ejecutando el siguiente comando en la terminal:
sudo -p mkdir /var/log/journal
Acto seguido indicamos que los logs del espacio volátil /run/log/journal/ se almacenen en /var/log/journal ejecutando el siguiente comando:
sudo systemd-tmpfiles --create --prefix /var/log/journal
Finalmente reiniciamos el servicio systemd-journald ejecutando el siguiente comando:
sudo systemctl restart systemd-journald
4. Actualizar firmware de SSD
CRUCIAL
O desde su pagina con su software o ver Wiki.
SAMSUNG
O desde su pagina con su software o ver Wiki.
5. Optimizar lectura/escritura en SSD /etc/fstab
En este archivo no he tocado nada esta vez de lectura y escritura, seguire investigando ya que al trabajar con LVM on LUKS no recomiendan tocar por problemas de seguridad.
Lo que si he añadido es la carpeta /tmp a RAM.
En principio los otros discon del LVM on LUKS se quedan por defecto.
/dev/mapper/mi-disco-cifrado /mnt/mi-disco-cifrado ext4 defaults 1 2
tmpfs /tmp tmpfs noatime,nodiratime,nodev,nosuid,mode=1777,defaults 0 0
6. Optimizar el uso de la partición SWAP
El valor de intercambio representa cuando el kernel prefiere la swap a la RAM. Configurarlo a un valor muy bajo, significa que el kernel casi siempre usara la RAM. Lo que mejorara el desempeño, para hacer esto debemos agregar estas lineas al archivo
Para ello modificamos el archivo /etc/sysctl.d/99-sysctl.conf
vm.swappiness=20
vm.vfs_cache_pressure=50
7. Temporales de Navegadores en RAM
En Firefox que es el que utilizo se cambian 3 parametros en la configuración del navegador.
about:config
browser.cache.disk.enable = FALSE
browser.cache.memory.enable = TRUE
browser.cache.memory.max_entry_size = -1
Para otros navegadores hay que editar el archivo FSTAB.
8. Modificar la frecuencia con la que el sistema borra los archivos temporales
Tanto la carpeta /tmp (que en mi caso deberá estar vacio ya que la he montado en RAM) como la carpeta /var/tmp.
Para ello modificaremos el siguiente archivo:
sudo nano /usr/lib/tmpfiles.d/tmp.conf
Añadiendo o modificando el archivo para que tenga la siguiente línea:
D /var/tmp 1777 root root 30d
9. I/O Schedulers
Debera mostrar mq-deadline que es el formato correcto para SSD o en su defecto noop.
To list the available schedulers for a device and the active scheduler (in brackets):
cat /sys/block/sda/queue/scheduler
mq-deadline kyber [bfq] none
To list the available schedulers for all devices:
grep "" /sys/block/*/queue/scheduler
/sys/block/pktcdvd0/queue/scheduler:none
/sys/block/sda/queue/scheduler:mq-deadline kyber [bfq] none
/sys/block/sr0/queue/scheduler:[mq-deadline] kyber bfq none
10. Temporales en Ram (tmpfs)
Modificar el archivo /etc/fstab añadiendo la línea siguiente al final:
tmpfs /var/tmp tmpfs noexec,rw,auto,nouser,sync,noatime,nodev,nosuid,mode=1777 0 0
Si utilizamos mucha RAM, por ejemplo, por que utilizamos máquinas virtuales, podremos limitar el uso de la RAM añadiendo el parámetro delimitador size. Con este parámetro estamos ordenando al sistema, que bajo ningún concepto conceda más RAM a dichos puntos de montaje que el indicado con el parámetro size. A continuación ponemos un ejemplo de como limitar el tamaño asignado a 2GB:
tmpfs /tmp tmpfs size=2G,noexec,rw,auto,nouser,sync,noatime,nodev,nosuid,mode=1777 0 0
A continuación explicamos algunas de las opciones de montaje:
noatime: Deshabilita por completo el registro de tiempo de acceso para cualquier archivo. Implica la aplicación de nodiratime. Teniendo en cuanta que además se anota el acceso a los ficheros cacheados y el acceso constante a todos los ficheros de procesos del sistema, es un número muy importante de escrituras de fechas de acceso. Al reducir la cantidad de escrituras que el sistema operativo realiza sobre el disco, incrementamos la vida de la unidad SSD.
nodiratime: Deshabilita el registro de tiempos de acceso para los directorios, pero mantiene activo el registro para los archivos.
relatime: Limita el registro de timestamps únicamente a aquellos casos en que el archivo se modifica.
De las tres opciones anteriores, la opción menos invasiva es claramente relatime, que ya de por sí ofrecerá alguna ganancia en el rendimiento de nuestros discos duros, sobre todo mecánicos. La opción que más rendimiento ofrece es noatime.
size: Limita el tamaño que se utilizará de RAM
defaults: Asigna las opciones de montaje predeterminadas que serán utilizadas para el sistema de archivos. Las opciones predeterminadas para ext4 son: rw, suid, dev, exec, auto, nouser, async.
rw: Monta el sistema de archivos en modo lectura-escritura.
ro: Monta el sistema de archivos en modo sólo lectura.
suid: Permite las operaciones de suid, y sgid bits. Se utiliza principalmente para permitir a los usuarios comunes ejecutar binarios con privilegios concedidos temporalmente con el fin de realizar una tarea específica.
nosuid: Bloquea el funcionamiento de suid, y sgid bits.
exec: Permite la ejecución de binarios residentes en el sistema de archivos.
noexec: No permite la ejecución de binarios que se encuentren en el sistema de archivos.
auto: El sistema de archivos será montado automáticamente durante el arranque, o cuando la orden mount -a se invoque.
noauto: El sistema de archivos no será montado automáticamente, solo cuando se le ordene manualmente.
user: Permite a cualquier usuario montar el sistema de archivos. Esta opción incluye noexec, nosuid, nodev, a menos que se indique lo contrario.
nouser: Solo el usuario root puede montar el sistema de archivos.
users: Permite que cualquier usuario perteneciente al grupo users montar el sistema de archivos.
owner: Permite al propietario del dispositivo montarlo.
dev: Intérprete de los dispositivos especiales o de bloque del sistema de archivos.
nodev: Impide la interpretación de los dispositivos especiales o de bloques del sistema de archivos.
sync: Todo el I/O se debe hacer de forma sincrónica.
async: Todo el I/O se debe hacer de forma asíncrona.
discard: Emite las órdenes TRIM para dispositivos de bloques subyacentes cuando se liberan los bloques. Recomendado para usar si el sistema de archivos se encuentra en un sistemas de ficheros ubicados en unidades SSD.
nodelalloc: Desactiva la función de ext4 de delayed allocation, que reserva el espacio pero no lo escribe. Aplaza la escritura de bloques hasta que se esté en el tiempo de escritura. Es más que nada por seguridad.
barrier=0: Desactiva las barreras automáticamente. Se refiere a los límites de escritura. Si es igual a cero los elimina, si es igual a 1, los activa. Podemos prescindir de estas barreras si los discos están protegidos contra cortes de corriente. Sólo en este caso, incluimos la opción barrier=0
i_version: Habilita el uso de la versión extendida de 64 bits en sistemas de ficheros ext4.
commit=30: Retrasa la escritura de los metadatos de ficheros, con lo que se reduce mucho el uso de disco. No recomendable si estuviésemos en un ordenador con batería.
inode_readahead_blks=64: Aumenta de 32 a 64 el tamaño de los bloques de lectura.
data=writeback: Evita que los metadatos de los archivos sean escritos de forma lenta tras escribir los archivos. Esta opción no provoca corrupción en el sistema de archivos, pero puede provocar que los cambios mas recientes se pierdan si cae el sistema. No lo incluiremos en nuestros ejemplos ya que no funciona en algunos sistemas.
flush: La opción vfat permite eliminar datos con más frecuencia, de modo que los cuadros de diálogo de copia o las barras de progreso se mantenga hasta que se hayan escrito todos los datos.
nofail: Monta el dispositivo cuando está presente, pero ignora su ausencia. Esto evita que se cometan errores durante el arranque para los medios extraíbles.
mode=1777: Permite que cualquiera pueda crear archivos, pero protegiéndolos de la manipulación de otros usuarios.
11. Deshabilitar Hibernación y Suspensión
Deshabilitar suspender e hibernar
La siguiente regla desactiva la suspensión e hibernación para todos los usuarios.
/etc/polkit-1/rules.d/10-disable-suspend.rules
polkit.addRule (función (acción, asunto) {
if (action.id == "org.freedesktop.login1.suspend" ||
action.id == "org.freedesktop.login1.suspend-multiple-sessions" ||
action.id == "org.freedesktop.login1.hibernate" ||
action.id == "org.freedesktop.login1.hibernate-multiple-sessions")
{
return polkit.Result.NO;
}
});
12. Reflector (actualizador de Mirrorlist)
Reflector es un script que puede recuperar la última lista de servidores de réplicas desde la página MirrorStatus, filtrar la mayoría de los servidores de réplicas actualizados, ordénarlos por velocidad y sobrescribir el archivo /etc/pacman.d/mirrorlist.
Por ejemplo:
reflector --verbose --latest 5 --sort rate --save /etc/pacman.d/mirrorlist
Despues podemos asociar esta tarea para que se repita periódicamente. Esto vale para diferentes tareas y se puede realizar en Arch de 3 maneras diferentes:
Hook de pacman
Puede crear un hook de pacman que ejecute reflector y elimine el archivo .pacnew creado cada vez que pacman-mirrorlist obtenga una actualización:
/etc/pacman.d/hooks/mirrorupgrade.hook
[Trigger]
Operation = Upgrade
Type = Package
Target = pacman-mirrorlist
[Action]
Description = Actualizar pacman-mirrorlist con reflector y eliminar pacnew...
When = PostTransaction
Depends = reflector
Exec = /bin/sh -c "reflector --country 'United States' --latest 200 --age 24 --sort rate --save /etc/pacman.d/mirrorlist; rm -f /etc/pacman.d/mirrorlist.pacnew"
Asegúrese de sustituir los argumentos de reflector con los que desee.
Servicio systemd
Este es un ejemplo de unidad de servicio (de systemd) que espera a que la red esté activa y conectada antes de ejecutar reflector:
/etc/systemd/system/reflector.service
[Unit]
Description=Actualizar la lista de servidores de réplica de pacman
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/reflector --protocol https --latest 30 --number 20 --sort rate --save /etc/pacman.d/mirrorlist
[Install]
RequiredBy=multi-user.target
Inicie reflector.service para actualizar la lista de servidores de réplica. Para actualizar la lista de servidores de réplica cada vez que arranque el equipo, active el servicio.
Nota: para obtener más información sobre la implementación de la dependencia de la conexión de red, consulte Systemd#Running services after the network is up.
Temporizador de systemd
Si desea ejecutar reflector.service semanalmente, cree un archivo .timer asociado. Por ejemplo::
/etc/systemd/system/reflector.timer
[Unit]
Description=Ejecutar reflector semanalmente
[Timer]
OnCalendar=Mon *-*-* 7:00:00
RandomizedDelaySec=15h
Persistent=true
[Install]
WantedBy=timers.target
Y luego solo tiene que iniciar reflector.timer.
Tarea de cron
Para actualizar la lista servidores de réplica diariamente, considere lo siguiente:
/etc/cron.daily/mirrorlist
#!/bin/bash
# Obtener los del país
/usr/bin/reflector -c "India" -p http --sort rate > /etc/pacman.d/mirrorlist
# Trabajar con otras alternativas
/usr/bin/reflector -p http --latest 20 -p https -p ftp --sort rate >> /etc/pacman.d/mirrorlist
13. Instalar Yay (helper de repositorio AUR)
Para instalar Yay:
sudo pacman -S --needed base-devel git wget yajl {Instalar helper yay}
cd /tmp
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si
yay es un ayudante de AUR escrito en el lenguaje Go. Este ayudante nos ofrece una interfaz muy mínima, una búsqueda similar a Yaourt y sobre todo no requiere dependencias para su funcionamiento.
Los comandos básicos de uso son, por ejemplo para buscar un paquete o aplicacion:
yay -Ss <package-name>
Para instalar una aplicación usando yay:
yay -S <package-name>
Si quieren realizar una actualización del sistema
yay -Syu
Actualizar el sistema, incluyendo los paquetes instalados de AUR.
yay -Syua
Podemos instalar algún gestor de paquetes grafico para buscar e instalar paquetes tanto oficiales como de repositorios AUR como por ejemplo Pamac u Octopi
14. Solucionar posible problema en Discover (no aparecen aplicaciones)
sudo pacman -Qi discover
sudo pacman -S packagekit-qt5 fwupd
sudo pacman -S appstream
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment