Configurando tu ODROID: El ODROID-XU4 como un NAS polivalente y versátil

Compré mi ODROID-XU4 con la intención de convertirlo en un NAS. Sin embargo, no quería decidirme por una distribución NAS especializada como OpenMediaVault porque quería que mi ODROID-XU4 hiciera más cosas aparte de ser un simple NAS. Por ejemplo, tenía pensado transcodificar programas de TV grabados desde mi televisor al estándar H264, usando la codificación por hardware del ODROID-XU4 (tal y como se describe en http://bit.ly/2jnv4Za), y también hacer uso de los pines GPIO más adelante. Un problema añadido que tiene OpenMediaVault es que se ejecuta sobre Debian, y yo quería seguir usando Ubuntu para beneficiarse de los nuevos paquetes.

Pierdo muchas de las ventajas de utilizar una distribución especializada y, en consecuencia, tengo que descubrir formas alternativas de hacer las cosas de una manera sencilla y amigable. Todo esto representa una gran oportunidad para adquirir nuevos conocimientos.

Estos son los pasos que debemos seguir:

  • Instalar Webmin (http://bit.ly/J5WtfI) para facilitar la administración
  • Montar los discos
  • Configurar recursos compartidos en red (Samba/NFS)
  • Instalar Owncloud
  • Asegurar y optimizar el sistema operativo

Estas instrucciones dan por sentado que cuentas con una experiencia del sistema de nivel medio o superior.

Webmin

Todo NAS necesita una buena GUI web. Desafortunadamente, la GUI de OpenMediaVault no es una opción, y después de buscar alternativas durante bastante tiempo, decidí usar Webmin. Webmin ha existido desde 1997 y tiene un sólido soporte para tareas generales de mantenimiento de servidores. Tiene la ventaja de que incluso los usuarios inexpertos pueden desenvolverse con la ayuda integrada para configurar y administrar todo tipo de servidores como Apache, MySQL, Mail, DNS y más. Tiene un soporte muy bueno para la administración de RAID y LVM, y también admite el uso compartido de archivos por Samba y NFS. Desafortunadamente, carece de soporte para servicios más recientes como Transmission o Owncloud, pero siempre puedo configurarlos manualmente.

Para instalarlo, sigue los siguientes pasos:

$ echo "deb http://download.webmin.com/download/repository sarge contrib" | sudo tee /etc/apt/sources.list.d/webmin.list
$ wget http://www.webmin.com/jcameron-key.asc
$ sudo apt-key add jcameron-key.asc
$ rm jcameron-key.asc
$ sudo apt-get update
$ sudo apt-get install libapt-pkg-perl libnet-ssleay-perl libauthen-pam-perl libio-pty-perl apt-show-versions apt-transport-https
$ sudo apt-get install webmin
$ sudo systemctl enable webmin
$ sudo systemctl start webmin
Puedes iniciar sesión con la dirección IP de tu dispositivo en el puerto 10000 y así poder usar la interfaz web: https://ip-odroid: 10000. Sin embargo, después de iniciar sesión (con cualquier usuario del sistema con acceso sudo) es posibles que no quedes muy impresionado con la interfaz por defecto. Parece que ha salido de la década de los 90.

Figura 1 - Interfaz estándar de Webmin

Lo primero que debemos hacer es mejorar su aspecto con ayuda de un tema. El tema más atractivo se llama "Authentic Theme", que ofrece muchas funciones, incluso permite el uso amigable de dispositivos móviles. Puede obtener la última versión desde http://bit.ly/2jf468e e instalarla usando el siguiente comando:

$ wget https://github.com/qooob/authentic-theme/releases/download/19.12/authentic-theme-19.12.wbt.gz
Navega dentro de Webmin a “Webmin Configuration -> Webmin Themes -> Install themes -> From uploaded file" y selecciona el tema descargado recientemente. Tras una breve espera y actualizar, aparecerá la siguiente página:

Figura 2 - Webmin con Authentic theme

Puedes explorar las características de Webmin utilizando la herramienta de búsqueda de la interfaz. Tenga en cuenta que puede instalar módulos de terceros disponibles en http://bit.ly/2jf6KLd.

Montando los discos

Primero, deberá decidir si va a utilizar RAID o LVM con tus discos y qué sistema de archivos usarás. No voy a entrar en detalles sobre la configuración RAID/LVM porque el tema ya ha sido discutido en anterios artículos. Sin embargo, incluso sin tener mucha experiencia, puedes usar Webmin para que éste haga el trabajo pesado por ti y usar la ayuda integrada para obtener más información. Webmin te solicitará que instales las dependencias que falten. Una vez que tengas listas tus particiones, puedes empezar a montarlas.

El método tradicional para montar el disco es usar /etc/fstab (y Webmin tiene un completo módulo para gestionar también esto), pero puedes tener problemas si inicias tu sistema sin el disco conectado (al sistema le gusta esperar al disco). Prefiero usar autofs, que monta los discos (locales o en red) a demanda y los desmonta cuando no están en uso. Desafortunadamente, webmin no lo gestiona, de modo que necesitarás tirar del intérprete de comandos:

$ sudo apt-get install autofs
Tendrás que editar /etc/auto.master y añadir una entrada para montar tu disco, especificando el directorio base y su archivo de configuración:
$ sudo vi /etc/auto.master
# add at the end your mountpoint
/media/yourdisk /etc/auto.yourdisk --timeout 20
En el comando anterior, reemplaza tu disco por la ruta que desea usar. Luego, edita este archivo de configuración y agrega tus particiones y sus parámetros de montaje, usando el comando "blkid" para localizar el UUID correcto del disco:
$ sudo blkid
$ sudo vi /etc/auto.yourdisk
xfs-partition   -fstype=xfs,dev,exec,suid,noatime       :UUID=9d2d675d-cb08-45b2-b222-c981a8d00c06
Reinicia autofs, y cuando accedas a /media/yourdisk/xfs-partition, tu partición se montará automáticamente:
$ sudo service autofs restart
Tendrás que encargarete de los parámetros de montaje porque cada sistema de archivos tiene sus propios parámetros y pueden afectar al rendimiento. Por ejemplo, sino activas el parámetro big_writes en NTFS, tendrás un rendimiento muy bajo. En caso de duda, puedes ser un poco chapucero y usar Webmin para crear entradas en /etc/fstab, probarlas para asegurarte de que los parámetros son correctos y migrarlas al diseño de autofs más tarde (eso es lo que yo hice). Para forzar el desmontaje de los discos, simplemente puede reiniciar el servicio autofs.

Configurar recursos compartidos

Para configurar recursos compartidos por Samba (y también para instalar Transmission para poder descargar torrents), puede seguir la guía "Diseñando su propio seedbox" que aparece en Odroid Magazine http://bit.ly/2j3xpaK. También puede experimentar con la interfaz de Webmin y crear fácilmente recursos compartidos y usuarios con unos cuantos clics. Por ejemplo, la Figura 3 muestra el cuadro de diálogo "Crear recurso compartido NFS". Al hacer clic en los elementos del formulario, se muestra un menú de ayuda contextual que explica muy bien qué hace ese elemento en concreto. Esto puede ayudarte con ciertas cosas con las que quizás no estés muy familiarizado.

Figura 3 - Creando un recurso NFS

A la hora de crear recursos compartidos Samba/NFS, ten en cuenta la seguridad desde el principio. Samba se autentifica mediante un ID del usuario y una contraseña, pero NFS autentifica a los usuarios solo por IP. Si conoces qué dispositivos de tu red pueden tener acceso a los recursos compartidos específicos, detállalos en la configuración. Por ejemplo, un recurso compartido NFS podría exportarse a "Todos", pero el acceso aún puede estar limitado con iptables o /etc/hosts.allow y /etc/hosts.deny (que son utilizados por el módulo Wrappers TCP de Webmin).

Figura 4 – Configuración de ./etc/hosts.allow para NFS con el fin de limitar el acceso a unos cuantos dispositivos

Utilizado con su configuración por defecto, Samba te dará un rendimiento decente, pero con los ajustes que detallo a continuación, extraídos de los foros ODROID, deberías obtener menos "pausas" en las transferencias de archivos de gran tamaño. Añade las siguientes líneas a la sección [global] de tu /etc/samba/smb.conf:

write cache size = 524288
getwd cache = yes
use sendfile = yes
min receivefile size = 16384

Instalar Owncloud

Owncloud es un servicio personal "en la nube" que te permite compartir archivos con personas a través de Internet. No voy a entrar en los detalles de la instalación, porque ya han sido tratados en un artículo anterior de la revista http://bit.ly/2kgVZpn, aunque hay algunas cuestiones que me gustaría puntualizar.

Lo primero de todo, la instalación es bastante simple en Ubuntu 16.04. Utilicé la guía  http://do.co/2bzxhxG y logré ponerlo en funcionamiento en 10 minutos. Si tienes un nombre DNS (por ejemplo, DNS dinámico para tu hogar), debes dedicar un tiempo a obtener un certificado SSL válido desde Let's Encrypt (http://bit.ly/1qmIXIY) siguiendo los pasos que aparecen en http://do.co/2bQpv4M.

Básicamente debes instalar los siguientes requisitos previos antes de instalar OwnCloud

$ sudo apt-get install php \
  libapache2-mod-php php-mcrypt \
  php-mysql php-bz2 php-curl \
  php-gd php-imagick php-intl \
  php-mbstring php-xml php-zip \
  mysql-server apache2
A continuación, instala el repositorio de OwnCloud para Ubuntu y actualiza los paquetes disponibles:
$ sudo curl https://download.owncloud.org/download/\
repositories/stable/Ubuntu_16.04/Release.key \
| sudo apt-key add -
$ echo 'deb https://download.owncloud.org/download/\
repositories/stable/Ubuntu_16.04/ /' \
| sudo tee /etc/apt/sources.list.d/owncloud.list
$ sudo apt-get update
Por último, procede a instalar OwnCloud:
$ sudo apt-get install owncloud
$ sudo systemctl reload apache2
También necesitarás crear un usuario de base de datos para OwnCloud:
$ sudo mysql -u root
> CREATE DATABASE owncloud;
> GRANT ALL ON owncloud.* to 'owncloud'@'localhost' IDENTIFIED BY 'databasePassword';
> FLUSH PRIVILEGES;
> exit
Después de todo este trabajo, podrás iniciar sesión a través de la interfaz web https:///owncloud y finalizar la instalación. Puesto que OwnCloud debe ser accesible a través de Internet, debes tomarte un tiempo para reforzar tu instalación, tal y como se describe en http://bit.ly/2jOTe1F. En mi caso, quería ejecutar el servicio OwnCloud en un puerto diferente (para que los usuarios externos no tengan acceso a mis sitios internos), definir reglas iptables para permitir el acceso solo desde mi país (en base a datos de geo-ip) y configurar fail2ban para protegerme del cálculo automático de contraseñas.

Para ejecutar el host virtual OwnCloud en un puerto diferente, debes realizar algunos ajustes en tu configuración de Apache:

$ sudo cp /etc/apache2/sites-available/default-ssl.conf \
  /etc/apache2/sites-available/owncloud.conf
$ cd /etc/apache2/sites-available
$ sudo ln -s ../sites-available/owncloud.conf \
  020-owncloud.conf
Después, edita /etc/apache2/sites-available/owncloud.conf y realiza los siguientes cambios:

Añade "Listen 8443" como primera fila. Cambia la definición de VirtualHost para usar el puerto 8443 en lugar del 443 (). Cambia DocumentRoot para que apunte a tu instalación de owncloud "DocumentRoot /var/www/owncloud".

Cuando termines, puedes reiniciar el demonio de Apache y solo podrá acceder a tu instalación de OwnCloud desde https://: 8443/.

Para empezar con las reglas de firewall GeoIP, necesitarás tener las fuentes del kernel (o las cabeceras del kernel) disponibles. A continuación, procede a instalar los módulos adicionales de iptables con el siguiente comando:

$ sudo apt-get install \
  xtables-addons-dkms \
  xtables-addons-common \
  xtables-addons-source
El paquete dkms no se instalará limpiamente porque algunos de los módulos no compilan con el kernel 4.9/4.14. Puedes deshabilitar los módulos que fallan y volver a compilar el resto fijando los siguientes parámetros con "n" en lugar de "m" en el archivo /var/lib/dkms/xtables-addons/2.10/build/mconfig:
$ sudo vi /var/lib/dkms/xtables-addons/2.10/build/mconfig
build_ACCOUNT=n
build_LOGMARK=n
build_SYSRQ=n
build_pknock=n
build_psd=n
Después, tendrás que compilar manualmente el resto:
$ cd /var/lib/dkms/xtables-addons/2.10/build/
$ sudo autoconf
$ sudo ./configure
$ sudo make
$ sudo make install
Antes de usar el módulo geoip, necesitarás iniciar la base de datos geoip (el prefijo para la asignación del país). Es posible que tengas que repetir este paso de vez en cuando para beneficiarte de los últimos datos:
$ sudo apt-get install libtext-csv-xs-perl
$ sudo mkdir /usr/share/xt_geoip
$ sudo /usr/lib/xtables-addons/xt_geoip_dl
$ sudo /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip /root/GeoIPCountryWhois.csv
Todo lo que queda por hacer ahora es crear y probar las reglas iptables para permitir unicamente el tráfico que deseas que llegue a tu configuración de owncloud. Una posible regla podría ser:
$ sudo iptables -N geo-owncloud
$ sudo iptables -A INPUT -p tcp -m tcp --dport 8443 -j geo-owncloud
$ sudo iptables -A geo-owncloud -s 192.168.1.0/24 -j ACCEPT
$ sudo iptables -A geo-owncloud -m geoip ! --src-cc RO -j DROP
No olvides guardar tus reglas y aplicarlas al inicio (ya sea con iptables-save o con webmin). Puedes encontrar más detalles sobre geoip en http://bit.ly/2jnwUJD.

Configurar fail2ban no es muy complicado una vez que sigues el tutorial http://bit.ly/2kipXxn. Recuerda instalar fail2ban primero (y probarlo con algunas credenciales falsas):

$ sudo apt-get install fail2ban
Figura 5 - Fail2Ban haciendo su trabajo con intentos de inicio de sesión fallidos

Puesto que hemos añadido un puerto especial para owncloud, tendremos que retocar la configuración de fail2ban para dar cuenta de ello. Edite /etc/fail2ban/jail.local y agrega "port 8443" a la línea del puerto y reinicia fail2ban:

$ sudo vi /etc/fail2ban/jail.local
port = http,https,8443
$ sudo service fail2ban restart
Para levantar manualmente la prohibición de una dirección IP incluida en la lista negra, puedes ejecutar el siguiente comando:
$ sudo fail2ban-client set owncloud unbanip 172.22.22.2

Asignar tareas a CPU específicas

El ODROID-XU4 viene con dos tipos de núcleos de CPU: 4 núcleos pequeños de baja potencia que son más adecuados para tareas en segundo plano y 4 núcleos grandes que están diseñados para soportar tareas más pesadas. El kernel oficial viene con un programador de tareas "mágico" de Samsung que conoce la verdadera potencia del procesador, y puede cambiar tareas de los núcleos pequeños a los núcleos grandes cuando la carga de trabajo es alta. Puede haber casos especiales en los que desee ejecutar tareas específicas exclusivamente en los núcleos grandes o pequeños, ya sea para maximizar el rendimiento o para minimizar la temperatura. Podemos usar el uso de cgroups como se indica en http://bit.ly/2jP6KlU .

"Cgroups" es una característica de los kernels modernos que permite la asignación de recursos para varios procesos. En nuestro caso, necesitaremos el cgrupo "cpuset" para crear un grupo "littlecores" y un grupo "bigcores". Cada grupo obligará a los procesos a ejecutarse en núcleos específicos determinando la afinidad. De modo que, los littlecores tendrán las cpus 0-3 y bigcores las 4-7. Afortunadamente, crear los cgroups es muy fácil:

# mkdir -p /sys/fs/cgroup/cpuset/littlecores \
  /sys/fs/cgroup/cpuset/bigcores
# echo "0-3" > /sys/fs/cgroup/cpuset/\
littlecores/cpuset.cpus
# echo "0"> /sys/fs/cgroup/cpuset/\
littlecores/cpuset.mems
# chmod -R 777 /sys/fs/cgroup/cpuset/\
littlecores
# echo "4-7"> /sys/fs/cgroup/cpuset/\
bigcores/cpuset.cpus
# echo "0"> /sys/fs/cgroup/cpuset/\
bigcores/cpuset.mems
# chmod -R 777 /sys/fs/cgroup/cpuset/\
bigcores
Lamentablemente, los comandos solo durarán hasta el próximo reinicio. Así que creamos un servicio para configurarlos en el arranque tan pronto como sea posible:
$ sudo wget -O /etc/systemd/system/cpuset.service https://raw.githubusercontent.com/mad-ady/\
odroid-ODROID-XU4-optimizations/master/cpuset.service
$ sudo systemctl enable cpuset
$ sudo systemctl start cpuset
Llegados a este putno, los cgroups están creados, pero nadie los usa activamente. Para iniciar manualmente un proceso en un cgroup específico, puede usar cgexec:
$ sudo apt-get install cgroup-tools
$ cgexec -g cpuset:bigcores sysbench --test=cpu \
--cpu-max-prime=100000 --num-threads=8 run
Figura 6: 8 subprocesos sysbench son forzados a ejecutarse en 4 núcleos específicos

Nos encontramos a mitad de camino. Ahora necesitamos indicar qué procesos específicos se ejecutarán en los núcleos pequeños y el qué procesos en los núcleos grandes. Aquí es donde necesitas hacer una lista y decidir lo que quieres. Comienza con una lista de servicios activos de webmin (System -> Bootup and Shutdown) y desactiva todo lo que no vayas a utilizar. En mi caso, desactivé los siguientes servicios: ModemManager, NetworkManager-wait-online, NetworkManager, accounts-daemon, alsa-restore, alsa-state, apport, apport-forward.socket, bluetooth, cups-browsed, cups.path, cups.service, cups.socket, lightdm, lxc-net, lxc, lxcfs, plymouth *, rsync, saned, speech-dispatcher y whoopsie.

Tendrás que editar los scripts de inicio para los servicios que desees y hacer que agreguen su PID al cgroup correcto. Una vez que el proceso principal (y sus hijos) forman parte del cgroup correcto, cualquier hijo nuevo heredará el cgroup. Mi plan era agregar cosas como MySQL, Apache, Samba, NFS e incluso Webmin al grupo grande y cosas como SSH (y toda mi actividad del intérprete de comandos), cron, Munin y Transmission al grupo pequeño. Esto permite que los procesos que están involucrados en la operatividad del NAS sean más ágiles, mientras que otras tareas pueden ejecutarse adecuadamente en los núcleos pequeños. Si también está utilizando la GUI X11, es posible que también quieras agregar lightdm al grupo "bigcore".

Hay dos tipos de scripts de inicio: scripts nativos systemd y sys-v heredado (/etc/init.d/). Cuando edites un script systemd (por ejemplo, nfs-mountd.service), deberás añadir algo como esto a la sección [Servicio]:

ExecStartPost=-/bin/sh -c 'echo $MAINPID | tee -a /sys/fs/cgroup/cpuset/bigcores/tasks'
Cuando editamos un script sys-v, el tema se complica algo más. Necesitaras encontrar la función de inicio, extraer el PID (s) del proceso recién iniciado y agregarlo a la lista de tareas. A continuación, se muestra un ejemplo donde se cambia el script de inicio de Apache:
pidof apache2 | tr " " "\0"| xargs -0 -n1 | sudo tee -a /sys/fs/cgroup/cpuset/bigcores/tasks
Figura 7 - Cambiando la configuración de inicio de Apache

Asegúrate de reiniciar cada servicio después de cambiarlo y verifica que el PID del proceso esté en el archivo de tareas cpuset correcto. Haz un reinicio completo del sistema y vuelve a comprobarlo después de reiniciar. Si esto te parece demasiado complicado y estás usando el kernel 4.9, hay una forma de hacer “trampa” y ejecutar todas las tareas en los núcleos grandes. Simplemente puedes establecer la afinidad de systemd y todos sus procesos hijos lo heredarán. La afinidad puede controlarse mediante el parámetro CPUAffinity en /etc/systemd/system.conf, pero ten en cuenta que esto te llevará a desperdiciar ciertos núcleos de la CPU.

Duración del disco

Para prolongar la vida útil de tu (s) disco (s), es posible que desees detenerlos tras un período de inactividad. Si está utilizando SSD, puede saltarte esta sección porque solo es aplicable a discos mecánicos antiguos. Los discos pueden recibir un comando "stop" para detener su giro desde un controlador interno, desde el puente USB-SATA o directamente desde el sistema operativo. Sin embargo, a veces los controladores no están sincronizados correctamente provocando que el comando “stop” nunca llegue. Esto hace que el disco siga girando, lo cual genera mucho calor y puede hacer que el disco falle antes de lo normal.

La forma habitual de gestionar esto es decirle al disco que se detenga después de un período de inactividad, lo cual se puede hacer con hdparm:

$ sudo apt-get install sdparm hdparm
Para configurar manualmente el disco para que se detenga tras 10 minutos de inactividad, puede ejecutar el siguiente comando:
$ sudo hdparm -S 120 /dev/sda
Si recibes errores (como "bad/missing sense data"), es posible que hdparm no le pueda ayudar con este disco.

Para gestionar la movilidad del disco, sería mejor dejar que udev ejecute el comando después de que se haya conectado un disco. Dado que los discos pueden tener diferentes roles, es posible que desees distintos temporizadores de suspensión (por ejemplo, un disco para copias de seguridad debería suspenderse/detenerse antes, otro que está activo debería suspenderse/deternerse más tarde). Yo decidí configurar la regla UDEV en función del número de serie del disco. Puede obtener este número de serie buscando en dmesg cuando conectes un disco:

[1885221.800435] usb 4-1.3: Product: My Passport 0730
[1885221.800436] usb 4-1.3: Manufacturer: Western Digital
[1885221.800437] usb 4-1.3: SerialNumber: 575844314141305636323937
Para configurar la regla, crea un archivo como este y vuelve a cargar udev:
$ sudo vi /etc/udev/rules.d/90-disk.rules
ACTION=="add", ENV{DEVNAME}=="/dev/sd?", SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="575844314141305636323937", RUN+="/sbin/hdparm -S 120 $env{DEVNAME}"
$ sudo udevadm control -R
Si hdparm no puede poner su disco en modo suspensión, intentalo con otras alternativas como sdparm, que puede enviar un comando SCSI a tu disco, como el que ordena que se detenga en ese preciso instante:
$ sudo sdparm -C stop /dev/sda
Hay herramientas como hd-idle (http://bit.ly/2j3zWSk) o scripts periódicos que puedes ejecutar para poner tu disco en modo de suspensión. En mi caso, no funcionaron, pero asegúrate de probarlos manualmente antes de decantarte por una u otra solución. Aquí tienes un script manual que comprueba la actividad de un disco (identificado por el UUID de una partición) en una ventana de 10 segundos, y si no hay actividad (datos transferidos), usa sdparm para detener el disco. Puedes ejecutarlo a través de cron:
$ sudo wget -O /usr/local/bin/hdd-idle.sh http://bit.ly/2k6LK7Y
$ sudo chmod a+x /usr/local/bin/hdd-idle.sh
$ sudo /usr/local/bin/hdd-idle.sh "4283-E975"
Debe tener en cuenta que existen herramientas y servicios que activarán tu disco periódicamente, incluso si no se transfieren datos. Herramientas como smartctl (de smartmontools) y smartd. El servicio smartd comprueba periódicamente el estado del disco, y si no está configurado correctamente, puede mantener activo tu disco innecesariamente. Puede consultar el hilo http://bit.ly/2kh6b17 sino logras encontrar que es lo que mantiene tu disco activado. Deberías poder dedudir el estado del disco a partir de este comando: $ sudo smartctl -d sat -n standby -a /dev/sda

Si sale con un error, tu disco todavía está en modo de espera y debería haber sido desactivado.

Rendimiento del disco flash

Una cosa más que hay que tener en cuenta a la hora de usar el almacenamiento flash (eMMC o SSD) es que éste necesita un nivelado periódico para mantener su velocidad. Básicamente, para escribir en un bloque de almacenamiento, primero debe borrarlo y esto le lleva más tiempo que escribir en él. Los sistemas de archivos normales no hacen esto cuando se eliminan datos, de modo que después de un tiempo el rendimiento del disco disminuye significativamente. Para "reavivar" el disco, la operación de nivelado informa al controlador del disco que borre todos los bloques vacíos, restaurando así las velocidades de escritura. La operación de nivelado debe ser compatible con el sistema de archivos y el controlador de disco. De nuevo, usar cron una vez a la semana para ejecutar fstrim puede evitarte ralentizaciones a largo plazo:

$ sudo crontab -e
#trim the eMMC once a week
15 0 0 * *      /sbin/fstrim / >/dev/null 2>&1

Regulador

El rendimiento y el calor también dependen directamente del regulador que estés utilizando para la CPU. Usar y Mantener la opción "performance" te proporciona un rendimiento superior, pero también genera mucho calor. En mis pruebas, la mejor combinación fue un regulador "ondemand" modificado basado en las recomendaciones de http://bit.ly/2jfaDjw. Para activarlo, asegúrate de seleccionar governor = ondemand en /media/boot/boot.ini, y configura el resto de parámetros dentro de /etc/rc.local (prueba los comandos antes). Los siguientes comandos funcionan para un kernel 4.9/4.14 y pueden variar para el kernel 3.10:

$ sudo vi /etc/rc.local
echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy
echo 10 > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor
echo 80 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold
Con la configuración anterior, la CPU incrementará la frecuencia más rápidamente y se tendrá en cuenta el uso de E/S, haciendo que las tareas intensivas de E/S influyan en la frecuencia de la CPU. Esto te permite tener un gran rendimiento cuando sea necesario y bajar la temperatura de la CPU cuando está inactiva. Con mi uso, los pequeños núcleos se mantienen inactivos alrededor de los 300MHz mientras que los núcleos grandes permanecen inactivos a 200MHz.

Rendimiento de la red - MTU

Si tiene una red Gigabit con el cableado adecuado, puedes aumentar la MTU (Unidad máxima de transmisión) en la red integrada del ODROID-XU4. Esto te permitirá enviar paquetes más grandes con menos sobrecarga y generar menos interrupciones en el receptor. Sin embargo, para beneficiarte de ello, deberás contar con dispositivos de red (switches/routers) y dispositivos finales compatibles con frames Jumbo. En el mejor de los casos, los frames Jumbo deberían estar habilitados en todos los dispositivos de red de tu LAN; de lo contrario, es posible que veas que el tráfico desciende o incluso que los dispositivos no puedan enviar grandes cantidades de tráfico entre ellos. Por ejemplo, SSH funciona porque usa paquetes pequeños, pero transferir una página web o un archivo detiene la conexión. Si decides habilitar los frames jumbo, el valor MTU mágico del ODROID-XU4 es 6975 (http://bit.ly/2jP9zDl). Puedes habilitarlos en el ODROID-XU4 dentro de /etc/rc.local:

$ sudo vi /etc/rc.local
#MTU
/sbin/ifconfig eth0 mtu 6975 up

Transferencias más rápidas sobre sshfs/scp/sftp

Como SSH es un protocolo muy flexible que permite hacer túnel y transferir archivos, sería muy acertado usarlo a toda velocidad. Si intentas hacer una transferencia de copia segura (scp) en un ODROID-XU4 con el proceso sshd vinculado a los pequeños núcleos, lograrás una velocidad máxima de aproximadamente 15MB/s. Si vincula el proceso sshd a los núcleos grandes llegaras a los 40 MB/s. Si eres atrevido y no te importa sacrificar algo de seguridad, puedes alcanzar los 50MB/s bajando el algoritmo de encriptación utilizado. Yo lo hice iniciando una instancia sshd diferente (en el puerto 2222) con diferentes configuraciones:

$ sudo wget -O /etc/systemd/system/ssh-big.service \
https://raw.githubusercontent.com/mad-ady/\
odroid-xu4-optimizations/master/ssh-big.service
$ sudo wget -O /etc/ssh/sshd_config_big \
https://raw.githubusercontent.com/mad-ady/\
odroid-xu4-optimizations/master/sshd_config_big
$ sudo systemctl enable ssh-big
$ sudo systemctl start ssh-big
Para montar o transferir un archivo utilizando este nuevo servicio ssh, necesitaras especificar explícitamente el cifrado (esto está desactivado por defecto porque está considerado poco seguro). Puede hacerlo con una entrada en ~/.ssh/config en el cliente:
Host odroid-big
Hostname odroid-ip
Port 2222
Ciphers arcfour
Compression no
Para transferir archivos, simplemente puede usar el siguiente comando:
$ scp bigfile odroid-big:/remote/path

Ajustar los tiempos de espera de systemd

Puede ser bastante irritante el tener que esperar impacientemente a que systemd finalice, sobretodo si es algo que nunca terminará. Puede modificar los tiempos de espera de systemd variando la configuración global de los tiempos de espera en /etc/systemd/system.conf:

DefaultTimeoutStartSec=20s
DefaultTimeoutStopSec=10s
Ten en cuenta que algunos servicios (como el de redes) establecen tiempos de espera explícitos que deberás cambiarlos también:
$ sudo vi /etc/systemd/system/network-online.target.wants/\
networking.service
TimeoutStartSec=30sec

Rendimiento

Estas son algunas métricas de rendimiento que puedes esperar con los ajustes anteriores y una red Gigabit. El cliente es un ODROID-C2 que ejecuta Ubuntu 16.04, mientras que el servidor es el ODROID-XU4. Las instrucciones de descarga y subida son relativas al ODROID-XU4. El disco conectado al ODROID-XU4 tiene una velocidad de escritura de 110 MB/s. Las transferencias de archivos se realizo con un archivo de 8GB lleno de ceros (dd if = /dev/zero of=zero bs=1M count=8000 conv=fsync). Ten en cuenta que parte del rendimiento también depende de tu cliente. Pudes lograr un rendimiento mejor con un PC Linux mas que con un ODROID-C2 como cliente.

Be the first to comment

Leave a Reply