특정 프로세스에서 CPU + RAM을 절약하기 위해 리소스 사용량을 제한하는 방법은 무엇입니까? 선택이 아닙니다. 내가하고 싶은 것은 기계에게

sshd컴퓨터에 RAM이 부족하여 때때로 작동이 중지 되는 dev 서버 가 있습니다. 예, 우리는 메모리가 부족하여 업그레이드가 실현 가능한 선택이 아닙니다. 내가하고 싶은 것은 기계에게 “원하는대로하라. 그러나 20MB와 약간의 CPU는 남겨 두라 sshd!” 라고 말하는 것이다 .

어떻게 할 수 있습니까?



답변

메모리 자원 제어기 와 함께 cgroup 을 사용하여 이와 같은 것을 달성 할 수 있습니다 .

모든 리소스 소비 작업을 제한된 (CPU & RAM) cgroup에 넣고 sshd“외부”로 남겨두면 제한되지 않습니다.

스왑 파일 형식으로도 스왑을 더 추가하는 것이 좋습니다.


답변

아 그러나 cgroups는 쉽다 🙂 libcgroup 패키지를 설치한다. /etc/cgconfig.conf를 만듭니다 :

mount {
    cpu     = /cgroup/cpu_and_mem;
    cpuacct = /cgroup/cpu_and_mem;
    memory  = /cgroup/cpu_and_mem;
}

group sshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

group nosshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

cgconfig계층 구조, cgroup을 작성하고 한계를 설정 하는 프로세스를 시작하십시오 . 성공하면 CPU의 50 %가 할당되고 1G의 사용 가능한 메모리가있는 두 개의 cgroup이 있습니다 (실제로 사용 가능한 메모리의 양을 모릅니다 (이 예에서는 2G라고 가정)). 이제 모든 작업 (시스템에서 실행중인 모든 프로세스)을 루트 그룹에서 nosshd cgroup으로 이동하면됩니다.

cgroup]# cat tasks >> nosshd/tasks
cgroup]# echo > tasks

그런 다음 sshd프로세스 의 PID를 가져 와서 sshd 작업 파일로 이동해야합니다.

cgroup]# echo $PID >> sshd/tasks

타다 끝났어 이제 sshd는 항상 50 %의 CPU와 1G의 메모리를 가지게됩니다.


답변

renice우선 순위를 높이 sshd거나 계정을 확인하는 데 사용합니다. (acct)-> 이것으로 사용자를위한 리소스를 설정할 수 있으므로 sshd를 s로 실행하십시오


답변

응용 프로그램 자원 사용 문제에 대한보다 일반적인 해결책은 Docker를 사용하여 컨테이너에서 응용 프로그램을 실행하는 것 입니다. 그런 다음 cgroup과 유사한 CPU 및 메모리 사용 제한으로 컨테이너 를 실행할 수 있습니다 .

docker run -c=10 -m=1g my-container