프로세스뿐만 아니라 전체 사용자를 CPU의 10% 미만으로 제한하는 방법은 무엇입니까?

프로세스뿐만 아니라 전체 사용자를 CPU의 10% 미만으로 제한하는 방법은 무엇입니까?

저는 centos, cpanel/whm을 실행 중이고 cpulimit가 설치되어 있습니다.

내가 겪고 있는 문제는 내 사용자 중 한 명이 엄청난 양의 CPU 사용량을 사용하고 있다는 것입니다. 100% 이상 지속적으로 서버 속도가 느려지고 있습니다.

더 큰 문제는 그들이 친구이고 악의적이지 않기 때문에 정지시키고 싶지 않다는 것입니다.

또한 더 나아가 문제는 이 프로세스가 매초 변경되기 때문에 프로세스별로 제한할 수 없다는 것입니다. 매번 다른 과정입니다.

다음을 시도했지만 작동하지 않습니다.

cpulimit -l 10 -e /home/[username]/public_html/theirwebsite.org/index.php

그냥 돌려받음,

No process found
No process found
No process found
No process found
No process found
No process found

극단적인 CPU 사용량을 사용하는 두 가지가 있습니다.

첫 번째는 해당 위치에 있는 파일입니다 index.php. 기타는 WHM에서 의미하는 [php]입니다. 그러나 주로 index.php문제가 있습니다.

index.php해당 위치에서 해당 파일을 제한할 수 있으면 이 문제를 완화하는 데 도움이 될 수 있습니다.

그건 그렇고, 나는 -P플래그를 시도했지만 문서와 달리 옵션으로 사용할 수 없습니다.

cpulimit -l 10 -P /home/[username]/public_html/theirwebsite.org/index.php

보고

cpulimit: invalid option -- 'P'
Usage: cpulimit [OPTIONS...] TARGET
   OPTIONS
      -l, --limit=N          percentage of cpu allowed from 0 to 1600 (required)
      -v, --verbose          show control statistics
      -z, --lazy             exit if there is no target process, or if it dies
      -i, --include-children limit also the children processes
      -h, --help             display this help and exit
   TARGET must be exactly one of these:
      -p, --pid=N            pid of the process (implies -z)
      -e, --exe=FILE         name of the executable program file or path name
      COMMAND [ARGS]         run this command and limit it (implies -z)

그래서 플래그로 해야 할 것 같습니다 -e.

그러나 이상적으로는 전체 사용자 계정을 제한하고 싶습니다.

그리고 네, 저는 cloudlinux에 대해 알고 있지만 지금은 그렇게 할 수 없습니다. 그렇게 할 수 있을 때까지는 서버 재부팅이 필요하지 않은 작업을 수동으로 수행하는 데 도움이 필요합니다.

답변1

프로세스(PID)를 사용하여 친구를 제한할 수 없다는 것이 맞습니다. Apache는 수신되는 모든 요청에 ​​대해 새 프로세스(작업자)를 생성하여 매번 새 PID를 할당합니다.

에서 설정한 PHP 핸들러에 따라 WHM -> MultiPHP Manager -> PHP HandlersApache는 PHP 스크립트를 자체적으로 실행하거나 파일을 소유한 사용자로 실행합니다. 핸들러로 사용하면 suPHP파일을 소유한 계정으로 PHP 프로세스가 실행됩니다.

소유자가 스크립트를 실행하는 경우 CPU 사용량을 파일에 추가하여 계정의 CPU 사용량을 제한할 수 있습니다 /etc/security/limits.conf. 이를 사용하여 CPU 비율을 정확하게 제한할 수는 없지만 해당 프로세스가 서버의 다른 프로세스보다 낮은 우선 순위를 갖도록 'nice' 값을 수정할 수 있습니다. 따라서 다른 프로세스는 오래 기다릴 필요가 없습니다.

저는 이것을 직접 사용해본 적이 없지만(CloudLinux를 실행합니다) 다음 항목을 믿습니다.~해야 한다문제에 대한 도움:

username    hard    priority    30

이는 사용자가 실행하는 프로세스의 최대 우선순위를 30으로 설정합니다. 제가 이해한 바에 따르면 우선순위가 높을수록 다른 프로세스(우선순위가 낮음)가 더 많은 CPU 시간을 얻는다는 의미입니다.

