CPU와 "잘 지내도록" 시스템 서비스를 제한하는 방법은 무엇입니까?

CPU와 "잘 지내도록" 시스템 서비스를 제한하는 방법은 무엇입니까?

CPU를 많이 사용하는 작업으로 인해 시스템이 정체되는 경향이 있는 시스템 서비스(CI 실행기)가 있습니다. 방금 로드 평균이 100을 넘었다는 것을 알았고 이 말도 안되는 소리를 멈추고 싶습니다.

시스템의 다른 어떤 것도 어떤 식으로든 제한되지 않으므로 다른 모든 항목은 지금처럼 계속 실행될 것으로 예상됩니다. 하지만 다음과 같습니다.

  • (a) 각 프로세스는 CI 작업이 실행되는 고유한 사용자로 실행됩니다.
  • (b) systemd 서비스 데몬에 의해 인스턴스화된 모든 하위 프로세스

...시스템의 다른 모든 것에 대해 보조적인 역할을 합니다. 실제로 시스템의 다른 어떤 항목도 나머지 10%의 CPU 주기를 필요로 하지 않더라도 90%의 절대 상한선을 갖기를 원합니다. 그러나 CPU 시간이 필요한 다른 항목이 있는 경우에는 최대한 많은 CPU를 확보하기를 원합니다. 가능한 한 시간. 그들은 첫 번째가 되고 싶어합니다.

이 기능을 구성하는 가장 좋은 방법은 무엇입니까?저는 EC2에서 Arch Linux를 실행하고 있으며 cgroup을 사용할 수 있지만(cgmanager 포함) 사용한 적이 없습니다.

답변1

첫째, 웹 검색에 나타나는 내용 중 대부분이 더 이상 사용되지 않습니다. 예를 들어 cgmanager새로운 systemd 버전은 더 이상 지원되지 않습니다. 작업을 수행하기 위해 이나 다른 도구를 사용하는 cpulimit한 웹에서 검색한 내용을 99% 따르지 마세요. 그들은 광고된 대로 전혀 작동하지 않거나(cgroup 관리 도구가 사용자 자신의 계층 구조를 생성할 것을 기대하는 것처럼) 많은 해킹에 의지하지 않고는 작업을 완료하지 못합니다(예: '좋은 수준'을 사용하여 관리) 전체 프로세스 그룹).nicecgset

좋은 소식은 이러한 반대에도 불구하고(그리고 전통적인모든 것을 집어삼키는 문어 괴물 운영 방식systemd) 시스템의 모든 항목에는 기본 구성이 있으며 systemd 서비스에 맞게 조정하는 것은 쉽지 않습니다. 제한하려는 서비스에 재정의 구성을 추가하기만 하면 됩니다.

$ sudo systemctl edit <servicename>

무엇이든 섹션을 추가하세요.리소스 제어 값당신은 덮고 싶어합니다. 내 경우에는 다음과 같이 생각해 냈습니다.

[Service]
CPUWeight=20
CPUQuota=85%
IOWeight=20
MemorySwapMax=0

이 값이 모두 필요한 것은 아니지만 처음 두 값은 질문에 대답합니다.

  • CPUWeight시스템의 모든 프로세스에 대한 기본값은 100입니다. 결과를 크게 늦추지 않고 다른 작업에 대해 시스템의 응답성을 효과적으로 유지할 수 있는 다른 방법이 없는 경우 더 낮은 값을 설정하면 프로세스가 CPU를 계속 사용할 수 있습니다. 이는 임의로 가중치가 부여된 정수입니다.
  • CPUQuota아무 일도 일어나지 않더라도 부여할 수 있는 CPU 시간에는 절대적인 제한이 있습니다. 이는 백분율 값입니다. 제가 생각하는 한, 리소스 낭비 문제를 해결하기 위해 설정할 필요는 전혀 없습니다. 아무튼 CI 작업이 많이 쌓이면 결국 CPU 온도를 낮추기 위해 설정을 하게 되었습니다.
  • IOWeight와 매우 유사합니다 CPUWeight. 이 경우 시스템 작업을 위해 디스크를 여유 공간으로 유지하고 다른 작업이 진행되지 않을 때만 CI 작업으로 디스크를 사용하도록 유지하는 데 사용됩니다.
  • MemorySwapMax또한 질문의 범위에 포함되지 않지만, 제 경우에는 povray일부 CI 작업에서 실행되는 Ray Traverser()가 30GB 이상의 RAM 외에 30GB 이상의 스왑을 사용하고 있다고 생각했기 때문에 이를 추가하게 되었습니다. 이 시스템은 좋은 생각이 거기 있기 때문에. 전혀 사용하지 않으면 더 빨리 실행됩니다. 이것은 아마도 povray에서 더 나은 구성일 것입니다. 그러나 이렇게 하면 CI 작업 내부에서 무슨 일이 일어나고 있는지 모니터링하거나 시스템 스와핑을 비활성화할 필요가 없습니다.

마지막으로 이러한 값은 를 실행하여 서비스를 다시 시작할 필요 없이 즉시 변경할 수 있습니다 systemctl daemon-reload. 이는 변화의 효과를 즉시 관찰하는데 매우 편리합니다.

관련 정보