이 작업을 수행하는 "정식" 방법이 있는지 궁금합니다.
배경 및 설명
라이브 서버에 몇 가지 프로그램을 설치해야 합니다. 나는 공급업체(FOSS, Github, 여러 작성자...)를 신뢰하지만, 스크립트가 문제를 일으키고 시스템 리소스를 소모하며 서버가 응답하지 않게 되는 완전히 불가능하지는 않은 시나리오를 피하고 싶습니다. amavis가 설치되어 설치 직후에 시작되었지만 일부 잘못된 구성으로 인해 평균 로드가 4를 초과하고 시스템이 거의 응답하지 않는 상황이 있었습니다.
나의 첫 번째 가르침은 nice
- 이었습니다 nice -n 19 thatscript.sh
. 이것이 도움이 될 수도 있고 그렇지 않을 수도 있지만, 다음을 수행하는 스크립트를 작성하고 활성화하는 것이 더 낫다고 생각합니다.
데몬으로 실행(예) 500ms-2s
ps
및 표시가 있는 프로세스를 확인하세요 .grep
표시된 프로세스(또는 다른 프로세스)가 너무 많은 CPU를 사용하는 경우(아직 정의되지 않음) 해당 프로세스를 종료합니다.
SIGKILL
두 번째 교훈은 제가 바퀴를 재발명한 것이 이번이 처음이 아니라는 것입니다.
그렇다면 프로그램과 프로그램이 생성하는 프로세스를 미리 정의된 제한된 양의 시스템 리소스에 "감금"하거나 특정 임계값에 도달하면 자동으로 종료하는 좋은 방법이 있습니까?
답변1
대안 #1: monit을 사용하여 프로세스 모니터링
설치하다매체/모니터링그리고 이 템플릿을 기반으로 구성 파일을 만듭니다.
check process myprogram
matching "myprogram.*"
start program = "/usr/bin/myprogram" with timeout 10 seconds
stop program = "/usr/bin/pkill thatscript"
if cpu > 99% for 2 cycles then stop
if loadavg (5min) > 80 for 10 cycles then stop
대안 #2: cgroup을 사용하여 프로세스 CPU 사용량 제한
가장 기본적인 Linux 전용 솔루션 중 하나입니다. 많은 옵션과 복잡성을 제공합니다.
예:
sudo cgcreate -g cpu:/cpulimited
sudo cgset -r cpu.shares=512 cpulimited
sudo cgexec -g cpu:cpulimited /usr/bin/myprogram > /dev/null &
다음 내용을 더 읽어보시기 바랍니다.
DigitalOcean - 방법: CentOS 6에서 cgroup을 사용하여 리소스 제한
대안 #3: CPUlimit를 사용하여 프로세스 CPU 사용량을 제한합니다.
선택한 패키지 관리자로부터 최신 버전의 cpulimit를 얻거나 사용 가능한 소스를 얻습니다.GitHub.
CPU 사용량을 90%로 제한합니다.cpulimit -l 90 /usr/bin/myprogram > /dev/null &
참고 사항:
특정 CPU 코어를 사용하도록 프로세스를 고정하여 항상 여유 CPU 성능을 확보할 수도 있습니다.
답변2
systemd
대상/서비스에 대한 리소스는 제한될 수 있습니다. man
페이지 에서 :
실행 중인 프로세스에 지정된 CPU 시간 할당량을 할당합니다. 접미사 "%"를 사용하여 백분율 값을 사용합니다. 이 백분율은 CPU에서 사용할 수 있는 총 CPU 시간에 비해 장치가 받을 수 있는 최대 CPU 시간을 지정합니다. 여러 CPU에 CPU 시간을 분배하려면 100%보다 큰 값을 사용하십시오. 이는
cpu.max
통합 제어 그룹 계층의 " " 속성과cpu.cfs_quota_us
레거시의 " " 속성을 제어합니다. 이러한 제어 그룹 속성에 대한 자세한 내용은cgroup-v2.txt
및 을 참조하십시오sched-design-CFS.txt
.예:
CPUQuota=20%
실행 중인 프로세스가 CPU에서 CPU 시간의 20%를 초과하지 않도록 하십시오.힌트"
CPUAccounting=true
".
CPUAccounting
이것을 사용하면 나도 포함할 것이기 때문이다 .
이 머신의 CPU 사용량 통계를 켭니다. 부울 매개변수를 사용합니다. 셀의 CPU 공간을 열면 동일한 슬라이스에 포함된 모든 셀과 그 안에 포함된 모든 상위 슬라이스 및 셀에 대해서도 암시적으로 열립니다. 이 설정의 시스템 기본값은
DefaultCPUAccounting=
를 통해 제어할 수 있습니다systemd-system.conf(5)
.
나도 인용할게Slice
:
단위를 배치하는 데 사용된 슬라이스 단위의 이름입니다.
system.slice
기본값은 모든 셀 유형의 모든 인스턴스화되지 않은 셀에 대한 것입니다(슬라이스 셀 자체는 제외, 아래 참조). 기본적으로 인스턴스 셀은system.slice
템플릿 이름을 따라 명명된 하위 슬라이스에 배치됩니다.
따라서 기본적으로 모든 것이 동일한 slice
리소스 풀에 배치됩니다. 즉, 모든 것이 하나의 리소스 풀에 있음을 의미합니다.
MemoryHigh
볼만한 추가 장소:
이 장치에서 실행되는 프로세스의 메모리 사용량 상한을 지정합니다. 부득이하게 메모리 사용량이 한도를 초과할 수도 있는데, 이 경우 프로세스 속도가 심하게 느려지고 메모리를 많이 차지하게 된다. 이는 단위 메모리 사용량을 제어하는 기본 메커니즘입니다.
메모리 크기를 바이트 단위로 가져옵니다. 값에 K, M, G 또는 T 접미사가 붙는 경우 지정된 메모리 크기는 각각 킬로바이트, 메가바이트, 기가바이트 또는 테라바이트(기본 1024)로 해석됩니다. 또는 시스템에 설치된 실제 메모리를 기준으로 백분율 값을 지정할 수 있습니다. 특수 값 "무한대"를 지정하면 메모리 제한이 적용되지 않습니다. 이는 "
memory.high
" 제어 그룹 속성을 제어합니다. 이 제어 그룹의 속성에 대한 자세한 내용은 을 참조하십시오cgroup-v2.txt
.힌트"
MemoryAccounting=true
".이 설정은 통합 제어 그룹 계층 구조를 사용하고 비활성화된 경우에만 지원됩니다
MemoryLimit=
.
systemd
서비스에 스크립트를 쉽게 넣을 수 있습니다 .
/usr/local/thatscript.sh
스크립트가 다음과 같다고 가정해 보겠습니다 .
/usr/lib/systemd/system/thatscript.service
[Unit]
Description=This runs "thatscript"
ConditionFileNotEmpty=/usr/local/thatscript.sh
[Service]
Type=simple
ExecStart=/usr/local/thatscript.sh
CPUQuota=20%
[Install]
WantedBy=multi-user.target
그런 다음 시작 시 실행하거나 수동으로 시작하려는 경우 systemctl daemon-reload
새 서비스 파일을 읽어야 합니다 .systemctl enable thatscript.service
systemctl start thatscript.service