systemd로 수많은 서비스를 시작하세요

systemd로 수많은 서비스를 시작하세요

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개의 유사한 시스템 단위 파일을 작성하는 간단한 스크립트를 작성할 수 있습니다. 고려해야 할 몇 가지 다른 패턴은 다음과 같습니다.

  1. systemd다음과 같은 구문을 사용하여 런타임에 리소스 제어 매개변수를 설정할 수 있습니다.

    systemctl --runtime set-property foobar.service CPUShares=777

따라서 시작하는 동안 CPU를 덜 사용하도록 장치를 조절할 수 있으며, 일단 상황이 진정되면 더 많은 CPU를 사용하도록 허용할 수 있습니다. 이것은 필요 이상으로 어려운 것 같아서 다음 옵션으로 이동합니다 ...

  1. 에서는 옵션 과 구별되는 옵션이 man systemd.resource-control있음을 알 수 있습니다 . 원하는 결과가 나오는지 확인하기 위해 CPU 조절을 실험해 보겠습니다 .StartupCPUShares=CPUShares=StartupCPUShares=

개인적으로 저는 이와 같은 문제를 해결하기 위해 매우 낮은 기술의 경로를 사용했습니다. 나는 서비스 시작 사이에 "휴면"을 두고 한 번에 하나씩 일련의 서비스를 시작했습니다. 이것은 대신에 약간의 bash 스크립팅을 사용했지만 system충분히 잘 작동했습니다. 다행히도 가능한 한 빨리 모든 서비스를 온라인으로 전환해야 할 필요는 없습니다.

다음 시스템 반복에서는 내가 설계할 가능성이 높으며 문제를 해결하는 더 나은 방법인지 확인하기 위해 직접 systemd사용해 볼 것입니다 .StartupCPUShares=

관련 정보