Я запускаю тисячі та процеси фонових завитків паралельно у наступному скрипті 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 ...
Чому кількість процесів настільки різко зменшується? Де межі цієї архітектури?
parallel(1)для таких завдань: manpages.debian.org/cgi-bin/…
start=$SECONDSі end=$SECONDS- використовуйте за назви звичні великі регістри чи змішані регістрові імена, щоб уникнути зіткнення потенційного імені зі змінними оболонки. Однак ви дійсно отримуєте лише постійно зростаючий часовий інтервал від початку кожного процесу. Ви не отримуєте, скільки часу зайняло завантаження, оскільки процес знаходиться у фоновому режимі (і startобчислюється лише один раз). У Bash ви можете робити (( diff = end - start ))скидання знаків долара і дозволяючи інтервалу бути більш гнучким. Використовуйте, pgrepякщо у вас є.
awk).
parallelі це говорить мені, що я можу виконати лише 500 паралельних завдань через системний ліміт файлових ручок. Я підняв ліміт у limit.conf, але тепер, коли я намагаюся запустити 5000 симуляційних завдань, він миттєво з’їдає всю мою пам'ять (49 Gb) ще до початку, тому що кожен parallel сценарій perl їсть 32Mb.
ulimitпокаже деякі з цих меж.