
그래서 4GB RAM + 4GB 스왑이 있습니다. RAM과 스왑이 제한된 사용자(3GB RAM 및 1GB 스왑)를 만들고 싶습니다. 그런 일이 가능합니까? 제한된 RAM으로 애플리케이션을 시작하고 별도의 사용자를 만들지 않고(특수 앱을 설치하지 않고 기본 Debian/CentOS 서버 구성만 갖고 sudo를 사용하지 않고) 사용 가능한 애플리케이션을 교체할 수 있습니까?
업데이트:
그래서 터미널을 열고 입력했습니다.한도명령: ulimit -v 1000000
이는 제한사항과 같습니다 976,6Mb
. 다음으로 전화해서 ulimit -a
제한이 "설정"되어 있음을 확인했습니다. 그런 다음 에서 내 앱을 컴파일하고 시작하는 bash 스크립트를 시작했습니다 nohup
.긴 것 nohup ./cloud-updater-linux.sh >& /dev/null &
... 하지만 얼마 후 나는 다음을 보았습니다.
(제한이 적용되지 않으면 괜찮을 것입니다. 일부 큰 lib를 다운로드하고 컴파일하기 시작했습니다.)
하지만 나는 셸과 ulimit -v 1000000
? 를 사용하여 실행되는 모든 프로세스에 제한을 적용했다고 생각했습니다. 내가 뭘 잘못했나요? 터미널과 그것이 시작하는 모든 하위 프로세스를 RAM 사용량으로 제한하는 방법은 무엇입니까?
답변1
ulimit
이를 위해 만들어졌습니다. ulimit
다음에서 사용자별 또는 그룹별로 기본값을 설정할 수 있습니다 .
/etc/security/limits.conf
ulimit -v KBYTES
최대 가상 메모리 크기를 설정합니다. 나는 당신이 최대량의 스왑을 줄 수 있다고 생각하지 않습니다. 사용자가 사용할 수 있는 가상 메모리 양에 대한 제한일 뿐입니다.
그래서 당신은 limits.conf
(최대 4G
메모리까지) 라인을 갖게 될 것입니다
luser hard as 4000000
업데이트 - CGroups
프로세스별로 부과되는 제한 은 다음 ulimit
과 limits.conf
같습니다. 나는 그 점에 대해 확실히 명확하지 않았습니다.
사용자가 사용하는 총 메모리 양을 제한하려는 경우(귀하가 요청한 것) 사용하고 싶으신가요?cgroup.
안에 /etc/cgconfig.conf
:
group memlimit {
memory {
memory.limit_in_bytes = 4294967296;
}
}
그러면 cgroup
최대 메모리 제한이 4GiB인 가 생성됩니다.
안에 /etc/cgrules.conf
:
luser memory memlimit/
이렇게 하면 에서 실행되는 모든 프로세스가 에서 생성된 cgroup luser
내에서 실행됩니다 .memlimit
cgconfig.conf
답변2
cgroups
다른 답변에서 지적했듯이 이 작업을 수행하는 올바른 방법입니다. 불행하게도 문제에 대한 완벽한 해결책은 없습니다. 아래에서 자세히 설명하겠습니다. cgroup 메모리 사용량 제한을 설정하는 방법에는 여러 가지가 있습니다. 사용자의 로그인 세션을 자동으로 cgroup의 일부로 만드는 방법은 시스템마다 다릅니다. 빨간 모자몇 가지 도구가 있고 도구도 마찬가지입니다.체계화된.
memory.memsw.limit_in_bytes
스왑을 포함하거나 포함하지 않는 제한을 각각 설정 합니다 memory.limit_in_bytes
. 단점은 memory.limit_in_bytes
그룹 할당량에 대해 cgroup의 프로세스를 대신하여 커널이 캐시한 파일을 계산한다는 것입니다. 캐싱이 적다는 것은 더 많은 디스크 액세스를 의미하므로 시스템에 사용 가능한 메모리가 있는 경우 성능이 일부 포기될 가능성이 있습니다.
반면에 memory.soft_limit_in_bytes
cgroup이 할당량을 초과하도록 허용하지만 커널 OOM 킬러가 호출되면 논리적으로 할당량을 초과한 cgroup이 먼저 종료됩니다. 그러나 단점은 일부 메모리가 즉시 필요하고 OOM 킬러가 종료할 프로세스를 둘러볼 시간이 없다는 것입니다. 이 경우 할당량을 초과한 사용자의 프로세스가 종료되기 전에 무언가 실패할 수 있습니다. 죽었습니다.
ulimit
그러나 이는 이에 대한 절대적으로 잘못된 도구입니다. ulimit는 가상 메모리 사용량에 제한을 두는데, 이는 확실히 원하는 바가 아닙니다. 많은 실제 응용 프로그램은 실제 메모리보다 훨씬 더 많은 가상 메모리를 사용합니다. 대부분의 가비지 수집 런타임(Java, Go)은 조각화를 방지하기 위해 이러한 방식으로 작동합니다. C로 작성된 간단한 "hello world" 프로그램을 주소 새니타이저로 컴파일하면 20TB의 가상 메모리를 사용할 수 있습니다. sbrk
다음과 같이 에 의존하지 않는 할당자제말록(Rust의 기본 할당자) 또는tcmalloc, 또한 실제 사용량보다 가상 메모리 사용량이 훨씬 더 많습니다. 효율성을 위해 많은 도구는 파일을 mmap하여 가상 사용량을 늘리지만 물리적 사용량은 반드시 늘리지는 않습니다. 내 모든 Chrome 프로세스는 각각 2TB의 가상 메모리를 사용하고 있습니다. 저는 물리적 메모리가 8GB인 노트북을 사용하고 있습니다. 여기서 가상 메모리 할당량을 설정하려고 시도하면 Chrome이 중단되거나 Chrome이 대량의 가상 메모리 할당(사용하지 않음)에 의존하는 일부 보안 기능을 비활성화하거나 사용자가 시스템을 남용하는 것을 방지하는 데 전혀 효과가 없게 됩니다. .
답변3
답변4
systemd가 있는 시스템(예: 내가 사용 중인 Ubuntu 22.04)에서 CPU/메모리를 제한하는 가장 간단한 방법은 cgroups systemd 구성 파일을 사용하는 것입니다(예: 4GB RAM 및 2개 스레드로 제한).
nano /etc/systemd/system/user-.slice.d/50-memory.conf
그리고 해당 파일에 다음을 작성하십시오.
[Slice]
MemoryMax=4G
CPUQuota=200%
(다음을 실행 systemctl daemon-reload
하여 적용)
이는 모든 사용자에게 적용되지만 다음에서 개별 사용자를 재정의할 수 있습니다./etc/systemd/system/user-[uid].slice.d/50-memory.conf
(conf 파일의 이름은 중요하지 않다고 생각하지만 확실하지 않습니다)