# Pruebas con servidor El servidor `tesla` (172.24.80.102) contiene los `$HOME` de los usuarios. Están alojados en un RAID10 en un servidor con 6 procesadores y 16 GB de RAM. Los homes se exportan mediante NFS versión 3. Los clientes (`mansfield` en este ejemplo, 172.24.80.106), saben del servidor mediante `/etc/hosts`, y montan los homes mediante `autofs`, con nfs versión 3, en `/home/inb`. ```bash lconcha@mansfield:~$ cat /etc/auto.master +auto.master /misc /etc/auto.misc --timeout 600 --ghost /home /etc/auto.home --timeout 600 --ghost ``` ```bash lconcha@mansfield:~$ cat /etc/auto.home inb -rw,fsc,sync,soft,intr,proto=tcp,rsize=8192,wsize=8192 tesla:/home/inb ``` La velocidad de ping entre cliente y servidor parece ser buena: ```bash lconcha@mansfield:~$ ping tesla PING tesla.inb.unam.mx (172.24.80.102) 56(84) bytes of data. 64 bytes from tesla.inb.unam.mx (172.24.80.102): icmp_seq=1 ttl=64 time=0.157 ms 64 bytes from tesla.inb.unam.mx (172.24.80.102): icmp_seq=2 ttl=64 time=0.211 ms 64 bytes from tesla.inb.unam.mx (172.24.80.102): icmp_seq=3 ttl=64 time=0.190 ms ``` Checamos la velocidd de escritura en `/home/inb` desde el cliente hacia el servidor, generando un archivo de 1 GB: ```bash lconcha@mansfield:/misc/mansfield/lconcha/TMP$ dd if=/dev/urandom of=/home/inb/lconcha/testfile.txt bs=1MB count=1000 1000+0 records in 1000+0 records out 1000000000 bytes (1.0 GB, 954 MiB) copied, 83.9989 s, 11.9 MB/s ``` Casi 12 MB/s. Menos de lo que espereaba, pues en el pasado he visto velocidades de más de 50 MB/s en esta prueba. Veamos cómo se compara esa velocidad con el escribir el mismo archivo, pero en un disco local al cliente: ```bash lconcha@mansfield:/misc/mansfield/lconcha/TMP$ dd if=/dev/urandom of=/misc/mansfield/lconcha/TMP/testfile.txt bs=1MB count=1000 1000+0 records in 1000+0 records out 1000000000 bytes (1.0 GB, 954 MiB) copied, 20.0109 s, 50.0 MB/s ``` 50 MB/s, más rápido, pero no por mucho! Es decir, la velocidad a través de la red es bastante buena, sobre todo para andar escribiendo archivos pequeños. Y qué tal escribiendo a otra máquina cliente (`penfield`) en la misma red? ```bash lconcha@mansfield:/misc/mansfield/lconcha/TMP$ dd if=/dev/urandom of=/misc/penfield/lconcha/TMP/testfile.txt bs=1MB count=1000 1000+0 records in 1000+0 records out 1000000000 bytes (1.0 GB, 954 MiB) copied, 19.9469 s, 50.1 MB/s ``` Hm... 50 MB/s, como un disco local! Por qué el servidor anda lento? Veamos, la diferencia en el montaje de `/misc/penfield` y `/home/inb` está en los archivos `/etc/auto.misc` y `/etc/auto.home`. En `auto.misc` tenemos: ``` penfield -rw,soft,intr,rsize=8192,wsize=8192 penfield:/datos/penfield ``` mientras que en `auto.home` vemos: ``` inb -rw,fsc,sync,soft,intr,proto=tcp,rsize=8192,wsize=8192 tesla:/home/inb ``` PRUEBA: Las opciones de mount son distintas entre `/misc` y `/home`, así que ponemos las opciones del primero, que parece ser más veloz. Ahora, corremos la prueba grabando el archivo de 1 GB en `/home`. RESULTADO: 14.6 MB/s, sigue chafa. A ver, qué tal que ni siquiera en `tesla`, evitando la red, podemos escribir tan rápido? ```bash lconcha@tesla:~$ dd if=/dev/urandom of=/home/inb/lconcha/testfile.txt bs=1MB count=1000 1000+0 records in 1000+0 records out 1000000000 bytes (1.0 GB, 954 MiB) copied, 9.77065 s, 102 MB/s ``` Caray! 102 MB/s! Los discos de tesla no tienen la culpa. Como marco de referencia, haciendo el mismo ejercicio en `carr`, escribiendo en `/datos/carr`, me da una velocidad de 86 MB/s. Parece que incluso el RAID10 le sube la velocidad en `tesla`. Ya me cansé de hacer dd a cada rato, mejor hago un script llamado `check_write_speed.sh` que me arroje la velocidad. Está grabado en `/misc/mansfield/lconcha/scripts`. Hago un for loop para revisar varias máquinas, tanto dentro del C13, como más allá (`arwen` con Barrios, `ridelim` con Arellano, `evarts` con Merchant). Lo lanzo desde `mansfield`: ```bash lconcha@mansfield:/misc/mansfield/lconcha/scripts$ for h in mansfield penfield hahn carr ernst arwen ridelim evarts; do ./check_write_speed.sh /misc/${h}/lconcha/testfile 50;done mansfield writing /misc/mansfield/lconcha/testfile (50 MB) : 92.2MB/s mansfield writing /misc/penfield/lconcha/testfile (50 MB) : 36.7MB/s mansfield writing /misc/hahn/lconcha/testfile (50 MB) : 37.6MB/s mansfield writing /misc/carr/lconcha/testfile (50 MB) : 38.0MB/s mansfield writing /misc/ernst/lconcha/testfile (50 MB) : 38.7MB/s mansfield writing /misc/arwen/lconcha/testfile (50 MB) : 36.5MB/s mansfield writing /misc/ridelim/lconcha/testfile (50 MB) : 34.8MB/s mansfield writing /misc/evarts/lconcha/testfile (50 MB) : 38.6MB/s ``` Nuevamente, escribiendo al disco local, tenemos 90 MB/s, y escribiendo a otros clientes tenemos en promedio algo como 36 MB/s. Las velocidades son similares si el archivo pasa de 50MB a 250 MB. No importa si las computadoras están en el mismo lab o van a otro lab. Ahora, nuevamente a `tesla` desde `mansfield`, escribiendo archivos de distintos tamaños: ```bash lconcha@mansfield:/misc/mansfield/lconcha/scripts$ for s in 1 2 10 50 100; do ./check_write_speed.sh /home/inb/lconcha/testfile $s;done mansfield writing /home/inb/lconcha/testfile (1 MB) : 14.3MB/s mansfield writing /home/inb/lconcha/testfile (2 MB) : 10.3MB/s mansfield writing /home/inb/lconcha/testfile (10 MB) : 5.8MB/s mansfield writing /home/inb/lconcha/testfile (50 MB) : 7.8MB/s mansfield writing /home/inb/lconcha/testfile (100 MB) : 8.8MB/s ``` Muy chafa. Es culpa de `mansfield`? No, porque las velocidades escribiendo a otros clientes son similares, y otros clientes también tienen velocidades bajas de escritura en `tesla`. Aquí, por ejemplo, escribiendo desde `carr` a los homes en `tesla`: ```bash carr writing /home/inb/lconcha/testfile (1 MB) : 12.6MB/s carr writing /home/inb/lconcha/testfile (2 MB) : 13.9MB/s carr writing /home/inb/lconcha/testfile (10 MB) : 3.3MB/s carr writing /home/inb/lconcha/testfile (50 MB) : 10.2MB/s carr writing /home/inb/lconcha/testfile (100 MB) : 9.8MB/s ``` # Intentando NFS versión 4 Seguimos las [instrucciones de instalación de NFSv4](https://help.ubuntu.com/community/NFSv4Howto#:~:text=You%20have%20to%20setup%20NFSv3,exports%20and%20you%20are%20done.). ## En el servidor * En el servidor `tesla` hice una carpeta llamada `/export/inb` donde hice un --bind de `/home/inb`. ```bash soporte@tesla:~$ sudo mkdir -p /export/inb soporte@tesla:~$ sudo mount --bind /home/inb /export/inb ``` * No le hice nada a `/etc/default/nfs-kernel-server`. * Edité `/etc/exports`, agregando: ``` # exportando con NFSv4: (lconcha, sep 2020) /export 172.24.80.106(rw,fsid=0,no_subtree_check,sync) /export/inb 172.24.80.106(rw,no_subtree_check,sync) ``` * Y se reinicia el servidor NFS: ```bash soporte@tesla:~$ sudo service nfs-kernel-server restart ``` ## En el cliente `mansfield (172.24.80.106)` * Creo una carpeta `/imports` ```bash sudo mkdir /imports ``` * Montamos ahí: ```bash sudo mount -t nfs4 -o proto=tcp,port=2049 tesla:/inb /imports ``` Puedo ver que están los archivos de los homes! Ahora la prueba de velocidad hacia NFSv4: ``` mansfield writing /imports/lconcha/testfile (1 MB) : 8.5MB/s mansfield writing /imports/lconcha/testfile (2 MB) : 21.6MB/s mansfield writing /imports/lconcha/testfile (5 MB) : 10.0MB/s mansfield writing /imports/lconcha/testfile (10 MB) : 31.3MB/s mansfield writing /imports/lconcha/testfile (50 MB) : 34.3MB/s mansfield writing /imports/lconcha/testfile (100 MB) : 38.6MB/s ``` Ah caray! Ahora sí subimos a 38 MB/s! A ver si no es cosa de suerte (suerte=*load* del servidor). Esribo rápidamente a /home/inb (NFSv3): ``` mansfield writing /home/inb/lconcha/testfile (1 MB) : 13.3MB/s mansfield writing /home/inb/lconcha/testfile (2 MB) : 15.8MB/s mansfield writing /home/inb/lconcha/testfile (5 MB) : 12.4MB/s mansfield writing /home/inb/lconcha/testfile (10 MB) : 12.1MB/s mansfield writing /home/inb/lconcha/testfile (50 MB) : 12.1MB/s mansfield writing /home/inb/lconcha/testfile (100 MB) : 12.0MB/s ``` La mitad! Repito el ejercicio varias veces, pasando de NFSv4 (`/imports`) a NFSv3 (`/home/inb`) y el patrón se repite. **NFSv4 sí es más rápido.** # Cambiando los `homes` a NFSv4. La manera en que define NFSv4 los exports es distinto a la versión 3. En particular, exporta todo un pseudo-filesystem, por lo que la manera en que lo tengo actualmente en versión 3 debe cambiar. Cómo le hago? Quizás aprovechar que tenemos el `inb` adentro de `home`, y puedo exportar todo `home`? Chale, cómo le hago para hacerlo *in vivo* con la gente trabajando? ... bueno, al parecer estoy muy burro como para lograr montarlo mediante `autofs`, pues se me hace recurrente el `inb`. Así que lo montaré mediante `/etc/fstab`, quedando así: ``` # homes mediante NFSv4 tesla:/inb /home/inb nfs4 _netdev,auto 0 0 ``` Y para que ya no ande montando la versión exportada mediante NFSv3 con `autofs`, editamos `/etc/auto.master`, comentando la línea que apunta a `/etc/auto.home` ``` +auto.master /misc /etc/auto.misc --timeout 600 --ghost #/home /etc/auto.home --timeout 600 --ghost ``` En teoría, con un reboot debería quedar la cosa... era muy ambicioso hacerlo *in vivo*. Digo, sí se puede sin rebootear, porque puedo hacer un `umount -flv /home/inb` en cada máquina, editar el `/etc/auto.master` y el `fstab`, y luego darle un `mount /home/inb`, pero segurito que me friego las sesiones de varios, y no se diga que remotamente no podré hacer mucho si la sesión de `soporte` se queda colgada. Así que a ir al INB y hacerlo ahí. :warning: Que no se me olvide cambiar en `tesla` el `/etc/exports` para que exporte NFSv4 no solo a `mansfield`, sino a `*inb.unam.mx`. Espero que jale, no lo he probado. # Probando SSD Vamos a ver la velocidad de escritura a SSD, para ver si nos conviene hacer un RAID10 con discos SSD. Esto es caro, así que más vale que valga la pena. En `tesla` hacemos una carpeta que exportaremos, pero lo vamos a poner en `/`, que es un disco SSD. ```bash sudo mkdir /ssd_test sudo chgrp fmriuser /ssd_test sudo chmod g=rwX /ssd_test ``` Ahora tenemos que hacer un bind a `export` ```bash sudo mkdir /export/ssd_test sudo mount --bind /ssd_test /export/ssd_test ``` y meterlo a `/etc/exports` ```bash /export/ssd_test *.inb.unam.mx(rw,no_subtree_check,sync) ``` Reiniciamos NFS con `sudo service nfs-kernel-server restart` En el cliente(`mansfield`) tenemos que montarlo. Por ahora lo vamos a hacer con un vil y vulgar `mount`, pues no lo queremos en el `fstab`. Aprovecharé la carpeta `/imports` que tenía para montar ahí a `tesla:/ssd_test` ```bash lconcha@mansfield:~$ sudo mount -t nfs4 -o proto=tcp,port=2049 tesla:/ssd_test /imports/ ``` Y la prueba de fuego: ``` mansfield writing /imports/testfile (1 MB) : 28.6MB/s mansfield writing /imports/testfile (2 MB) : 34.1MB/s mansfield writing /imports/testfile (5 MB) : 42.5MB/s mansfield writing /imports/testfile (10 MB) : 39.3MB/s mansfield writing /imports/testfile (20 MB) : 43.5MB/s mansfield writing /imports/testfile (50 MB) : 43.6MB/s mansfield writing /imports/testfile (100 MB) : 43.3MB/s mansfield writing /imports/testfile (200 MB) : 42.1MB/s ``` Antes de llegar a conclusiones, escribamos nuevamente a `/home/inb` (RAID 10 discos mecánicos) ahora que está montado con NFSv4: ``` mansfield writing /home/inb/lconcha/testfile (1 MB) : 10.8MB/s mansfield writing /home/inb/lconcha/testfile (2 MB) : 15.9MB/s mansfield writing /home/inb/lconcha/testfile (5 MB) : 25.9MB/s mansfield writing /home/inb/lconcha/testfile (10 MB) : 31.3MB/s mansfield writing /home/inb/lconcha/testfile (20 MB) : 38.6MB/s mansfield writing /home/inb/lconcha/testfile (50 MB) : 40.2MB/s mansfield writing /home/inb/lconcha/testfile (100 MB) : 43.0MB/s mansfield writing /home/inb/lconcha/testfile (200 MB) : 49.5MB/s ``` Pues no hay mucha ventaja. Difícil hacer la prueba de incrementar la carga de read/write simultáneo por varios usuarios, donde SSD podría ganar, pero por ahora parece ser, nuevamente, que la red y la versión de NFS son fundamentales en la velocidad de escritura. Última prueba, ahora reportando velocidades de lectura. `mansfield` montó `/home/inb` con NFSv4, mientras que `hahn` lo tiene montado con NFSv3. Veamos: ``` carr writing /home/inb/lconcha/testfile (1 MB). write: 11.9MB/s , read: 247MB/s carr writing /home/inb/lconcha/testfile (5 MB). write: 16.2MB/s , read: 346MB/s carr writing /home/inb/lconcha/testfile (10 MB). write: 16.8MB/s , read: 439MB/s carr writing /home/inb/lconcha/testfile (50 MB). write: 15.4MB/s , read: 484MB/s carr writing /home/inb/lconcha/testfile (200 MB). write: 14.7MB/s , read: 501MB/s ``` ``` mansfield writing /home/inb/lconcha/testfile (1 MB). write: 11.4MB/s , read: 224MB/s mansfield writing /home/inb/lconcha/testfile (5 MB). write: 25.4MB/s , read: 318MB/s mansfield writing /home/inb/lconcha/testfile (10 MB). write: 33.1MB/s , read: 401MB/s mansfield writing /home/inb/lconcha/testfile (50 MB). write: 41.0MB/s , read: 469MB/s mansfield writing /home/inb/lconcha/testfile (200 MB). write: 63.9MB/s , read: 116MB/s ``` y a `/imports`, que es NFSv4 hacia SSD: ``` mansfield writing /imports/testfile (1 MB). write: 31.3MB/s , read: 345MB/s mansfield writing /imports/testfile (5 MB). write: 39.2MB/s , read: 315MB/s mansfield writing /imports/testfile (10 MB). write: 41.1MB/s , read: 367MB/s mansfield writing /imports/testfile (50 MB). write: 42.2MB/s , read: 442MB/s mansfield writing /imports/testfile (200 MB). write: 43.7MB/s , read: 487MB/s ``` Definitivo: la escritura es más rápida con NFSv4. Curioso, la lectura se hace lenta si el archivo es muy grande, pero se recupera con SSD. Aquí está la ventaja de SSD? Neh, parece que fué suerte: ``` lconcha@mansfield:~$ for s in 50 100 100 250 250 500 500; do check_write_speed.sh /imports/testfile $s;done mansfield writing /imports/testfile (50 MB). write: 41.2MB/s , read: 451MB/s mansfield writing /imports/testfile (100 MB). write: 44.7MB/s , read: 472MB/s mansfield writing /imports/testfile (100 MB). write: 40.7MB/s , read: 468MB/s mansfield writing /imports/testfile (250 MB). write: 40.5MB/s , read: 464MB/s mansfield writing /imports/testfile (250 MB). write: 42.7MB/s , read: 475MB/s mansfield writing /imports/testfile (500 MB). write: 37.0MB/s , read: 486MB/s mansfield writing /imports/testfile (500 MB). write: 35.0MB/s , read: 474MB/s lconcha@mansfield:~$ for s in 50 100 100 250 250 500 500; do check_write_speed.sh /home/inb/lconcha/testfile $s;done mansfield writing /home/inb/lconcha/testfile (50 MB). write: 32.4MB/s , read: 447MB/s mansfield writing /home/inb/lconcha/testfile (100 MB). write: 50.7MB/s , read: 469MB/s mansfield writing /home/inb/lconcha/testfile (100 MB). write: 51.2MB/s , read: 472MB/s mansfield writing /home/inb/lconcha/testfile (250 MB). write: 63.5MB/s , read: 479MB/s mansfield writing /home/inb/lconcha/testfile (250 MB). write: 56.8MB/s , read: 479MB/s mansfield writing /home/inb/lconcha/testfile (500 MB). write: 56.8MB/s , read: 480MB/s mansfield writing /home/inb/lconcha/testfile (500 MB). write: 60.8MB/s , read: 474MB/s ```