Запуск тисячі фонових процесів згортання паралельно в скрипті bash


14

Я запускаю тисячі та процеси фонових завитків паралельно у наступному скрипті bash

START=$(date +%s)
for i in {1..100000}
do       
    curl -s "http://some_url_here/"$i  > $i.txt&
    END=$(date +%s)
    DIFF=$(( $END - $START ))
    echo "It took $DIFF seconds"
done

У мене 49Gb Corei7-920 виділений сервер (не віртуальний).

Я відслідковую споживання пам'яті та процесор за допомогою topкоманд, і вони знаходяться далеко від меж.

Я використовую ps aux | grep curl | wc -lдля підрахунку кількості поточних процесів згортання . Ця кількість швидко збільшується до 2-4 тисяч, а потім починає постійно зменшуватися.

Якщо я додаю простий синтаксичний аналіз через curping curl для awk ( curl | awk > output), то кількість процесів curl збільшується лише до 1-2 тисяч, а потім зменшується до 20-30 ...

Чому кількість процесів настільки різко зменшується? Де межі цієї архітектури?


2
Ви, мабуть, потрапляєте на одне з меж максимальних запущених процесів або максимальних відкритих сокетів. ulimitпокаже деякі з цих меж.
HBruijn

6
Я б також запропонував використовувати parallel(1)для таких завдань: manpages.debian.org/cgi-bin/…
zhenech

Спробуйте start=$SECONDSі end=$SECONDS- використовуйте за назви звичні великі регістри чи змішані регістрові імена, щоб уникнути зіткнення потенційного імені зі змінними оболонки. Однак ви дійсно отримуєте лише постійно зростаючий часовий інтервал від початку кожного процесу. Ви не отримуєте, скільки часу зайняло завантаження, оскільки процес знаходиться у фоновому режимі (і startобчислюється лише один раз). У Bash ви можете робити (( diff = end - start ))скидання знаків долара і дозволяючи інтервалу бути більш гнучким. Використовуйте, pgrepякщо у вас є.
Призупинено до подальшого повідомлення.

Я згоден з HBruijn. Зверніть увагу, як кількість ваших процесів зменшилася вдвічі, коли ви подвоюєте кількість процесів (додаючи awk).
Призупинено до подальшого повідомлення.

@zhenech @HBrujin Я запустив, parallelі це говорить мені, що я можу виконати лише 500 паралельних завдань через системний ліміт файлових ручок. Я підняв ліміт у limit.conf, але тепер, коли я намагаюся запустити 5000 симуляційних завдань, він миттєво з’їдає всю мою пам'ять (49 Gb) ще до початку, тому що кожен parallel сценарій perl їсть 32Mb.
zavg

Відповіді:


12

Слід чітко відповідати на запитання:

mycurl() {
    START=$(date +%s)
    curl -s "http://some_url_here/"$1  > $1.txt
    END=$(date +%s)
    DIFF=$(( $END - $START ))
    echo "It took $DIFF seconds"
}
export -f mycurl

seq 100000 | parallel -j0 mycurl

Коротше, якщо вам не потрібен текст котлоагрегату навколо таймінгів:

seq 100000 | parallel -j0 --joblog log curl -s http://some_url_here/{} ">" {}.txt
cut -f 4 log

Якщо ви хочете паралельно запускати 1000, ви отримаєте обмеження (наприклад, ручки файлів). Підвищення ulimit -n або /etc/security/limits.conf може допомогти.


І якщо я хочу паралельно запустити кілька команд як одну у версії з короткою відповіддю, як це зробити?
Гай Аврахам

2
Цитувати це: seq 100 | parallel 'echo here is command 1: {}; echo here is command 2: {}'. Проведіть годину, гуляючи по підручнику. Ваш командний рядок за це вам сподобається:man parallel_tutorial
Оле Танге

2
for i in {1..100000}

Є всього 65536 портів. Пропустіть це.

for n in {1..100000..1000}; do   # start 100 fetch loops
        for i in `eval echo {$n..$((n+999))}`; do
                echo "club $i..."
                curl -s "http://some_url_here/"$i  > $i.txt
        done &
        wait
done

(редагувати: (редагувати: смуга суворо датоване твердження про обмеження ОС та додайте відсутні )echocurl
wait


Насправді ОС може впоратися з цим просто чудово. Це обмеження TCP. Жодна ОС, якою б спеціальною вона не була, не зможе її обійти. Але 4-кратне підключення ОП ніде не дорівнює 64 к (або за замовчуванням у деяких дистрибутивах 32 к)
Патрік

@Patrick добре, я взяв цю частину, це зайве з неповоротним лімітом дизайну, але подивіться на коментар zavg 7-го.
jthill
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.