This is an old revision of the document!
El cluster (brick) consta de cuatro nodos (brick00, brick01, brick02 y brick03). Lo que sigue describe la operativa básica para ejecutar tareas en estas maquinas de una manera ordenada
El directorio /nas de detritus se monta como /home en cada uno de los bricks por lo que todo lo que se modifique en detritus:/nas/user cambiara automaticamente en brick0X:/home/user
La presentacion inicial (hecha con pinpoint y exportada a pdf) se puede bajar de aqui: http://detritus.fundacioace.com/files/cluster.pdf
Esto es básico para el funcionamiento correcto del resto de las herramientas
Empezamos creando una clave RSA en nuestro directorio de detritus y moviendo la clave publica a un archivo que podamos identificar facilmente
$ ssh-keygen $ mv $HOME/.ssh/id_rsa.pub $HOME/.ssh/detritus.pub
Ahora añadimos esta clave a la lista de claves autorizadas en el HOME de los nodos. Como hasta ahora no hay ninguna se puede hacer con cp. En caso de haber alguna se podría hacer con cat. Y no podemos olvidarnos de dar los permisos correctos!
En mi caso:
$ mkdir /nas/osotolongo/.ssh $ chmod 700 /nas/osotolongo/.ssh $ cp ~/.ssh/detritus.pub /nas/osotolongo/.ssh/authorized_keys $ chmod 600 /nas/osotolongo/.ssh/authorized_keys
A partir de ahora, cuando se entra de detritus a cualquiera de los nodos no deberia ser necesario introducir ningun password.
- primero crear un archivo con la lista de hosts:
[osotolongo@detritus ~]$ cat host.pssh osotolongo@brick01 osotolongo@brick02 osotolongo@brick03
- despues ejecutar un comando en todas las maquinas
[osotolongo@detritus ~]$ pssh -h host.pssh 'ps ax | grep ssh' [1] 13:11:46 [SUCCESS] osotolongo@brick03 [2] 13:11:46 [SUCCESS] osotolongo@brick02 [3] 13:11:46 [SUCCESS] osotolongo@brick01
- la syntaxis cambia ligeramente, y la salida tambien
[osotolongo@detritus ~]$ mpssh -f host.pssh 'ps ax | grep ssh' MPSSH - Mass Parallel Ssh Ver.1.3.3 (c)2005-2013 Nikolay Denev <ndenev@gmail.com> [*] read (3) hosts from the list [*] executing "ps ax | grep ssh" as user "osotolongo" [*] spawning 3 parallel ssh sessions brick01 -> 1920 ? Ss 0:00 /usr/sbin/sshd -D brick01 -> 73087 ? Ss 0:00 sshd: osotolongo [priv] brick01 -> 73090 ? S 0:00 sshd: osotolongo@notty brick01 -> 73091 ? Ss 0:00 bash -c ps ax | grep ssh brick01 -> 73101 ? S 0:00 grep ssh brick02 -> 1887 ? Ss 0:00 /usr/sbin/sshd -D brick02 -> 21242 ? Ss 0:00 sshd: osotolongo [priv] brick02 -> 21245 ? S 0:00 sshd: osotolongo@notty brick02 -> 21246 ? Ss 0:00 bash -c ps ax | grep ssh brick02 -> 21256 ? S 0:00 grep ssh brick03 -> 1928 ? Ss 0:00 /usr/sbin/sshd -D brick03 -> 21270 ? Ss 0:00 sshd: osotolongo [priv] brick03 -> 21273 ? S 0:00 sshd: osotolongo@notty brick03 -> 21274 ? Ss 0:00 bash -c ps ax | grep ssh brick03 -> 21284 ? S 0:00 grep ssh Done. 3 hosts processed.
Una imagen vale mas que mil palabras
$ cssh brick
Esta herramienta permite, cuando se escribe en la ventana comun, escribir lo mismo en todas las terminales abiertas o en una sola si se selecciona expresamente.
srun:
Este comando es capaz de lanzar un proceso en varios nodos del cluster al mismo tiempo
[osotolongo@detritus ~]$ srun -N3 -l /bin/hostname 0: brick01 2: brick03 1: brick02
sbatch:
Este comando lanza un script (tipicamente una lista de comandos srun) en el cluster. Es posible escoger el numero de procesos a lanzar e incluso los nodos en los cuales hacerlo
[osotolongo@detritus ~]$ cat test_script.sh #!/bin/sh #SBATCH --time=1 /bin/hostname srun -l /bin/hostname srun -l /bin/pwd [osotolongo@detritus ~]$ sbatch -n6 -w "brick0[1-3]" -o test_stdout test_script.sh Submitted batch job 30 [osotolongo@detritus ~]$ cat /nas/osotolongo/test_stdout brick01 1: brick01 2: brick02 4: brick03 3: brick02 5: brick03 0: brick01 0: /home/osotolongo 5: /home/osotolongo 3: /home/osotolongo 1: /home/osotolongo 4: /home/osotolongo 2: /home/osotolongo
squeue:
Este comando permite ver los trabajos que se han lanzado e informacion sobre ellos
[osotolongo@detritus ~]$ cat test_script.sh #!/bin/sh #SBATCH --time=1 /bin/hostname srun -l /bin/hostname sleep 20 srun -l /bin/pwd [osotolongo@detritus ~]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) [osotolongo@detritus ~]$ sbatch -n6 -w "brick0[1-3]" -o test_stdout test_script.sh Submitted batch job 35 [osotolongo@detritus ~]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 35 debug test_scr osotolon R 0:01 3 brick[01-03]
scancel:
OK, y cuando la caguemos podemos usar scancel para parar los trabajos. El kill de toda la vida pero a traves de un workload manager
[osotolongo@detritus ~]$ cat test_script.sh #!/bin/sh /bin/hostname srun -l /bin/hostname sleep 200 srun -l /bin/pwd [osotolongo@detritus ~]$ sbatch -n6 -w "brick0[1-3]" -o test_stdout test_script.sh Submitted batch job 36 [osotolongo@detritus ~]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 36 debug test_scr osotolon R 0:03 3 brick[01-03] [osotolongo@detritus ~]$ scancel 36 [osotolongo@detritus ~]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
https://slurm.schedmd.com/quickstart.html
mas: https://wiki.fysik.dtu.dk/niflheim/SLURM#configure-slurm
Vamos a intentar usar todo esto para algo util. Digamos que queremos ejecutar un programa con diferentes argumentos en los nodos del cluster. Para ello usamos sbatch
$ sbatch test.sh
El script test.sh no es un programa real sino que es una orden de ejecucion de las tareas.
#!/bin/bash #SBATCH --time=100 #SBATCH --ntasks-per-node=20 #SBATCH -n 50 #SBATCH --mail-type=ALL #SBATCH --mail-user=osotolongo srun --exclusive --multi-prog test.conf
Este script lo unico que hace es configurar minimamente sbatch y lanzar el comando srun.
El archivo test.conf tiene la siguiente estructura
0 test_runner.sh test/blah1.txt 1 test_runner.sh test/blah2.txt 2 test_runner.sh test/blah3.txt 3 test_runner.sh test/blah4.txt 4 test_runner.sh test/blah5.txt 5 test_runner.sh test/blah6.txt . . . 45 test_runner.sh test/blah46.txt 46 test_runner.sh test/blah47.txt 47 test_runner.sh test/blah48.txt 48 test_runner.sh test/blah49.txt 49 test_runner.sh test/blah50.txt
La primer columna debe numerar las tareas, comenzando en 0 y terminando en n-1.La segunda columna no es mas que la orden a ejecutar (en el ejemplo test_runner.sh),con todos los argumentos correspondientes (en este caso un nombre de archivo).
[osotolongo@detritus cluster]$ sbatch test.sh Submitted batch job 842 [osotolongo@detritus cluster]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 842 debug test.sh osotolon R 0:03 3 brick[01-03]