cPanel을 실행하는 내 서버에서 대부분의 프로세스의 우선 순위는 20이므로 위 논리에 따라 해당 사용자의 우선 순위를 30으로 설정하면 다른 프로세스가 이러한 프로세스보다 먼저 실행될 수 있습니다.

답변2

시도해 보셨나요?C그룹?


  • 서비스를 설치 sudo yum install libcgroup하고 시작합니다 sudo service cgconfig start.
  • 그런 다음 다음을 실행하여 cgroup의 하위 시스템 구성을 확인합니다.sudo ls /cgroup

라는 이름의 cgroup을 생성합니다 limitcpu. group으로 시작하는 줄은 cgroup을 생성하고 하위 시스템 매개변수를 설정합니다.

예 /etc/cgconfig.conf:

group limitcpu{

        cpu {
                cpu.shares = 200;
                # cpu.cfs_period_us
                # cpu.cfs_quota_us
        }
        memory {

        }
}

CPU 제한에는 몇 가지가 있습니다.조정 가능한 매개변수노골적인 CPU 사용량을 제한하는 데 사용할 수 있는 것

cgroup의 작업이 1초당 0.1(10%)초 동안 단일 CPU에 액세스할 수 있어야 하는 경우, cpu.cfs_quota_us를 100000으로, cpu.cfs_기간_us를 1000000으로 설정합니다.


Cgred는 /etc/cgrules.conf 파일에 설정된 매개변수에 따라 작업을 cgroup으로 이동하는 서비스(cgrulesengd 서비스 시작)입니다. /etc/cgrules.conf 파일의 항목은 다음 두 가지 형식 중 하나를 취할 수 있습니다.

user subsystems control_group
user:command subsystems control_group

user사용자 이름 또는 그룹 이름 앞에는 "@" 문자가 붙습니다 . subsystems쉼표로 구분된 하위 시스템 이름 목록으로 바꾸고 control_groupcgroup에 대한 경로를 나타내며 command프로세스 이름 또는 프로세스의 전체 명령 경로를 나타냅니다.

예 etc/cgrules.conf:

*:firefox      cpu,memory      browsers/
@admin:memhog  memory          limitmem/
cpuhog         cpu             limitcpu/
  • firefox모든 사용자가 실행하는 프로세스는 자동으로 브라우저에 추가되며 cgroupCPU 및 메모리 하위 시스템이 제한됩니다.

  • memhog그룹 의 모든 사람이 실행하는 프로세스는 admincgroup에 추가되며 limitmem메모리 하위 시스템이 제한됩니다.

    - 귀하의 사용자는 cpuhogcgroup 'limitcpu'에 추가되고 CPU 하위 시스템으로 제한됩니다.


사전 사용 사례에서는 대신 템플릿을 활용해 볼 수 있습니다.

예를 들어 /etc/cgconfig.conf에서 다음 템플릿을 지정합니다.

template users/%g/%u {
                     cpuacct{
                     }
                     cpu {
                        cpu.shares = "1000";
                     }
          }

그런 다음 /etc/cgrules.conf 항목의 세 번째 행에 있는 users/%g/%u 템플릿을 사용합니다. 이는 다음과 같습니다:

peter:ftp       cpu     users/%g/%u

위에서 사용된 변수 %g and %u는 ftp 프로세스의 소유자에 따라 그룹 및 사용자 이름으로 자동 대체됩니다.

프로세스가 adminstaff 그룹의 peter에 속하는 경우 위 경로는 로 변환됩니다 users/adminstaff/peter.

그런 다음 cgred 서비스는 이 디렉토리를 검색하고 존재하지 않는 경우 cgred는 이를 생성하고 프로세스를 users/adminstaff/peter/tasks에 할당합니다.

템플릿 규칙은 구성 파일의 템플릿 정의에만 적용되므로 "group users/adminstaff/peter"가 /etc/cgconfig.conf에 정의된 경우에도 "template users/%g/%를 위해 무시됩니다. 유".

Digital Ocean의 튜토리얼.

제어 그룹 소개.

답변3

아마도 /etc/security/limits.conf를 설정하여 사용자가 소비할 수 있는 CPU 시간과 메모리 양을 조정할 수 있을 것입니다. 자세한 내용은 참조https://linux.die.net/man/5/limits.conf

관련 정보