Recopilación de algunas mejoras de rendimiento para diferentes escenarios. Incluye todas las versiones de Debian hasta Bookworm y para cualquier Raspberry que use alguna de estas versiones.
Hasta la versión de Debian Bookworm el archivo de configuración config.txt estaba en /boot/config.txt ahora lo podéis encontrar en /boot/firmware/config.txt. Lo mismo sucede con el fichero de configuración del kernel cmdline.txt pasa de estar en /boot/cmdline.txt a estar en /boot/firmware/cmdline.txt.
También se incluyen algunas recomendaciones, sobre todo para procesos de larga duración.
Rendimiento
En esta sección incluyo algunas mejoras que se pueden usar para mejorar el rendimiento. Hay que tener cuidado con algunas de ellas así que es bueno evaluar cada una para ver si proporciona el rendimiento esperado.
Reducir memoria dedicada a la gráfica
Para aumentar la memoria disponible del sistema se puede reducir la cantidad de memoria dedicada a la parte gráfica, esto no suele ser un problema ya que muchas veces Raspberry no se usa para aplicaciones gráficas.
Esto lo hacemos a través de la utilidad raspi-config, vamos a la opción Performance options -> GPU Memory e indicamos como valor 16 que es el mínimo permitido.
En Bookworm esto ha cambiado y ahora tenemos que editar manualmente el fichero config.txt. Añadimos esta línea en el fichero, por ejemplo antes de las opciones de audio (buscar dtparam), aquí podemos indicar el valor que queramos, no se recomiendan valores muy bajos (menores a 64MB), por ejemplo el mínimo para una Raspberry Pi 1 sería 16MB. Después de aplicar este cambio reiniciamos:
# Set memory split (add this line to set GPU memory allocation)
gpu_mem=16
Overclock
Existe también la opción de hacer overclocking a la Raspberry Pi a través de la herramienta raspi-config, vamos a la opción Performance options -> Overclock y elegimos una de las opciones para aumentar la velocidad del procesador, estas opciones son delicadas y no es recomendable usarla sobre todo porque Raspberry no tiene ningún sistema de refrigeración adicional.
Aumentar archivo swap
En general el tamaño del archivo swap es adecuado pero para ciertos procesos muy intensivos o Raspberry limitadas se puede aumentar para evitar que se quede colgada, la contrapartida es que esto producirá un mayor aumento de E/S por lo que el tiempo de vida de la tarjeta SD se puede ver reducida. Se puede aumentar de la siguiente forma:
Primero paramos el uso del archivo swap.
sudo dphys-swapfile swapoff
Ahora modificamos el tamaño del fichero dphys-swapfile, por ejemplo:
sudo nano /etc/dphys-swapfile
Vamos a elegir un tamaño de 256MB así que modificamos la siguiente línea.
CONF_SWAPSIZE=256
Y ahora podemos volver a habilitar el uso del fichero swap, primero lo inicializamos y luego lo arrancamos.
sudo dphys-swapfile setup
sudo dphys-swapfile swapon
Si queremos ver la memoria swap asignada así como la que está en uso podemos usar el comando top o htop o free -h.
Usando top la línea que tiene MiB Swap se refiere a la memoria swap, total es toda la que disponemos, free es la que actualmente no está en uso y used es la que está en uso, en avail Mem podemos ver la suma tanto de la memoria RAM como de la swap, haciendo un seguimiento de estos valores podemos tunear para escenarios concretos.
Usando zswap
zswap es un sistema de compresión de memoria RAM esto proporciona más memoria pero también un aumento del uso del procesador en el proceso de compresión, descompresión. Es útil en algunos escenarios donde los procesos consumen mucha memoria. Diría por las pruebas que he hecho que permite que ciertos procesos terminen y no se cuelguen pero no aumenta esencialmente la velocidad de los mismos. Los pasos serían:
Tenemos que añadir zswap.enabled = 1 al archivo /boot/cmdline.txt (/boot/firmware/cmdline.txt en bookworm) para habilitar zswap.
Otra opción sería usar zram, aquí y aquí un listado de ventajas e inconvenientes.
Habilitando z3fold & lz4 para zswap
Instalamos primero el paquete lz4, que es el compresor de menoría y z3fold es la forma en que se guardan estas páginas de memoria.
sudo apt-get install lz4
Después tenemos que comprobar si está habilitado initramfs, para eso editamos este fichero /etc/default/raspberrypi-kernel y comprobamos que está descomentada esta línea (No necesario para la version bookworm).
INITRD=Yes
En caso de que estuviese comentada posiblemente no tendríamos creado initramfs si quisiéramos verificarlo ejecutamos.
sudo update-initramfs -uv
Y la propia salida nos indicará si existe o no, en caso de que no exista ejecutamos el siguiente comando:
sudo update-initramfs -c -k $(uname -r)
Editamos el fichero /etc/initramfs-tools/modules y añadimos las siguientes líneas:
lz4
lz4_compress
z3fold
Y ejecutamos el siguiente comando para actualizar con los nuevos módulos:
update-initramfs -uv
Si da un error de hard link realmente es un aviso y no es un problema. Esta salida nos debería indicar también el nombre de la imagen, algo así como -este fichero se puede encontrar en /boot-:
‘/boot/initrd.img-6.6.20+rpt-rpi-v6‘ -> ‘/boot/firmware/initramfs’
(Este paso lo podemos omitir en bookworm) Después editamos config.txt y añadimos al final del fichero dentro de la sección general, es decir, ninguna sección que contenga un hardware concreto como [pi4] [pi3] [all]... siendo el valor el nombre de la imagen que nos ha sacado el comando anterior (no es necesario poner un «=»).
initramfs initrd.img-6.6.20+rpt-rpi-v6
Ahora editamos cmdline.txt y añadimos lo siguiente:
zswap.compressor=lz4 zswap.zpool=z3fold
Y reiniciamos, después para verificar que todo ha ido correcto ejecutamos:
grep -R . /sys/module/zswap/parameters
Que nos debería sacar como salida…
/sys/module/zswap/parameters/same_filled_pages_enabled:Y
/sys/module/zswap/parameters/enabled:Y
/sys/module/zswap/parameters/max_pool_percent:20
/sys/module/zswap/parameters/compressor:lz4
/sys/module/zswap/parameters/zpool:z3fold
/sys/module/zswap/parameters/accept_threshold_percent:90
En este punto la configuración del archivo config.txt auto_initramfs=1 se puede quitar por redundante pero tampoco afectará si se deja, esto asegura que al menos un initramfs se cargará al inicio, de hecho en Bookworm es la configuración recomendada y no usar la mencionada anteriormente.
Más información sobre las ventajas aquí y detalles de configuración aquí:
Usando ZRAM
A veces puede suceder que zswap no nos de el resultado esperado, podemos probar en ese caso con zram, para eso seguimos estos pasos:
sudo wget -O /usr/bin/zram.sh https://raw.githubusercontent.com/Bash-Projects/rpi_zram/master/zram.sh
Damos permisos para ejecutar el script que nos acabamos de descargar:
sudo chmod +x /usr/bin/zram.sh
Ahora lo vamos a programar para que se ejecute 50 segundos después del arranque, así que lanzamos crontab.
sudo crontab -e
y programamos la ejecución del script:
@reboot ( sleep 50 ; sudo /usr/bin/zram.sh &)
El comando lo podemos lanzar directamente para ver el resultado o podemos reiniciar y esperar 50 segundos para ver el resultado, podemos verificar el aumento de memoria usando:
free -h
para ver como ha aumentado la RAM y para poder ver el aumento en la swap usamos:
swapon -s
Recomendaciones
Recomendaciones para ciertas tareas que se suelen hacer con Raspberry de forma habitual.
Procesos de larga duración
Muchas veces tenemos que lanzar procesos en Raspberry que pueden tardar mucho tiempo, sobre todo en un sistema como Raspberry de capacidades limitadas, y queremos asegurarnos que el proceso termine aunque no vayamos a estar delante del terminal, aquí indico algunas formas de abordar este problema.
Usando comandos
A veces hay procesos que llevan mucho tiempo -por ejemplo compilar un contenedor-, la mejor opción es dejar ejecutando el comando build en el terminal pero a veces esta compilación se lanza desde una conexión ssh y al cerrar se puede terminar el proceso, para evitar esto se puede usar el comando nohup, por ejemplo:
nohup docker image build --tag user/imagen -f Dockerfile .
También se puede ejecutar en segundo plano añadiendo & al final del comando.
Si el comando ya se estaba ejecutando podemos usar el comando disown para conseguir el mismo efecto, en este caso primero pasamos el comando a segundo plano usando Ctrl+Z y usando el comando jobs veremos como el comando está detenido, ahora lo volvemos a arrancar pero esta vez en segundo plano usando:
bg %1
siendo 1 el número del trabajo y a continuación lo desasociamos del terminal usando:
disown -h %1
Si solo tenemos un trabajo podemos omitir %1 en los comandos ya que actuarán sobre el último proceso que se haya lanzado.
Con cualquiera de estos dos métodos el proceso seguirá ejecutándose aunque salgamos del terminal.
Un problema adicional es no saber que está haciendo el proceso, podemos guardar un log redireccionando a texto con > pero en ese caso no veremos por pantalla lo que está pasando para esto tenemos el comando tee que nos permite ver por pantalla y a la vez emitir a fichero lo que está pasando.
Este comando es un resumen de lo explicado, lanza el proceso en segundo plano y permite ver la salida por pantalla a la vez que se guarda en un fichero.
nohup docker image build --tag user/image -f Dockerfile . | tee out.txt &
Si cerramos la sesión y volvemos a conectar más adelante la forma cómoda de ver que está haciendo el trabajo sería usando el comando tail con el fichero que hemos indicado, usando el parámetro -f podemos ir viendo las actualizaciones a medida que el proceso escriba.
tail -f out.txt
Usando screen
Otra opción posiblemente más cómoda sea usando screen, permite tener una sesión de la que se pueda salir sin cerrar el proceso, tiene el problema que no es un paquete instalado por defecto así que primero lo instalamos.
sudo apt-get install screen
Para lanzarlo simplemente usamos el comando screen
screen
Aceptamos el mensaje y veremos un shell en el que podemos trabajar, algunos comandos útiles de screen.
# Listado de las sesiones activas
screen -ls
# Reanudar sesión, si solo hay una activa
screen -r
# Reanudar sesión, donde ID es el número que aparece antes del punto
screen -r ID
También tenemos unos atajos útiles:
Ctrl+A,D Desconectamos temporalmente de la sesión (esto NO interrumpe los procesos activos).
Ctrl+A,A Permite cambiar entre diferentes sesiones activas.
Capturar errores en comandos encadenados
Muchas veces en encadenamos comandos con && y puede ser que fallé alguno de esos comandos pero realmente no se dará la ejecución como fallida a no ser que falle el último, si queremos que cualquier comando produzca un error en toda la ejecución podemos usar pipefail:
set -eo pipefail
