
Я хочу запустить огромное количество (например, 256) служб с помощью systemd. К счастью, systemd предлагает слайсы, что позволяет довольно легко повторно использовать описание службы. Но запуск многих процессов одновременно убивает систему, потому что каждый процесс выполняет некоторые начальные вычисления, что увеличивает нагрузку выше 50.
Можно ли определить цепочку зависимостей для всех служб с помощью срезов, After=service@%(i-1).service Wants=service@%(i-1).service? Или можно определить что-то вроде пула служб, а systemd будет управлять запуском служб, т. е. не запускать все сразу, а запускать, может быть, 10 сразу, а затем следующий блок?
решение1
Я нашел хорошее решение с помощью ExecStartPost
.
% systemctl --user cat example@
# /home/joerg/.config/systemd/user/[email protected]
[Unit]
Description=Example of service farm; instance %i
[Service]
Type=simple
ExecStart=/bin/sleep 99999
ExecStartPost=/bin/sh -c 'test %i -gt 0 || exit 0 ; systemctl --no-block --user start %p@$((%i - 1))'
% systemctl --user start example@2
% systemctl --user status example.slice
● example.slice
Loaded: loaded
Active: active since Thu 2017-04-27 11:04:43 CEST; 27min ago
CGroup: /user.slice/user-1000.slice/[email protected]/example.slice
├─[email protected]
│ └─19423 /bin/sleep 99999
├─[email protected]
│ └─19420 /bin/sleep 99999
└─[email protected]
└─19417 /bin/sleep 99999
решение2
Нет, systemd не поддерживает такой синтаксис Wants=service@%(i-1).service?
.
Однако вы можете написать простой скрипт, который выписывает 256 похожих файлов systemd unit, содержащих явную цепочку зависимостей. Вот некоторые другие шаблоны для рассмотрения:
systemd
позволяет вам устанавливать параметры управления ресурсами во время выполнения с помощью следующего синтаксиса:systemctl --runtime set-property foobar.service CPUShares=777
Итак, вы можете при запуске уменьшить нагрузку на ваши юниты, чтобы они использовали меньше ЦП, а затем, когда все успокоится, позволить им использовать больше ЦП. Это кажется сложнее, чем нужно, что приводит меня к следующему варианту...
- В
man systemd.resource-control
, вы обнаружите, что естьStartupCPUShares=
опция, которая отличается отCPUShares=
опции. Я бы поэкспериментировал с троттлингом ЦП с помощью,StartupCPUShares=
чтобы посмотреть, даст ли это желаемый результат.
Лично я использовал очень низкотехнологичный способ решения подобной проблемы. Я запустил свою серию служб по одной за раз, с "сном" между запусками служб. Это использовало немного скриптинга bash вместо system
, но сработало достаточно хорошо. К счастью, у меня также нет требования вывести все службы в онлайн как можно скорее.
Следующую версию системы я, скорее всего, разработаю systemd
и попробую использовать StartupCPUShares=
ее сам, чтобы увидеть, является ли это лучшим способом решения проблемы.