나는 이것이 드문 문제라고 생각하지 않습니다. 프로세스가 많은 양의 메모리를 할당합니다(아마도 실행 불가능할 정도로 큰 입력 파일을 처리하려고 하기 때문에 메모리 누수 오류로 인해 또는 다른 이유로 인해). RAM이 가득 차서 어느 시점에서 Linux는 스왑으로 전환해야 합니다. 글쎄, 때때로 이것은 단지 최후의 수단일 뿐입니다. 값비싼 계산을 수행하는 경우 마침내 RAM이 부족할 때 데이터를 잃고 싶지 않습니다.
그러나 (내 경험상) 불량 프로세스, 결함이 있는 프로세스로 인해 메모리 소비가 무제한인 경우가 더 많습니다. 즉, 나는 결국덜 긴급한 데이터스왑으로 옮겼으나 운영 체제가 긴급하게 대량의 데이터를 스왑해야 했습니다. 불행하게도 이는 문제의 프로세스를 심각하게 방해할 뿐만 아니라 전체 시스템을 거의 정지 상태로 만들 수 있습니다(SSD가 있는 시스템에서는 더 이상 나쁘지 않지만 OTOH에서는 기가바이트 단위의 섹션 및 섹션 작성에 대해 걱정하게 됩니다). 기가바이트의 정크 데이터로 인해 시스템 충돌이 발생할 수 있음) 플래시 배터리가 장기적으로 손상될 수 있습니다.
문제를 발견하고 프로세스를 수동으로 종료할 때까지(한 번은 실제로 가상 터미널에 로그인하는 데 몇 분이 걸렸습니다!) 실행 중인 세션의 절반이 스왑에 있었고 시스템이 원활하게 실행될 때까지 오랜 시간을 기다려야 했습니다. 다시.
이 문제에는 과감한 해결책이 있습니다. 즉, 하드 메모리 제한을 적용하는 것입니다. 하지만 시스템 전체에서 이 작업을 수행하면 여전히 필요한 프로세스가 종료되는 경우가 있으며, ulimit
시작하기 전에 문제가 되는 프로세스를 수동으로 종료해야 하는 경우... 밤이 너무 늦어질 때까지 잊어버리는 경우가 많습니다.
내가 더 만족할 수 있는 솔루션 유형은 다음과 같습니다.
- 프로세스가 특정 메모리 사용량을 초과하면 나머지 시스템이 계속 응답할 수 있도록 인위적으로 조절됩니다.
- 프로세스가 특정 메모리 사용량을 초과하면
SIGSTOP
ped가 발생하여 다음에 수행할 작업을 파악할 시간이 제공됩니다. - 프로세스가 RAM 한도에 도달하면 경고가 표시됩니다.앞으로위대한 교류가 시작됩니다.
이 동작이나 유사한 동작을 얻을 수 있는 방법이 있습니까?
답변1
Niceload --noswap yourprg이는 바로 이런 종류의 상황을 위해 설계되었습니다. 교환 활동을 살펴봅니다.
- 교체된 경우: 프로세스를 실행합니다.
- 스왑인 경우: 프로세스를 실행하게 합니다.
- 스왑 인 및 스왑 아웃하는 경우: 스왑이 중지될 때까지 프로세스를 일시 중지하고 스왑이 중지되면 프로세스를 재개합니다.
스왑이 시작되기 전에 프로세스를 일시 중지하는 대신, 계속 진행하기 전에 스왑이 1초 동안 실행되도록 합니다.
niceload --mem 1G yourprg
비슷하게 작동합니다. 사용 가능한 공간이 1GB 미만인 경우 PRG가 일시 중지됩니다. 1GB 이상이 사용 가능해지면 프로그램이 재개됩니다.
답변2
예. 이는 거의 모든 최신 쉘을 사용하여 쉽게 수행할 수 있습니다.
sh -c 'ulimit -S -m "$1"
shift; exec your_command "$@"
' -- some_size args
-l
잠금 메모리 제한 옵션을 사용할 수 있습니다 . 한도를 초과하면 프로세스가 신호를 받게 됩니다.
답변3
캐시를 지우는 Cronjob:Linux에서 메모리 캐시를 지우는 방법
실제로 비슷한 문제가 있습니다. 때때로 사용 가능한 모든 메모리를 소비하고 Redhat 서버를 충돌시키는 자체 사용자 정의 스크립트를 실행하는 사용자 그룹이 있습니다. RAM을 많이 소비하는 이유는 스크립트가 이벤트를 기다리면서 며칠 동안 실행될 수 있기 때문에 실제로 사용되는 리소스가 없을 때 리소스를 묶어두기 때문입니다. 그래서 제가 한 일은 단순히 cronjob을 사용하여 캐시를 강제로 지우는 것뿐이었고 그 이후에는 아무런 문제도 없었습니다.
단순하고 게으르다.