Archivo de la etiqueta: shell

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.

Personalizando zsh: oh-my-zsh

En la anterior entrada os comenté que zsh es un intérprete de comandos para GNU/Linux (también para otras plataformas, como MAC OS) que permite, entre otras cosas, un nivel de personalización mucho más alto que bash.

Para este fin nació oh-my-zsh, que no es más que una aplicación (un framework en realidad) que permite personalizar fácilmente nuestro zsh.

Para ello consta de multitud de plugins y temas y permite adaptar el aspecto y funcionalidad de zsh a nuestras preferencias personales. Es una forma sencilla (*) de realizar cambios en la configuración de zsh.

Para instalarlo, nada más fácil:

$ wget --no-check-certificate http://install.ohmyz.sh -O - | sh

Una vez instalado simplemente editamos el fichero .zshrc, que tendremos en nuestro directorio home.

Para cambiar el tema del prompt modificaremos el parámetro ZSH_THEME. Por ejemplo:

ZSH_THEME=robbyrussell

Si no queremos ningún tema (estaría todo como antes de instalar oh-my-zsh) lo dejaremos así:

ZSH_THEME=""

Existe una lista de temas para poder aplicar en el prompt de nuestro shell favorito, la podéis encontrar en este enlace.

Como indican aquí, también es interesante usar el tema random, que lo que hace es ir cambiando de un tema a otro aleatoriamente. De esta forma podemos ir viéndolos todos y quedarnos al final con el que más nos guste.

Los plugins permiten añadir cosas interesantes, como autocompletado de parámetros de comandos. Por ejemplo, al escribir zypper  (instalador de paquetes de openSUSE) y a continuación escribís in y pulsáis tabulador, os dirá qué parámetros acepta.

Aquí tenéis una lista de los plugins que existen para oh-my-zsh.

Para añadir un plugin simplemente tenéis que añadir el nombre del plugin a la lista entre paréntesis que hay tras el parámetro «plugins» dentro del fichero .zshrc. Por ejemplo:

plugins=(rails git ruby)

Si conocéis más formas de usar oh-my-zsh para mejorar la experiencia con zsh sentíos libres de dejar un comentario.

 

(*) En una próxima entrega veremos una forma de personalizar zsh aún más sencilla que ésta :-O.

Un poco de… Emacs (VI): insertar salida de comandos

Si trabajáis con la shell de Linux asiduamente como es mi caso, en ocasiones os resulta útil insertar en un fichero de texto el resultado de un comando.

Lo normal en estos casos es abrir una shell, ejecutar el comando, seleccionar la salida con el ratón, copiar y luego volver al editor (emacs, claro) y darle a pegar.

Otra opción es redirigir la salida del comando a un texto plano y luego insertar dicho archivo en el fichero en el que estamos trabajando (C-x i).

Sin embargo, lo más directo es usar la combinación C-u M-! (*). Con la última (M-!), lo que hace emacs es pedir en el minibuffer que introduzcáis un comando y la salida os la muestra en un buffer nuevo (no en el que estáis editando). Para que se inserte directamente donde tenéis el cursor hay que pulsar previamente C-u.

Recordad que:

 

C-u significa pulsar Control y la tecla "U",
C-x i significa pulsar Control y la tecla "X" y luego, tras soltar ambas, pulsar la tecla "I" (i latina),
M-! significa pulsar Alt y la tecla que tiene el símbolo "!" (admiración cerrado), que es la tecla del 1. Por tanto, habrá que pulsar Alt + Mayúsuclas + 1.
C-u M-! significa primero hacer el C-u, soltamos las dos teclas y hacemos el M-!.

 

(*) M-! : La tecla que aparece tras el «-» es la admiración cerrada pero por algún motivo, la fuente de wordpress no la pone correctamente (es problema de la fuente porque en el texto monoespaciado sí sale bien como se puede observar). Si alguien conoce este motivo agradeceré un comentario. PD. No es el «pipe», pues el pipe sí que lo muestra cuando se pulsa Alt gr + 1 (! es admiración y | es pipe). Sin embargo la admiración abierta sí la pone bien «¡».