나의 systemd
목표는 약 100개의 어린이 서비스를 제공하는 것입니다. 단일 하위 서비스를 다시 시작하면 몇 초 안에 시작됩니다.
그러나 100개 하위 서비스를 모두 한 번에 다시 시작하면 모든 CPU 코어가 중단되고 로드가 최대 50까지 올라가며 모든 하위 서비스가 시작하기 위해 CPU 리소스를 놓고 경쟁하므로 서비스가 30초 이상 오프라인 상태로 유지됩니다.
이 문제에 대한 한 가지 해결책은 롤링 재시작 스크립트를 작성하는 것입니다. 즉, 모든 하위 서비스를 찾아 3초 간격으로 하나씩 다시 시작하는 것입니다. 이를 통해 모든 하위 항목이 빠르게 나타날 수 있지만 새로운 하위 서비스가 추가됨에 따라 점점 느려집니다.
systemd의 스탬피드 효과를 방지하는 다른 방법이 있습니까? 적절한 CPU 조절을 통해 하나의 하위 프로세스가 CPU를 사용하는 것을 방지하여 심각한 가동 중지 시간이나 인위적인 일시 중지 없이 서비스를 효율적으로 다시 시작할 수 있을 것이라고 생각했습니다.
또한 systemd를 사용하여 종속성 체인을 설정하고 싶지 않습니다. 현재 모든 하위 서비스는 동일한 systemd 템플릿을 공유합니다.
답변1
내 템플릿 서비스에 지시어를 추가해 보았 CPUWeight=80
으나 아무런 변화가 없는 것 같습니다. 작동하는 방법은 big-restartall.service
간단한 롤링 재시작을 위한 논리가 포함된 간단한 bash 스크립트를 만드는 것입니다 . 내 경우에는 각 서비스 사이에 1초의 일시 중지가 쇄도 효과를 방지하기에 충분하여 프로세스에서 시작 시간과 부하를 낮게 유지한다는 것을 알았습니다.
# Restart the children of "big.target".
for service in $(systemctl list-dependencies --plain big.target | grep -v target); {
systemctl restart $service;
# Give those processes a chance to start-- avoid a stampede effect.
sleep 1;
}