2012-01-24 12 views
6

Dzisiejsze procesory zazwyczaj zawierają kilka rdzeni fizycznych. Mogą one być nawet wielowątkowe, tak że jądro Linux widzi dość dużą liczbę rdzeni i odpowiednio zaczyna się kilka razy od harmonogramu Linuksa (po jednym dla każdego rdzenia). Podczas wykonywania wielu zadań w systemie Linux program planujący osiąga normalnie dobrą dystrybucję całkowitego obciążenia pracą dla wszystkich rdzeni systemu Linux (może to być ten sam rdzeń fizyczny).Jak (banalnie) zrównoleglić się z powłoką Linuksa, uruchamiając jedno zadanie na rdzeń systemu Linux?

Teraz, powiedzmy, mam dużą liczbę plików do przetworzenia z tym samym plikiem wykonywalnym. I zazwyczaj to zrobić za pomocą polecenia „znaleźć”:

find <path> <option> <exec> 

to jednak tylko jedno zadanie rozpoczyna się w każdej chwili i czeka aż jego zakończeniu przed rozpoczęciem następnego zadania. W związku z tym, tylko jeden rdzeń w dowolnym momencie jest w użyciu do tego. Dzięki temu większość rdzeni pozostaje bezczynna (jeśli to polecenie-find jest jedynym zadaniem uruchomionym w systemie). Byłoby znacznie lepiej uruchomić N zadań w tym samym czasie. Gdzie N jest liczbą rdzeni widzianych przez jądro Linuksa.

Czy istnieje polecenie, które to zrobi?

+1

Zobacz równoległe narzędzie GNU. Nie wiem, jak to pasuje do konkretnego problemu, ale przeczytaj: http://www.gnu.org/software/parallel/ –

+1

Tak, masz rację. GNU równoległy jest rzeczywiście przeznaczony do tego użytku. Może być używany jako zamiennik dla "xargs". – ritter

+0

@Daniel: Wygląda na to, że powinieneś opublikować to jako odpowiedź. –

Odpowiedz

7

Użyj opcji find z opcją . Przeprowadź ją do xargs za pomocą opcji -0. xargs akceptuje również opcję -P, aby określić liczbę procesów. -P należy używać w połączeniu z -n lub -L.

Przeczytaj man xargs, aby uzyskać więcej informacji.

Przykładem polecenie: find . -print0 | xargs -0 -P4 -n4 grep searchstring

+0

Wielkie dzięki za odpowiedź! Ponieważ GNU równolegle nie jest składnikiem mojej dystrybucji xargs jest wyborem (w tej chwili!). – ritter

2

Jeśli masz GNU Parallel http://www.gnu.org/software/parallel/ zainstalowany można to zrobić:

find | parallel do stuff {} --option_a\; do more stuff {} 

Można zainstalować GNU Parallel prostu przez:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel 
chmod 755 parallel 
cp parallel sem 

oglądać filmy wstępne dla GNU Równolegle, aby dowiedzieć się więcej: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

+0

Świetne filmy wprowadzające. Wielkie dzięki!! Niestety, równolegle GNU nie doszło jeszcze do Ubuntu 11.10. Niewiarygodne, takie wspaniałe narzędzie! Jednak przeczytałem wskazówki, że będzie to 12.04. Dobre wieści!! – ritter

+0

Nie ma go na http://www.ubuntuupdates.org/package_metas/list?name=parallel, więc zastanawiam się, gdzie czytasz te wskazówki. –

0

Równolegle z Gnu lub xargs -P jest prawdopodobnie lepszym sposobem na poradzenie sobie z tym, ale można również napisać rodzaj wielozadaniowy framework w bash. Jest trochę bałaganiarski i niewiarygodny z powodu braku pewnych udogodnień.

#!/bin/sh 

MAXJOBS=3 
CJ=0 
SJ="" 

gj() { 
    echo ${1//[][-]/} 
} 

endj() { 
    trap "" sigchld 
    ej=$(gj $(jobs | grep Done)) 
    jobs %$ej 
    wait %$ej 
    CJ=$(($CJ - 1)) 
    if [ -n "$SJ" ]; then 
     kill $SJ 
     SJ="" 
    fi 
} 
startj() { 
    j=$* 
    while [ $CJ -ge $MAXJOBS ]; do 
     sleep 1000 & 
     SJ=$! 
     echo too many jobs running: $CJ 
     echo waiting for sleeper job [$SJ] 
     trap endj sigchld 
     wait $SJ 2>/dev/null 
    done 
    CJ=$(($CJ + 1)) 
    echo $CJ jobs running. starting: $j 
    eval "$j &" 
} 

set -m 

# test 
startj sleep 2 
startj sleep 10 
startj sleep 1 
startj sleep 1 
startj sleep 1 
startj sleep 1 
startj sleep 1 
startj sleep 1 
startj sleep 2 
startj sleep 10 

wait 
Powiązane problemy