Я запускаю тисячі та процеси фонових завитків паралельно у наступному скрипті 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
покаже деякі з цих меж.