systemd를 사용하여 많은 수(예: 256)의 서비스를 시작하고 싶습니다. 다행스럽게도 systemd는 슬라이싱을 제공하므로 서비스 설명을 매우 쉽게 재사용할 수 있습니다. 그러나 여러 프로세스를 동시에 시작하면 각 프로세스가 일부 시작 계산을 수행하여 로드가 50을 초과하므로 시스템이 종료됩니다.
슬라이스를 사용하여 모든 서비스(After=service@%(i-1).service Wants=service@%(i-1).service)에 대한 종속성 체인을 정의할 수 있습니까? 아니면 서비스 풀과 같은 것을 정의한 다음 시스템에서 서비스 시작을 관리할 수 있습니까? 즉, 서비스를 모두 한 번에 실행하는 대신 다음 청크를 시작하기 전에 한 번에 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
다음 구문을 사용하여 런타임에 리소스 제어 매개변수를 설정할 수 있습니다.systemctl --runtime set-property foobar.service CPUShares=777
따라서 시작하는 동안 각 장치가 더 적은 CPU를 사용하도록 장치를 제한하고 상황이 진정되면 더 많은 CPU를 사용하도록 허용할 수 있습니다. 이것은 필요 이상으로 어려운 것 같아서 다음 옵션으로 이동합니다...
- 에서는 options 와 다른 옵션이
man systemd.resource-control
있음을 알 수 있습니다 . CPU를 조절하여 원하는 결과가 나오는지 확인하겠습니다.StartupCPUShares=
CPUShares=
StartupCPUShares=
개인적으로 저는 이와 같은 문제를 해결하기 위해 매우 낮은 수준의 기술을 사용합니다. 서비스 시작 사이에 "휴면"을 두고 일련의 서비스를 한 번에 시작합니다. 대신 일부 bash 스크립팅을 사용 system
하지만 잘 작동합니다. 고맙게도 가능한 한 빨리 모든 것을 온라인에 올려달라고 요청하는 것도 아닙니다.
나는 아마도 시스템의 다음 반복을 설계하고 이것이 문제를 해결하는 더 나은 방법인지 알아보기 위해 직접 systemd
시도해 볼 것입니다 .StartupCPUShares=