GNU Parallel
Napisał: Patryk Krawaczyński
09/01/2011 w Administracja Brak komentarzy. (artykuł nr 299, ilość słów: 430)
G
NU Parallel jest małym narzędziem napisanym w Perlu odpalanym z wiersza poleceń dla linuksowych i uniksopodobnych systemów operacyjnych, które pozwala użytkownikowi na współbieżne wykonywanie skryptów powłoki i programów na lokalnej maszynie lub zdalnych hostach. Jeśli na co dzień używaliśmy xargs przekonamy się, że bardzo łatwo zastąpić go przez parallel, który przyjmuje te same opcje jak xargs. Również wiele pętli używanych w skryptach może zostać zastąpione przez to narzędzie, co spowoduje ich znacznie przyśpieszenie ze względu na równoległe wykonywanie kilku zadań. Parallel czyni również wiele poleceń bardziej czytelnymi niż ma to miejsce w przypadku zastosowania ppss lub pexec.
Narzędzie parallel dba o to, aby wyjście wykonywanych równolegle poleceń było takie same jak wyjście poleceń wykonywanych po kolei. Dzięki temu wyjście takie można wykorzystać na standardowym wejściu dla innych programów. Dla każdego wiersza na wejściu parallel będzie wykonywał polecenie z wierszem jako argumentem. Jeśli żadne polecenie nie zostanie przekazane, zostaną równolegle wykonane wiersze z standardowego wejścia. Bardzo często narzędzie to można stosować jako zamiennik xargs lub cat | sh. Na przykład pętla:
(for x in `cat lista` ; do zrob_cos $x done) | przetworz_wyjscie
Może zostać zastąpione przez
cat lista | parallel zrob_cos | przetworz wyjscie
Gdzie lista
zawiera argumenty dla polecenia zrob_cos
oraz przetworz_wyjscie
nie musi w cale przetwarzać standardowego wyjścia i można je pominąć. Innym przykładem jest wykorzystanie wszystkich rdzeni na lokalnej maszynie:
nfsec:~/logs# ls -l razem 1984364 -rw-r----- 1 root adm 18364991 sty 9 19:36 access.log -rw-r----- 1 root adm 468871168 sty 9 06:25 access.log.1 -rw-r----- 1 root adm 715099697 sty 2 06:25 access.log.2 -rw-r--r-- 1 root adm 829637109 gru 26 06:25 access.log.3 nfsec:~/logs# du -k 1984368 .
Normalnie czas na skompresowanie tych logów na procesorze Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz zajmuje:
nfsec:~/logs# /usr/bin/time gzip -1 * 15.47user 0.97system 0:16.51elapsed 99%CPU (0avgtext+0avgdata 3008maxresident)k 0inputs+343728outputs (0major+243minor)pagefaults 0swaps
Instalujemy w systemie narzędzie parallel:
wget http://ftp.gnu.org/gnu/parallel/parallel-20101222.tar.bz2 tar xvf parallel-20101222.tar.bz cd parallel-2010122 ./configure --prefix=/usr && make make install
I wykonujemy to samo polecenie z użyciem dwóch rdzeni procesora:
nfsec:~/logs# ls | /usr/bin/time parallel -j+0 gzip -1 15.47user 1.32system 0:09.48elapsed 177%CPU (0avgtext+0avgdata 41456maxresident)k 0inputs+343728outputs (0major+15890minor)pagefaults 0swaps
Standardowo parallel uruchamia 9 zadań równolegle, lecz poprzez użycie opcji -j+0 narzędzie automatycznie wykryje dostępną liczbę rdzeni do wykorzystania. Jest to tylko skromna demonstracja możliwości narzędzia parallel. Bardzo dobry wstęp do tego narzędzia (w tym wykorzystanie sieciowego przetwarzania) przedstawił jego autor – Ole Tange na serwisie YouTube [Część 1] [ Część 2 ].
Więcej informacji: GNU Parallel, Parallel Examples, Parallel BZIP2