
systemd를 사용하여 엄청난 수(예: 256)의 서비스를 시작하고 싶습니다. 다행스럽게도 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
다음과 같은 구문을 사용하여 런타임에 리소스 제어 매개변수를 설정할 수 있습니다.systemctl --runtime set-property foobar.service CPUShares=777
따라서 시작하는 동안 CPU를 덜 사용하도록 장치를 조절할 수 있으며, 일단 상황이 진정되면 더 많은 CPU를 사용하도록 허용할 수 있습니다. 이것은 필요 이상으로 어려운 것 같아서 다음 옵션으로 이동합니다 ...
- 에서는 옵션 과 구별되는 옵션이
man systemd.resource-control
있음을 알 수 있습니다 . 원하는 결과가 나오는지 확인하기 위해 CPU 조절을 실험해 보겠습니다 .StartupCPUShares=
CPUShares=
StartupCPUShares=
개인적으로 저는 이와 같은 문제를 해결하기 위해 매우 낮은 기술의 경로를 사용했습니다. 나는 서비스 시작 사이에 "휴면"을 두고 한 번에 하나씩 일련의 서비스를 시작했습니다. 이것은 대신에 약간의 bash 스크립팅을 사용했지만 system
충분히 잘 작동했습니다. 다행히도 가능한 한 빨리 모든 서비스를 온라인으로 전환해야 할 필요는 없습니다.
다음 시스템 반복에서는 내가 설계할 가능성이 높으며 문제를 해결하는 더 나은 방법인지 확인하기 위해 직접 systemd
사용해 볼 것입니다 .StartupCPUShares=