주어진 프로세스에 대한 CPU 제한을 영구적으로 설정하는 방법 Cpulimit와 좋은 작동하지 않습니다


12

비슷한 질문이 많이 있지만 내 문제를 해결하는 데 도움이되는 것은 없습니다.

서버에 우분투 11.10이 있습니다 (데스크톱 버전입니다). 나는 거기에 실행중인 웹 사이트가 있습니다. 매우 중요한 하나의 프로세스가 있지만 우선 순위가 높은 프로세스를 실행할 필요는 없습니다. 사용자가 아닌 process대한 CPU 사용량을 영구적으로 제한하고 싶습니다 . 이 프로세스는 exec 함수 (시스템 프로세스가 아니라 php 함수)에 의해 실행됩니다.

그래서 두 가지 옵션이 있습니다. 1. 함수가 실행될 때마다 어떤 종류의 제한을 추가하십시오. 2.이 프로세스의 CPU 사용량을 영구적으로 제한하십시오.

"nice"와 cpulimit를 사용하려고 시도했지만 아무것도 작동하지 않는 것 같습니다. 니스에는 아무런 영향이 없으며 cpulimit (-e로)는 "대상 프로세스를 찾을 수 없습니다"라고 말합니다.

나는 초보자이기 때문에 거의 아무것도 모른다고 가정하십시오.


당신이 무엇을 시도했는지 알려주십시오. cgroups가이를 수행 할 수 있습니다.
Panther

구성과 cgsnapshot -s관련하여 구성 파일을 수동으로 쓰지 않고 정보를 검색하기 위해를 실행할 수 있습니다 . 후자는 권장되지 않습니다.
Mingliang Liu

실제로 프로세스를 조절하고 싶 습니까? 즉 , 설정된 시간을 초과 하지 않도록 하시겠습니까?
Ken Sharp

나는이 방법을 사용했고 그것은 나를 위해 일했다. ubuntuforums.org/showthread.php?t=992706
Mustafa Salman

답변:


19

요청한 세부 정보가없는 경우 ...

우분투에서 cgroup을 사용하는 방법은 다음과 같습니다.

이 게시물 전체에서 변수 "$ USER"를 프로세스를 실행하는 사용자로 변경해야합니다.

메모리에 대한 정보를 추가했지만 FAQ가 될 것입니다. 필요하지 않은 경우 사용하지 마십시오.

1) 설치 cgroup-bin

sudo apt-get install cgroup-bin

2) 재부팅하십시오. cgroups는 이제/sys/fs/cgroup

3) 사용자 (프로세스 소유자)를위한 cgroup을 만듭니다.

# Change $USER to the system user running your process.
sudo cgcreate -a $USER -g memory,cpu:$USER

4) 사용자가 리소스를 관리 할 수 ​​있습니다. 기본적으로 사용자는 1024 CPU 단위 (공유)를 얻으므로 약 10 % CPU로 제한하기 위해 메모리는 바이트 단위입니다 ...

# About 10 % cpu
echo 100 > /cgroup/cpu/$USER/cpu.shares

# 10 Mb
echo 10000000 > /cgroup/memory/$USER/memory.limit_in_bytes

5) 프로세스 시작 (exec를 cgexec로 변경)

# -g specifies the control group to run the process in
# Limit cpu
cgexec -g cpu:$USER command <options> &

# Limit cpu and memory
cgexec -g memory,cpu:$USER command <options> &

구성

cgroups가 당신을 위해 일하고 있다고 가정합니다.)

편집 /etc/cgconfig.conf하고 커스텀 cgroup에 추가하십시오.

# Graphical
gksudo gedit /etc/cgconfig.conf

# Command line
sudo -e /etc/cgconfig.conf

cgroup에 추가하십시오. 프로세스를 소유 한 사용자 이름으로 $ USER를 다시 변경하십시오.

group $USER {
# Specify which users can admin (set limits) the group
perm {    
    admin {
        uid = $USER;
    }
# Specify which users can add tasks to this group
    task {
        uid = $USER;
    }
}
# Set the cpu and memory limits for this group
cpu {
    cpu.shares = 100;
    }
memory {
    memory.limit_in_bytes = 10000000;
    }
}

그룹을 지정할 수도 있습니다 gid=$GROUP. /etc/cgconfig.conf는 주석이 잘 달렸습니다.

이제 다시 프로세스를 실행하십시오. cgexec -g cpu:$USER command <options>

PID로 프로세스를 볼 수 있습니다. /sys/fs/cgroup/cpu/$USER/tasks

bodhi @ ufbt : ~ $ cgexec -g cpu : 보디 수면 100 &

[1] 1499

bodhi @ ufbt : ~ $ 고양이 / sys / fs / cgroup / cpu / bodhi / tasks

1499

자세한 내용은 http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/를 참조하십시오.


2
1 부로 마무리했습니다. 작동하지만 다른 프로세스에는 CPU / 메모리가 필요한 반면 프로세스가 제한되어 있다는 정보를 추가해야합니다. 그것은 분명하지 않습니다-그리고 (내가 시작하는 것처럼) 알아내는 데 시간이 오래 걸립니다. "구성"이 재부팅 후에도 설정을 저장하는 것임을 올바르게 알고 있습니까?
Rafal

1
분류해서 다행입니다. 약간의 학습 곡선이 있습니다. =) 예, 구성은 부팅시 설정을 유지하는 것입니다.
Panther

명령 줄에서 cgroup을 사용하면 정상적으로 작동합니다. 그러나 PHP의 exec 함수에서 동일한 명령을 실행할 때 : (<? php exec ( "cgexec -g cpu : GroupHere NameOfProcess InputFile OutputFile"); 작동하지 않습니다. 명령 줄과의 차이점은 나는에있어와 PHP에서 내가 그 파일에 긴 경로를 사용하여 폴더 문제가 될 수 있습니다 어떤 생각 나는 두 경우 모두에 동일한 사용자를 사용합니다.?.
라팔

1
@Rafal : 첫 번째 의견 이 정확하지 않습니다. 다른 프로세스가 많은 메모리를 차지하지 않더라도 메모리가 제한되어야합니다.
Flimm

1
@Flimm이 솔루션을 테스트 할 때 2 개의 프로세스 만 실행되었습니다-아파치 및 프로세스가 제한적입니다. 아파치 연결이 설정되지 않았거나 아파치에 대한 연결이 하나만있을 때, 제한된 프로세스는 CPU의 100 %를 차지했습니다. 아파치에 여러 번 연결되면 한 번만 제한되었습니다 (웹 브라우저에서 웹 사이트를 많이 새로 고침하여 수행했습니다). 다른 프로세스가 실행되고 있지 않은 경우 일 수 있습니다.
Rafal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.