Para execução de scripts e programas, de forma paralela, em um sistema GNU/Linux, pode ser utilizado o GNU Parallel. Uma aplicação que permite distribuir a carga de procesamento, de uma ou várias aplicações, em múltiplos CPUs.
Instalação
No Ubuntu/Debian é possível fazer a instalação do seu pacote através dos reposítorios oficiais:
1 | $ sudo apt-get get update |
Sintaxe
Executada a instalação, é possível testar
sua utilização com comandos básicos. Dentre as diversas possibilidades de utilização do parallel
(man parallel), uma das sintaxes mais simples de ser utilizada é a composição com :::
. O trio de dois pontos consecutivos permite a indicação de comandos ou parâmetros que serão paralelizados.
No exemplo abaixo, o comando echo
será paralelizado para exibição de dois parâmetros, a
e b
, simultaneamente.
1 | $ parallel echo ::: a b |
O retorno dessa execução deve ser:
1 | a |
Uma segunda forma de utilizar os :::
para criar comandos do parallel
é indicando quais comandos devem ser paralelizados. Para este caso todos os parâmetros necessásios de cada comando serão inseridos num mesmo bloco, delimitado por aspas ""
.
1 | $ parallel ::: "comando1 -parametros" "comando2 -parametros" |
Dessa forma, os comandos 1 e 2 serão executados simultaneamente, independentes se são iguais ou possuem os mesmos parâmetros.
Exemplos
Uma forma de avaliar a execução simultânea dos comandos é mostrar o horário em que eles começaram a ser executados. Para verificar esse ponto serão utilizados em conjunto os comandos date
e ping
, em execuções paralelas e buscando sites distintos
Execução 1: date
; ping -c 3 facebook.com
Execução 2 date
; ping -c 3 google.com
1 | $ parallel -k ::: "date; ping -c 3 facebook.com" "date; ping -c 3 google.com" |
O parâmetro -k
serve apenas para ordenar a exibição dos resultados de cada execução. Os sites indicados são apenas para testes, poderiam ser quaisquer outros acessíveis no momento.
Os resultados das execuções devem ser algo do tipo:
1 | Sat May 16 19:22:37 -03 2020 |
É importante reparar o carimbo de hora indicado, pois é justamente ele que demonstra a execução paralela de cada uma das execuções:
1 | Sat May 16 19:22:37 -03 2020 |
Aprofundamentos
A execução paralela tem a vantagem de permitir que diferentes programas sejam iniciados em conjunto, e mesmo que possuam tempo de execuções distintos, elas não interferirão entre si.
Serialização x Paralelização
Um exemplo oposto à paralelização é a execução em série. Os mesmos comandos poderiam ser dispostos em série, com objetivos de realizar as mesmas tarefas, porém os tempos de execuções não seriam os mesmos.
1 | $ date && ping -c 3 facebook.com && date && ping -c 3 google.com |
Resultado:
1 | Sat May 16 20:03:08 -03 2020 |
Repare como cada execução do ping
aconteceu em tempos distintos:
1 | Execução 1: Sat May 16 20:03:08 -03 2020 |
Com a ajuda do comando time
, é possível repetir os cenários e aprofundar na comparação do tempo de execução de cada um dos cenários.
Cenário 1: Mensurando o tempo de execução da paralelização
1 | $ time parallel -k ::: "date; ping -c 3 facebook.com" "date; ping -c 3 google.com" |
Resultado:
1 | Sat May 16 20:52:58 -03 2020 |
Cenário 2: Mensurando o tempo de execução da serialização
1 | time (date && ping -c 3 facebook.com && date && ping -c 3 google.com) |
Resultado:
1 | Sat May 16 20:53:02 -03 2020 |
Comparativos:
1 | Tempo de execução com paralelização: 0m2.159s |
Desta forma, ficam demonstradas e exemplificadas as vantagens de se utilizar o parallel
em rotinas repetitivas e/ou com tempos de execuções distintos.
Execução de um script scanner de rede com parallel
:
prips 192.168.0.1/24 | parallel --timeout 2 -j0 'ping -c 1 {} >/dev/null && echo {}' 2>/dev/null
References
- GNU Parallel: https://www.gnu.org/software/parallel/ # https://www.gnu.org/software/parallel/parallel_tutorial.html#Controlling-the-output # https://www.gnu.org/software/parallel/man.html # https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Simple-network-scanner
- Exemplos: https://www.techrepublic.com/article/how-to-run-commands-simultaneously-with-gnu-parallel/ # https://www.msi.umn.edu/support/faq/how-can-i-use-gnu-parallel-run-lot-commands-parallel
- Time: http://man7.org/linux/man-pages/man1/time.1.html # https://www.ostechnix.com/how-to-find-the-execution-time-of-a-command-or-process-in-linux/