Философов Unix,
Я запрограммировал некоторые инструменты на Perl, у которых есть часть, которая может работать параллельно. Я снабдил их опцией -j
(задания), например make
и prove
, имеющей , потому что это разумно . Однако вскоре я стал недоволен этим по двум причинам.
- Я указываю
--jobs=2
, потому что у меня два ядра ЦП, но мне не нужно сообщать компьютеру информацию, которую он может выяснить сам.
- Редко запускаемые программы занимают более 20% ЦП (нагрузка ввода-вывода также мала), тратя время впустую, не используя ЦП в большей степени.
Я взломал еще несколько, чтобы добавить измерение нагрузки, порождая дополнительные задания, пока еще есть «емкость», пока не будет достигнут порог нагрузки, это когда количество заданий остается более или менее постоянным, но когда в ходе прогона другие процессы с более высоким приоритетом требуют больше ЦП, со временем появляется меньше новых заданий и, соответственно, уменьшается число заданий.
Поскольку эта ответственность повторялась в коде инструментов, я включил аспект планирования в отдельный инструмент в духе nice
и др. . Параллельные инструменты теперь довольно тупые, у них есть только обработчики сигналов, с помощью которых им говорят увеличивать или уменьшать пул заданий, тогда как интеллектуальные средства измерения нагрузки и определения того, когда управлять пулом, находятся в планировщике.
Вкус предварительного интерфейса (я также хочу предоставить разумные значения по умолчанию, чтобы опции можно было опустить):
run-parallel-and-schedule-job-pool \
--cpu-load-threshold=90% \
--disk-load-threshold='300 KiB/s' \
--network-load-threshold='1.2 MiB/s' \
--increase-pool='/bin/kill -USR1 %PID' \
--decrease-pool='/bin/kill -USR2 %PID' \
-- \
parallel-something-master --MOAR-OPTIONS
Прежде чем я приложу усилия к последним 90% , скажите мне, дублирую ли я чужую работу ? Концепция вполне очевидна, поэтому, похоже, это уже должно было быть сделано, но я не мог найти это в качестве отдельного инструмента ответственности, только как глубоко интегрированную часть больших многоцелевых наборов системных администраторов.
Бонусный вопрос: я уже знаю runN
и parallel
. Они выполняют параллельное выполнение, но не имеют динамического планирования (niceload
идет на эту территорию, но довольно примитивно). Если вопреки моим ожиданиям автономный инструмент еще не существует, мне лучше расширить runN
себя или подать желание против parallel
?