RAM 사용량이 제한된 사용자를 만드는 방법은 무엇입니까?


43

따라서 4GB RAM + 4GB 스왑이 있습니다. 램 및 스왑이 제한된 사용자를 만들고 싶습니다 : 3GB RAM 및 1GB 스왑. 그런 일이 가능합니까? 별도의 사용자를 만들지 않고 (기본 데비안 / CentOS 서버 구성 만 있고 sudo를 사용하지 않는 특별한 앱을 설치하지 않고) 제한된 RAM으로 응용 프로그램을 시작하고 사용 가능한 스왑을 사용할 수 있습니까?

최신 정보:

그래서 나는 terminall을 열고 ulimit 명령을 입력했습니다 : ulimit -v 1000000그것은 976,6Mb제한 과 같습니다 . 다음으로 전화 ulimit -a해서 제한이 "온"인 것을 보았습니다. 컴파일하고 내 응용 프로그램 시작되는 다음 나는 약간의 bash는 스크립트를 시작 nohupA, 긴 하나 nohup ./cloud-updater-linux.sh >& /dev/null & ...하지만 약간의 시간 I 톱 후 :

여기에 이미지 설명을 입력하십시오

(제한이 적용되지 않으면 괜찮을 것입니다-큰 lib를 다운로드하고 컴파일하기 시작했습니다.)

그러나 쉘에 제한을 적용하고 쉘에서 시작하거나 시작한 모든 프로세스에 제한을 적용한다고 생각했습니다 ulimit -v 1000000. 내가 뭘 잘못 했어? 터미널과 터미널이 시작하는 모든 하위 프로세스를 램 사용으로 제한하는 방법은 무엇입니까?


1
각 프로세스마다 사용자에게 메모리 제한을 둘 수 없습니다. 그리고 RAM과 스왑 사용량을 구별 할 수 없습니다. 더 세밀하게 제어하려면 가상 머신에서 사용자 프로세스를 실행하십시오.
Gilles 'SO- 악마 그만해'

@Gilles는 가상 머신이 cgroup과 네임 스페이스 또는 다음의 파생물을 사용한다는 것을 확신합니다.
RapidWebs

@RapidWebs 아니 그들은하지 않습니다. 미리 정의 된 양의 RAM 만 에뮬레이트하면 게스트 OS가이를 프로세스에 할당하는 방법을 결정합니다.
Ruslan

가상 머신이 아닌 컨테이너는 cgroup을 사용하여 메모리 사용을 제한합니다. 가상 메모리를 제한하는 것은 좋은 생각이 아닙니다. 프로세스는 많은 가상 메모리를 사용할 수 있지만 약간의 RAM 만 사용할 수 있습니다. 예를 들어 내 시스템에는 34359738367 kB의 가상 메모리가 할당되어 있지만 램은 훨씬 적습니다.
ctrl-alt-delor

답변:


63

ulimit이를 위해 만들어졌습니다. ulimit사용자 또는 그룹별로 기본값을 설정할 수 있습니다 .

/etc/security/limits.conf

ulimit -v KBYTES최대 가상 메모리 크기를 설정합니다. 나는 당신이 최대량의 스왑을 줄 수 있다고 생각하지 않습니다. 사용자가 사용할 수있는 가상 메모리의 양에 제한이 있습니다.

그래서 당신 limits.conf은 (최대 4G메모리까지) 줄을 가질 것입니다

luser  hard  as   4000000

업데이트-C 그룹

한계에 의해 부과 ulimitlimits.conf프로세스 당입니다. 나는 그 시점에서 분명하지 않았다.

사용자가 사용하는 총 메모리 양을 제한하려는 경우 요청한 것입니다. cgroups 를 사용하려고합니다 .

에서 /etc/cgconfig.conf:

group memlimit {
    memory {
        memory.limit_in_bytes = 4294967296;
    }
}

이것은 생성 cgroup4GiB의 최대 메모리 제한이 것을.

에서 /etc/cgrules.conf:

luser   memory   memlimit/

이로 인해 모든 프로세스가 에서 작성된 cgroup luser내에서 실행 memlimit됩니다 cgconfig.conf.


그런 것은 설정할 수 useradd있습니까?
myWallJSON

4
@myWallJSON 직접은 아니지만 limits.conf에 즉시 추가하거나 limits.conf에서 특정 제한을 가진 그룹을 설정하고 해당 그룹에 사용자를 추가 할 수 있습니다.
utopiabound

