NFsec Logo

GNU Parallel

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

Kategorie K a t e g o r i e : Administracja

Tagi T a g i : , , , , ,

Komentowanie tego wpisu jest zablokowane.