특정 프로세스에서 CPU + RAM을 절약하기 위해 리소스 사용량을 제한하는 방법은 무엇입니까?


25

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

어떻게 할 수 있습니까?


Sshd는 그렇게 터져서는 안되며, 일반적으로 매우 잘 작동하는 데몬입니다. 최신 / 최신으로 업데이트되어 있는지 확인하십시오. 무엇을하고 있습니까? 대량의 데이터를 파이핑하고 있습니까?
Marcin

2
@Marcin 나는 큰 텍스트 편집을하고 있다고 생각하지 않습니다. sshd제대로 동작 하더라도 사용할 CPU / RAM이 충분하지 않으면 중단 될 것이라고 생각하지 않습니까?
phunehehe

리눅스에 메모리가 부족하면 메모리를 회수하기 위해 프로세스를 강제 종료합니다. OOM 작동 중 (메모리 킬러 부족)이 표시 될 수 있습니다. 그래도 왜 sshd를 일관되게 죽이기로 결정했는지 모르겠습니다. sshd가 실제로 폭발하기 전에 끔찍하게 누출 (크기가 커짐)하는 것을 보셨습니까? 아니면 한 순간 잘 작동하고 다음에 죽습니까?
Marcin

@Marcin은 그가 OOM이라면 시스템이 너무 많이 쇠약 해져서 sshd가 응답 할 수없는 것입니다. 그것은 sshd 문제가 아니라 부하 문제입니다. 불행히도 나는 이것에 대한 답을 모른다.
xenoterracide 2016 년

@ phunehehe 문제가 ssh에 대한 메모리가 아니며 부하가 지붕을 통과하지 않는다고 확신합니까? sshd에 오류가 있습니까? 상자의 하중은 얼마입니까? 시스템의 메모리 부족 원인
xenoterracide

답변:


9

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

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

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


나는 여전히 망설이고, 쉽지 않은 것처럼 보입니다 (우분투에 의해 망가졌습니다).
phunehehe

아, 그것은 쉽지 않습니다 :-) 스왑을 추가하는 것이 훨씬 쉽습니다.
Mat

@ phunehehe Sys 관리자가 되신 것을 환영합니다. 쉽지 않습니다. 그러나 이제는 쉬운 일을하지 않는 방법을 배워야합니다.
xenoterracide 2016 년

6

아 그러나 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의 메모리를 가지게됩니다.


1

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


나는 ionice그것에 덧붙여서 나중에 낭독하지 않는 좋은 sshd를 시작할 것입니다.
xenoterracide

1

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

docker run -c=10 -m=1g my-container
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.