1
대단해! 당신이 할 수있는 줄 몰랐어요! 위대한 답변 +1
Yanick Girouard

1
@utopiabound : ulimit를 사용하려고하는 일부 데이터로 Q를 업데이트했습니다.
myWallJSON

1
@ f.ardelian 커널을 업그레이드하십시오. 그 방법에 대한 기사 가 있습니다!
Daniel C. Sobral

4

사용자 수준에서는 메모리 사용량을 제한 할 수 없으며, ulimit는 단일 프로세스에 대해서만 가능합니다.

에서 사용자 당 제한을 사용하더라도 /etc/security/limits.conf여러 프로세스를 실행하여 모든 메모리를 사용할 수 있습니다.

자원을 제한하려면 Solaris의 프로젝트 및 영역에서 사용하는 rcapd 와 같은 자원 관리 도구를 사용해야합니다 .

Linux에서 조사 할 수있는 비슷한 기능을 제공하는 것 같습니다 : cgroups .


글쎄, 나는 모든 프로세스가 해당 쉘에서 상속하기 때문에 사용자 로그인 쉘 또는 이와 비슷한 것을 "사용자 제한 설정"으로 해석 할 수 있다고 생각합니까?
amn

1
@amn하지 않습니다. 사용자는 이러한 제한을 해결하기 위해 단순히 새로운 로그인 쉘을 열 수 있습니다.
jlliagre

그렇습니다, 그것은 나의 가정을 무효화합니다.
amn

3

cgroups다른 답변에서 지적 했듯이이 작업을 수행하는 올바른 방법입니다. 불행히도 우리가 아래에 설명 할 것처럼 문제에 대한 완벽한 해결책은 없습니다. cgroup 메모리 사용 제한을 설정하는 방법에는 여러 가지가 있습니다. cgroup의 일부로 사용자의 로그인 세션을 자동으로 만드는 방법은 시스템마다 다릅니다. Red Hat 에는 몇 가지 도구가 있으며 systemd도 있습니다.

memory.memsw.limit_in_bytes그리고 memory.limit_in_bytes세트 제한을 포함하여 각각 스왑을 포함하지 않음. 단점 memory.limit_in_bytes은 그룹의 할당량에 대해 cgroup의 프로세스 대신 커널이 캐시 한 파일을 계산한다는 것입니다. 캐싱이 적 으면 디스크 액세스가 많아 지므로 시스템에 사용 가능한 메모리가있는 경우 성능이 약간 저하 될 수 있습니다.

반면에 memory.soft_limit_in_bytescgroup은 인용 부호를 넘지 않지만 커널 OOM 킬러가 호출되면 할당량을 초과하는 cgroup은 논리적으로 먼저 종료됩니다. 그러나 단점은 일부 메모리가 즉시 필요하고 OOM 킬러가 죽일 프로세스를 찾을 시간이 없다는 것입니다. 죽었다.

ulimit그러나 이것은 절대적으로 잘못된 도구입니다. ulimit는 가상 메모리 사용량을 제한합니다. 많은 실제 응용 프로그램은 실제 메모리보다 훨씬 더 많은 가상 메모리를 사용합니다. 대부분의 가비지 수집 런타임 (Java, Go)은 조각화를 피하기 위해이 방식으로 작동합니다. C의 간단한 "hello world"프로그램은 주소 살균기로 컴파일 된 경우 20TB의 가상 메모리를 사용할 수 있습니다. jemalloc ( Russ 의 기본 할당 자) 또는 tcmallocsbrk 과 같은 에 의존하지 않는 할당 자또한 실제 사용량을 초과하는 가상 메모리 사용량을 갖습니다. 효율성을 높이기 위해 많은 도구가 파일을 mmap하여 가상 사용량을 늘리지 만 반드시 물리적 사용량은 아닙니다. 모든 Chrome 프로세스는 각각 2TB의 가상 메모리를 사용하고 있습니다. 8GB의 실제 메모리가 장착 된 랩톱에 있습니다. 가상 메모리 할당량을 설정하려고 시도하는 방법은 Chrome을 중단 시키거나 많은 양의 가상 메모리 할당에 의존하지만 사용하지 않는 일부 보안 기능을 사용하지 못하게하거나 사용자가 시스템을 악용하는 것을 완전히 비 효과적으로 만들 수 있습니다. .

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