사용자가 많은 Linux 시스템을 운영하지만 때때로 악용이 발생합니다. 여기서 사용자는 CPU / 메모리의 80 % 이상을 사용하는 단일 프로세스를 실행할 수 있습니다.
프로세스가 사용할 수있는 CPU 사용량을 제한하여 (예 : 10 %)이를 방지하는 방법이 있습니까? 알고 있습니다 cpulimit
. 그러나 불행히도 제한하도록 지시 한 프로세스 (예 : 단일 프로세스)에 제한을 적용합니다. 그래서 제 질문은, 예를 들어 id / 경로를 제공 할 필요없이 미래에 실행될 모든 실행중인 프로세스와 프로세스에 제한을 어떻게 적용 할 수 있습니까?
답변
메모리를 남용 할 수는 있지만 CPU에는 해당되지 않습니다. CPU가 유휴 상태 일 때 실행중인 프로세스 ( “실행 중”)는 프로세스가 I / O 또는 기타 작업을 기다리지 않음을 의미합니다. 기본적으로 100 % CPU 시간. 그리고 제한을 시행 할 이유가 없습니다.
덕분에 우선 순위를 설정할 수 있습니다 nice
. 주어진 사용자에 대한 모든 프로세스에 적용하려면 로그인 쉘을 다음과 nice
같이 실행해야합니다 . 하위 프로세스는 nice
값 을 상속합니다 . 사용자가 로그인하는 방법에 따라 다릅니다. 예를 들어 ssh 로그인 우선 순위 지정 (nice) 을 참조하십시오 .
또는 가상 머신을 설정할 수 있습니다. 실제로 프로세스 당 제한을 설정하는 것은 사용자가 시스템을 남용하여 많은 프로세스를 시작할 수 있기 때문에 의미가 없습니다. 가상 머신을 사용하면 모든 한계가 가상 머신에 적용됩니다.
다른 해결책은 /etc/security/limits.conf
한계 를 설정하는 것입니다 . limits.conf (5) 매뉴얼 페이지를 참조하십시오. 예를 들어, 로그인 당 최대 CPU 시간 및 / 또는 로그인 당 최대 프로세스 수를 설정할 수 있습니다. maxlogins
각 사용자에 대해 1로 설정할 수도 있습니다 .
답변
좋은 / renice
nice
시스템에 ‘일회성’조정을위한 훌륭한 도구입니다.
nice COMMAND
cpulimit
cpulimit
CPU 집약적 작업을 실행해야하고 여유 CPU 시간이 필요한 경우 시스템의 응답성에 필수적입니다.
cpulimit -l 50 COMMAND
cgroups
cgroups
하나의 프로세스가 아닌 일련의 프로세스에 제한을 적용
cgcreate -g cpu:/cpulimited
cgset -r cpu.shares=512 cpulimited
cgexec -g cpu:cpulimited COMMAND_1
cgexec -g cpu:cpulimited COMMAND_2
cgexec -g cpu:cpulimited COMMAND_3
자원
답변
cgroup을 보았습니까? 상의 몇 가지 정보가 아치 위키 그들에 대한이. 에 대한 섹션을 읽고 cpu.shares
필요한 작업을 수행하는 것처럼 보이고 사용자 수준에서 작동 할 수 있으므로 모든 사용자 프로세스를 한 번에 제한 할 수 있습니다.
답변
메모리의 경우 찾고 ulimit -v
있습니다. ulimit
자식 프로세스가 상속 한다는 점 에 유의하십시오 . 따라서 로그인시 사용자의 로그인 쉘에 적용하면 모든 프로세스에 적용됩니다.
사용자가 모두 bash
로그인 쉘로 사용 하는 경우 다음 줄을 입력 /etc/profile
하면 모든 사용자 프로세스의 하드 제한이 1 기가 바이트 (보다 정확하게는 백만 킬로바이트)가되어야합니다.
ulimit -vH 1000000
이 옵션 H
은 하드 한계인지 확인합니다. 즉, 사용자는 나중에이를 다시 설정할 수 없습니다. 물론 사용자는 한 번에 충분히 많은 프로세스를 시작하여 메모리를 채울 수 있습니다.
다른 셸의 경우 대신 어떤 초기화 파일을 읽는지 (그리고 대신 ulimit
사용 하는 다른 명령)를 찾아야합니다 .
CPU의 경우 원하는 것이 나에게 의미가없는 것 같습니다. 하나의 프로세스 만 실행될 때 CPU의 90 %가 사용되지 않도록하는 것은 무엇입니까? 나는 당신이 정말로 원하는 것이 nice
(그리고 아마도 ionice
) 라고 생각합니다 . 그와 같은주의 ulimit
, nice
값이 너무 로그인 시간 접미사의 로그인 쉘에 적용, 자식 프로세스에 의해 상속됩니다. 나는 그것이 또한 적용된다고 생각 ionice
하지만 확실하지 않습니다.
답변
당신이 cpulimit이 귀하의 경우 실용적이지 않을 것이라고 주장하고 있기 때문에, 나는 당신이 보는 것이 좋습니다 좋은 , renice 명령어 및 taskset taskset은 프로세스의 CPU 선호도를 설정할 수 있지만 그것 때문에, 가까운 당신이 달성하고 싶은에 올 수 있습니다, 귀하의 경우 즉시 도움이되지 않을 수 있습니다.
답변
태그에는가 centos
있으므로 사용할 수 있습니다 systemd
.
예를 들어 ID가 1234
다음 과 같은 사용자를 제한하려는 경우 :
sudo systemctl edit --force user-1234.slice
그런 다음 이것을 입력하고 저장하십시오.
[Slice]
CPUQuota=10%
다음에 사용자가 로그인하면 영향을 미칩니다.
남자 페이지 : systemctl
, systemd.slice
, systemd.resource-control
…
답변
이미 시작된 프로세스를 제한하려면 PID별로 하나씩 수행해야하지만 다음과 같이 배치 스크립트를 수행 할 수 있습니다.
#!/bin/bash
LIMIT_PIDS=$(pgrep tesseract) # PIDs in queue replace tesseract with your name
echo $LIMIT_PIDS
for i in $LIMIT_PIDS
do
cpulimit -p $i -l 10 -z & # to 10 percent processes
done
내 경우 pypdfocr
에는 탐욕을 시작합니다 tesseract
.
또한 어떤 경우에는 CPU가 꽤 좋았으므로 다음 renice
과 같이 사용할 수 있습니다 .
watch -n5 'pidof tesseract | xargs -L1 sudo renice +19'