스왑 파티션이있는 표준 Linux (Debian testing) 랩톱이 있습니다.
나는 그것에 대해 많은 실험을한다. 그들 중 일부는 실제로 메모리가 배고프고 Linux가 기본적으로 동작하는 방식은 나에게 문제입니다 ... 어리석은 예를 들어 봅시다.
- 노트북 앞에 앉아
- 터미널을 엽니 다
- 을 입력
python
한 다음a = [0]*100000000
이제 큰 목록을 처리하기에 충분한 RAM이 없을 가능성이 높습니다. 리눅스는 RAM을 채운 다음 스왑을하고 몇 분 후에 OOM 킬러는 (거의) 임의의 서비스를 차단하고, 좋은 시간에 Ctrl + C를 python
누르면 터미널이 여전히 초점이 맞으면 컴퓨터가 다시 반응하게됩니다.
원치 않는 스와핑을 피하고 RAM보다 많은 메모리를 할당 할 수있는 권한을 프로세스에 거부하기 위해 메모리 제한을 적용하고 싶습니다. 메모리 요구가 특정 제한 이하이거나 루트에 의해 요청 된 경우 루트를 제외한 모든 사용자의 메모리 사용량이 많은 프로세스를 종료하십시오.
ulimit -Sv [mem]
뒤에서 들린다!
호호! "을 cgroups
통해 사용하십시오 cgexec
!" 누군가 첫 줄에 말합니다!
예, 그렇습니다. 이들은 실제로 매우 훌륭한 솔루션입니다. 그러나:
- 그들은 시스템 전체에 적용되지 않습니다
- 한계는 프로세스마다 설정됩니다
- 실제 RAM 여유 공간 (AFAIK)을 무시하고 제한이 정적 인 상태입니다.
- 여기 와 거기 , 그들이 말하는 이들은 정말 열심히 제한을 적용 할 수있는 좋은 해결책이 아니다.
커널은 " 루트가 아닌 사용자 foo에 속해 있으며 , 많은 메모리를 사용하고 있으며 메모리가 부족합니다. 죄송합니다. 친구는 지금 죽으세요!"라고 말합니다.
또는 : "도대체 뭐하는 당신은 필요 X MB를 만이 Y MB 가능 예, SWAP이 비어있는,하지만 당신은 당신이 당신의 더러운 일을하는 SWAP을 사용하지 않을 아니, 난.? "아니요. 당신을위한 기억이 없습니다! 당신이 고집하면 죽을 것입니다!"
ulimits
프로세스 당 제한이기 때문에 거의 모든 곳에서 볼 수 있듯이 나쁜 생각입니다. 나는 당신이 알고있는 포크입니다 cgroups
. 세 사람이 공유 할 "계산"서버를 소유합니다. 이러한 사용자 당 한도를 적용하면 최악의 시나리오에 의해 제한을 받습니까?
/proc/sys/vm/overcommit_memory
은 메모리 부족의 커널 동작에 영향을줍니다.