프로세스의 메모리 소비에 일종의 소프트 제한을 적용 할 수 있습니까?


10

한 가지 프로세스가 방대한 양의 메모리를 할당합니다 (메모리 누수 버그 때문일 수는 없습니다. 입력 파일을 처리 할 수 ​​없기 때문에). RAM이 가득 차고 어느 시점에서 Linux는 스왑으로 전환해야합니다. 글쎄, 때로는 이것이 최후의 수단 일 것입니다. 비싼 계산이 있다면, 결국 RAM이 부족 해지면 데이터를 잃고 싶지 않습니다.

그러나 (제 경험상) 메모리 소비는 불량하고 아마도 버그가 많은 프로세스에 의해 제한되지 않습니다. 즉, 스왑을 위해 덜 긴급하게 필요한 데이터 로 끝나는 것이 아니라 OS가 대량의 데이터를 패닉 적으로 스왑해야합니다. 불행히도 문제가되는 프로세스를 심하게 깨뜨릴뿐만 아니라 전체 시스템을 거의 정지시킬 수 있습니다 (SSD가있는 머신에서는 더 이상 나쁘지 않지만 OTOH는 기가 바이트 및 기가 바이트의 가비지 데이터를 쓸 수 있는지 걱정합니다. 장기적으로 플래시 셀에 해를 끼칩니다).
문제를 발견하고 수동으로 프로세스를 종료 할 때까지 (가상 터미널에 로그인 할 때까지 실제로 몇 분이 걸렸습니다!), 실행중인 세션의 절반이 스왑되어 시스템이 원활하게 실행될 때까지 꽤 기다려야합니다. 다시.

문제에 대한 하나의 드라 코닉 해결책이 있습니다 : 하드 메모리 제한을 시행하십시오. 하지만이 일을 시스템 전체 때로는 오히려 여전히 필요 프로세스를 죽일 것입니다, 내가 수동으로해야하는 경우 ulimit위반하는 프로세스를 시작하기 전에 너무 늦기까지 ... 음, 나는 종종 잊어 것이다.

내가 더 행복 할 수있는 가능한 종류의 솔루션 :

  • 프로세스가 특정 메모리 사용량을 초과하면 인위적으로 스로틀되어 나머지 시스템이 응답 상태를 유지합니다.
  • 프로세스가 특정 메모리 사용량을 초과하면 SIGSTOPped가 종료되므로 다음에 수행 할 작업을 알아볼 시간이 있습니다.
  • 프로세스가 RAM 한계에 도달 하면 큰 스와핑이 시작 되기 전에 경고가 표시 됩니다.

그러한 행동이나 그와 유사한 것을 얻는 방법이 있습니까?


2
cgroup을 사용하여 프로세스 또는 프로세스 그룹에서 사용하는 RAM의 양을 제한 할 수 있습니다. stackoverflow.com/questions/3043709/…
Mark Plotnick

2
이것은 말 그대로 정확한 종류의 것 ulimit입니다.
DopeGhoti

1
Ulimit -m은 2.4.30 이후 Linux에서 작동하지 않았으며 그 이전의 특정 상황에서만 작동한다는 점을 제외하고는 사용할 것입니다. unix.stackexchange.com/questions/129587/…
Mark Plotnick

niceload-당신의 prs를 noswap
올레 Tange

답변:


6

niceload --noswap yourprg 는 바로 그 상황을 위해 만들어졌습니다.

  • 교체하는 경우 : 프로세스 실행
  • 교체하는 경우 : 프로세스 실행
  • 스왑 인 / 아웃 : 스와핑이 중지 될 때까지 프로세스를 일시 중단하고 스왑이 중지되면 프로세스를 다시 시작하십시오.

스와핑이 시작되기 전에 프로세스가 일시 중단되지 않지만 작동하기 전에 1 초 동안 스와핑이 실행되도록합니다.

niceload --mem 1G yourprg비슷한 작동 : 1GB 미만의 여유 공간이 있으면 youprg가 일시 중단됩니다. 1GB 이상의 여유 공간이 확보되면 prg가 재개됩니다.


0

예. 실제로 모든 현대 쉘로 쉽게 수행 할 수 있습니다.

sh -c 'ulimit -S -m "$1"
       shift; exec your_command "$@"
' -- some_size args

-l잠긴 메모리 제한에 대한 옵션을 사용할 수 있습니다 . 한도를 초과하면 프로세스에 신호가 전달됩니다.


-1

캐시를 지우는 Cronjob : Linux에서 메모리 캐시를 지우는 방법

실제로 비슷한 문제가 있습니다. 나는 자신의 사용자 정의 스크립트를 실행하고 때때로 스크립트가 사용 가능한 모든 메모리를 소비하고 redhat 서버를 다운시키는 많은 사용자가 있습니다. RAM을 대량으로 소비하는 이유는 스크립트가 이벤트를 기다리는 동안 며칠 동안 실행될 수 있기 때문에 실제로 사용하지 않을 때 리소스를 낭비하기 때문입니다. 그래서 내가 한 일은 단순히 cronjob으로 캐시를 강제로 지우는 것이므로 문제가 없었습니다.

간단하고 게으른.


흠. 흥미로운 제안이지만, 나는 그것이 겪고있는 대부분의 문제에 대해 아무것도하지 않습니다. 내 주요 문제는 많은 프로세스를 신속하게 할당 할 수있는 단일 프로세스 (과학 응용 프로그램)입니다.
leftaroundabout

캐시를 지우면 일반적으로 성능 문제가 발생합니다. 때로는 성능 문제를 해결하기도합니다. 그러나 메모리가 없으면 메모리를 사용할 수 없게됩니다.
Gilles 'SO- 악마 그만해
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.