2012-01-24 22 views
6

CPU ngày nay thường bao gồm một số lõi vật lý. Đây thậm chí có thể là đa luồng để hạt nhân Linux nhìn thấy một số lượng lớn các lõi và do đó bắt đầu nhiều lần lên lịch trình Linux (một cho mỗi lõi). Khi chạy nhiều tác vụ trên một hệ thống Linux, trình lập lịch biểu thường phân phối tốt tổng khối lượng công việc tới tất cả các lõi Linux (có thể là cùng một lõi vật lý).Làm thế nào để (trivially) song song với vỏ Linux bằng cách bắt đầu một nhiệm vụ trên mỗi lõi Linux?

Bây giờ, giả sử, tôi có một số lượng lớn tệp để xử lý với cùng một tệp thực thi. Tôi thường làm điều này bằng lệnh "tìm":

find <path> <option> <exec> 

Tuy nhiên, điều này chỉ bắt đầu một tác vụ bất kỳ lúc nào và chờ cho đến khi hoàn thành trước khi bắt đầu công việc tiếp theo. Vì vậy, chỉ một lõi bất kỳ lúc nào được sử dụng cho việc này. Điều này để lại phần lớn các lõi nhàn rỗi (nếu lệnh tìm này là nhiệm vụ duy nhất chạy trên hệ thống). Sẽ tốt hơn nếu khởi chạy N nhiệm vụ cùng một lúc. Trong đó N là số lõi được nhân Linux nhìn thấy.

Có lệnh nào có thể thực hiện điều đó không?

+1

Hãy xem tiện ích song song GNU. Tôi không biết làm thế nào nó phù hợp với vấn đề cụ thể của bạn, nhưng có một đọc: http://www.gnu.org/software/parallel/ –

+1

Có, bạn là đúng. GNU song song thực sự là dành cho việc sử dụng này. Nó có thể được sử dụng như là một thay thế cho "xargs". – ritter

+0

@Daniel: Có vẻ như bạn nên đăng câu trả lời đó. –

Trả lời

7

Sử dụng find với tùy chọn -print0. Hãy đặt đường ống đến xargs bằng tùy chọn -0. xargs cũng chấp nhận tùy chọn -P để chỉ định một số quy trình. -P nên được sử dụng kết hợp với -n hoặc -L.

Đọc man xargs để biết thêm thông tin.

Một lệnh ví dụ: find . -print0 | xargs -0 -P4 -n4 grep searchstring

+0

Rất cám ơn câu trả lời! Vì GNU song song không phải là một thành phần của xargs phân phối của tôi là sự lựa chọn (vào lúc này!). – ritter

2

Nếu bạn có GNU Parallel http://www.gnu.org/software/parallel/ cài đặt bạn có thể làm điều này:

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

Bạn có thể cài đặt GNU Parallel đơn giản bằng cách:

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

Watch video giới thiệu cho GNU Parallel để tìm hiểu thêm: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

+0

Video giới thiệu tuyệt vời. Cảm ơn nhiều!! Thật không may GNU song song chưa làm cho nó vào Ubuntu 11,10. Không thể tin được, một công cụ tuyệt vời như vậy! Tuy nhiên, tôi đã đọc gợi ý rằng nó sẽ biến nó thành 12.04. Tin tốt!! – ritter

+0

Nó không có trong http://www.ubuntuupdates.org/package_metas/list?name=parallel vì vậy tôi tự hỏi bạn đọc những gợi ý đó ở đâu. –

0

Gnu song song hoặc xargs -P có lẽ là một cách tốt hơn để xử lý việc này, nhưng bạn cũng có thể viết một loại khung công tác đa nhiệm trong bash. Đó là một chút lộn xộn và không đáng tin cậy, tuy nhiên, do thiếu các cơ sở nhất định.

#!/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 
Các vấn đề liên quan