Archivo de la etiqueta: paralelo

Paralelizando tareas en la línea de comandos

Los procesadores actuales, como bien sabéis, tienen varios cores. Esto significa que en teoría pueden ejecutar varias cosas en paralelo. Así, si tienen 4 cores, podrían ejecutar 4 procesos al mismo tiempo.

El problema es que normalmente las aplicaciones no están diseñadas para sacar todo el rendimiento a nuestros procesadores con todos sus cores, de forma que a veces está trabajando un core mientras los otros apenas hacen nada.

En GNU/Linux tenemos un comando (desarrollado por la propia fundación GNU) que permite ejecutar varias tareas en paralelo. Se llama parallelSe encuentra disponible para todas las distros más importantes directamente desde los repositorios.

El ejemplo más sencillo es el de comprimir varios archivos. Veamos cómo lo haríamos normalmente:

gzip *

Vamos a ejecutar este comando con el comando time delante para que al finalizar nos diga cuánto ha tardado (así podremos luego comparar más fácilmente). Además, le pondremos la opción -1, que hará que comprima más y tardará un poquito más:

[ user ] [~/a] > time gzip -1 * 
gzip -1 * 10,80s user 0,40s system 96% cpu 11,622 total

En mi PC obtengo un uso de sistema del 96% y 11,6 segundos de tiempo en ejecutarlo.

Se obtiene un 96% de uso de CPU porque para el comando time, 100% es el máximo uso de un core. Como tenemos 4 cores (en el caso de mi CPU), el total sería 400%, por lo que se están desperdiciando aproximadamente(*) 3/4 partes de procesador.

Para llevar a cabo esta tarea con parallel tendríamos que hacerlo así:

[ user ] [~/a] > ls | time parallel gzip -1
[... información sobre parallel ...]

parallel gzip -1 10,93s user 0,53s system 317% cpu 3,605 total

Lo que da como resultado un 317% de uso de CPU y un total de 3,6 segundos de ejecución.

El hecho de que se obtenga 317% de uso de CPU se explica por lo que decíamos antes. time tiene en cuenta 100% por cada core. Por tanto, aquí se está aprovechando mucho mejor la CPU. En nuestro ejemplo hemos comprimido sólo 4 archivos de 66 megas cada uno. Si comprimiéramos más y durara más el proceso, poco a poco el % de uso aumentaría aprovechando aún más todos los cores, es decir, cuanto más dure el proceso más partido sacará.

Si queréis comprobar de una manera más visual qué porcentaje de cada core se está usando en cada momento podéis usar la utilidad htop.

Parallel tiene muchas más opciones. Podéis incluso usarlo para usar no sólo los cores de un equipo, sino las cpus de varios equipos en red. Un parámetro interesante es el que permite especificar qué capacidad de cpu queremos usar para la tarea. Es el parámetro -j. Siguiendo con el ejemplo anterior, podríamos poner esto:

[ user ] [~/a] > ls | time parallel -j 50% gzip -1
[ ... información sobre parallel ... ]

parallel -j 50% gzip -1 10,84s user 0,46s system 188% cpu 6,005 total

Con esto indicamos que se use la mitad de la CPU. En este caso el resultado ha sido 164% de ocupación de CPU y unos 6 segundos, es decir, como usamos la mitad, tardamos el doble -aproximadamente- que antes.

Aquí tenéis el tutorial de GNU por si le queréis sacar todo el pringue a este comando.

Más info aquí.

(*) Decimos aproximadamente porque el sistema operativo está ejecutando más cosas aparte de nuestro comando gzip.