한 가지 프로세스가 방대한 양의 메모리를 할당합니다 (메모리 누수 버그 때문일 수는 없습니다. 입력 파일을 처리 할 수 없기 때문에). RAM이 가득 차고 어느 시점에서 Linux는 스왑으로 전환해야합니다. 글쎄, 때로는 이것이 최후의 수단 일 것입니다. 비싼 계산이 있다면, 결국 RAM이 부족 해지면 데이터를 잃고 싶지 않습니다.
그러나 (제 경험상) 메모리 소비는 불량하고 아마도 버그가 많은 프로세스에 의해 제한되지 않습니다. 즉, 스왑을 위해 덜 긴급하게 필요한 데이터 로 끝나는 것이 아니라 OS가 대량의 데이터를 패닉 적으로 스왑해야합니다. 불행히도 문제가되는 프로세스를 심하게 깨뜨릴뿐만 아니라 전체 시스템을 거의 정지시킬 수 있습니다 (SSD가있는 머신에서는 더 이상 나쁘지 않지만 OTOH는 기가 바이트 및 기가 바이트의 가비지 데이터를 쓸 수 있는지 걱정합니다. 장기적으로 플래시 셀에 해를 끼칩니다).
문제를 발견하고 수동으로 프로세스를 종료 할 때까지 (가상 터미널에 로그인 할 때까지 실제로 몇 분이 걸렸습니다!), 실행중인 세션의 절반이 스왑되어 시스템이 원활하게 실행될 때까지 꽤 기다려야합니다. 다시.
문제에 대한 하나의 드라 코닉 해결책이 있습니다 : 하드 메모리 제한을 시행하십시오. 하지만이 일을 시스템 전체 때로는 오히려 여전히 필요 프로세스를 죽일 것입니다, 내가 수동으로해야하는 경우 ulimit위반하는 프로세스를 시작하기 전에 너무 늦기까지 ... 음, 나는 종종 잊어 것이다.
내가 더 행복 할 수있는 가능한 종류의 솔루션 :
- 프로세스가 특정 메모리 사용량을 초과하면 인위적으로 스로틀되어 나머지 시스템이 응답 상태를 유지합니다.
- 프로세스가 특정 메모리 사용량을 초과하면
SIGSTOPped가 종료되므로 다음에 수행 할 작업을 알아볼 시간이 있습니다. - 프로세스가 RAM 한계에 도달 하면 큰 스와핑이 시작 되기 전에 경고가 표시 됩니다.
그러한 행동이나 그와 유사한 것을 얻는 방법이 있습니까?
ulimit입니다.