메모리 부족시 시스템 정지


34

eeePC 900a가 있습니다. 디스크로 8GB 플래시와 1GB RAM 만 있습니다. 여기에 설치된 Linux 배포판은 ArchLinux입니다.

시스템에 메모리가 부족하면 응답 속도 가 매우 떨어집니다. TTY1로 전환하거나 마우스 포인터를 움직이는 것과 같은 작업을 수행하는 데 몇 초 / 분이 걸립니다. 때로는 시스템이 멈추는 것처럼 보일 수도 있습니다. 우리가 전에 3 개만 내버려 두었으므로 지금까지 아무것도 바뀌지 않았습니다.

디스크가 이미 작기 때문에이 eeePC에서 스왑 파티션 / 파일을 만드는 것을 피하고 싶습니다. 또한 스왑 공간에 많은 쓰기 작업을 수행하면 플래시 카드 수명이 크게 단축되기 때문입니다. 또한 스왑 파일 / 파티션은 문제를 확실히 해결하는 대신 문제를 옮길 것이라고 생각합니다.

커널에 메모리가 부족할 때 임의의 응용 프로그램을 강제 종료하지 않습니까? 그렇게하지 못하는 이유는 무엇입니까?

몇 달 / 몇 년 전에 나는 이미 이것에 대해 더 자세히 보려고했지만 실제로 작동하는 것을 찾을 수 없었습니다 ...


1
설정에서 어떤 DE / WM을 사용하고 있으며 어떤 서비스 / 데몬을 실행하고 있습니까? 예를 들어 풀플 렉싱 된 데스크톱 환경을 사용하고 Chromium 또는 Firefox를 사용하여 브라우징을하려면 RAM이 필요합니다. 1GB의 RAM은 아치 리눅스 자체를 실행하기에 충분해야하지만 실제로 중요한 것은 그 위에 놓인 것입니다.

1
LXDE를 사용하고 있습니다. Chromium은 일반적으로 대부분의 RAM을 사용하는 프로그램입니다. 어쨌든 이것은 요점이 아닙니다. 내 시스템이 얼마나 많은 메모리를 사용하는지 신경 써야하는 것은 나 자신이 아니라, 그 때문에 죽지 않아야하는 내 시스템이다. 내 시스템의 메모리 부족을 실행하는 경우, 내가 그냥 원하는,이 원하는 모든 응용 프로그램을 죽일 무료 동결하지 !
peoro

5
필자는 이와 같은 스크립트 (의사 코드)를 실행하는 것에 대해 진지하게 생각하고 while(true){ if( $FREE_MEMORY<10MB ){ kill -9 $RANDOM_PID; } }있습니다. 이것은 분명히 내 문제를 해결할 것입니다. 그러나 잠깐, 커널이 그렇게하지 않아야합니까 (그리고 내 스크립트보다 훨씬 나은 방법으로)? 왜 작동하지 않습니까?
peoro

2
@Marcin, 문제를 해결할 것만으로는 해결되지 않습니다. 4GB의 메모리 (스왑으로 인해)가 있어도 시스템 메모리가 부족할 수 있습니다 (정지 된 상태). 내가 피하고 싶은 것은 RAM이 부족할 때 시스템이 멈추는 것입니다. 내 RAM이 끝나 자마자 커널이 갑자기 크롬을 죽이면 1GB라도 만족할 것입니다.
peoro

4
@Lee "magic sysrq"는 커널로 직접가는 핵심 조합입니다. 키보드와 마우스가 응답하지 않는 경우에도 종종 작동합니다. 참조 en.wikipedia.org/wiki/Magic_SysRq_key
라만

답변:


14

키보드 조합으로 OOM-killer (메모리 킬러 부족)를 직접 호출 할 수 있습니다.

SysRq-F

SysRq 키는 일반적으로 키보드의 PrtSc 키 내에 결합됩니다.

OOM-killer는 일부 프로세스 (-es)를 종료하고 시스템이 다시 응답합니다.

위의 의견 에서이 기능에 대한 조언은 Thx Raman을 참조하십시오.

추신 : 이것은 많은 도움이되었습니다. Chrome 또는 기타 메모리 욕심 많은 소프트웨어로 인해 발생한 문제에 대해 가장 유용한 조언이라는 의견에 동의합니다. 그러나 OOM-killer는 중요한 프로세스를 죽일 수 있으므로주의해서 사용해야합니다.


2
열쇠가 PrtScn|SysRq있습니다. 그러나을 누르면 SysRq - F스크린 샷 만받습니다
Lee

2
기본적으로 위의 의견을 취하여 답변을했기 때문에 작은 기여는 좋을 것입니다. 어쨌든 당신을 찬성했습니다. :-)
Raman

3
@Lee 활성화해야합니다. 일부 배포판에는 기본적으로 마법 sysrq가 활성화되어 있지 않습니다. 도움이 될 것입니다. google.ca/search?q=sysrq+enable
Raman

2
@Raman 99 %는 내 컴퓨터가 이미 정지되어 있기 때문에 기본적으로 "활성화"할 수 없다고 생각합니다. 왜 기본적으로 활성화되어 있지 않습니까?
themihai

3
@themihai 많은 사람들이 보안 위험을 고려하기 때문에-잠금 화면 등과 같은 응용 프로그램 상태에 관계없이 입력 장치에 대한 물리적 액세스를 통해 커널에 직접 액세스 할 수 있습니다.
Raman

11

자연스러운 상태는 응용 프로그램 데이터가 RAM에 있고 파일이 디스크에 있다는 것입니다.
성능 측면에서 볼 때 이상적인 상태는 자주 사용하는 데이터가 RAM에 있고 현재 필요하지 않은 데이터는 디스크에 있다는 것입니다.
일반적인 시스템에서 커널은이 이상에 도달하기 위해 두 가지를 수행합니다.

  • 한동안 사용되지 않은 응용 프로그램 데이터는 디스크로 이동할 수 있습니다. 이것은 스왑입니다.
  • 최근에 사용한 파일의 데이터는 RAM에 보관됩니다. 디스크 캐시 (디스크에서 읽은 데이터의 경우)와 디스크 버퍼 (디스크에 쓰려고하는 데이터의 경우)입니다.

일반적인 시스템에서는 RAM의 상당 부분이 캐시와 버퍼에 사용됩니다 (50 %는 일반적인 수치). RAM은 유한 한 리소스이므로 일부 응용 프로그램 데이터를 바꾸려면 교체해야합니다 (램을 사용하는 더 좋은 방법이있는 경우에만 교체 필요).

스왑이없는 시스템에서는 응용 프로그램 데이터가 거의 모든 RAM을 사용하는 시점이 있으므로 캐시를위한 공간이 거의 없습니다. 그러면 시스템이 느려질 수 있습니다. 커널은 실제로 필요할 때까지 애플리케이션 종료를 시작하지 않습니다. 응용 프로그램이 사용 가능한 메모리의 99 % 만 채우는 한 시스템은 계속 진행되지만 파일 데이터는 항상 디스크에서로드 및 다시로드되어야하기 때문에 매우 느립니다. 동일한 응용 프로그램을 실행하면 해당 시점에서 스왑을 통해 시스템 속도가 빨라집니다.

이 문제에 대한 자세한 내용은 이 lkml 토론이 블로그 게시물을 참조하십시오 .

커널에게 디스크 캐시를 위해 최소량의 RAM을 예약하도록 지시하는 직접적인 방법을 모르겠습니다. 당신은 할 수 스왑 공간으로 당신의 RAM의 작은 부분 설정 어쩌면, 압축을 . 있습니다 그 전면에 성공 보고서는 내가 특정 경우에 보장을하지 않습니다하지만.


1
설명과 링크 덕분에 그들은 스왑에 대한 의심을 없애는 데 도움이되었습니다. 내 질문에 대한 @Marcin의 대답에 따라 RAM에 256MB의 압축 가상 스왑 (compcache)을 설정했습니다. 그러나 이것은 내 질문에 완전히 대답하지는 않습니다. 전체 RAM을 응용 프로그램에서만 사용하고 아무것도 캐시하지 않으면 시스템이 느려질 것입니다. 여전히 RAM이 부족할 때이 시스템이 몇 분 / 시간 동안 (아마도 영원히) 멈추는 이유를 이해할 수 없습니다. 3 시간이 TTY1로 전환하기에 충분하지 않으면 메모리가 부족할 때 커널이 응용 프로그램을 종료하는 데 실패하고 있다고 생각합니다.
peoro

32GB의 실제 메모리로 스왑을 비활성화했으며 나쁜 소프트웨어가 메모리 할당 (hello ld, 쓰레기 조각)으로 도망 갈 때 거의 1 분 동안 정지하여 놀랍도록 게으른 마우스를 잠시 움직일 수 있습니다. 몇 초마다 2 개씩 리눅스의 OOM 처리는 완전하지 않습니다. 운이 좋으면 OOM 킬러는 데스크탑 환경을 완전히 망치지 않고 올바른 프로세스를 종료합니다. 그리고 저는 Linux의 열렬한 팬입니다. 페이징을 사용하면 훨씬 더 나쁩니다. 리눅스 페이징은 농담입니다.
doug65536

6

이것은 2007 년 이후로 알려진 버그 입니다. 높은 메모리 사용시 시스템 정지를 참조하십시오 .

이 상황에서 Windows는 하나 이상의 응용 프로그램을 닫으라는 경고 대화 상자를 표시합니다.


2
우분투에서 "할당되지 않은"것 같습니다. 아마도 DE가 사용자에게 경고하거나 메모리 집약적 인 응용 프로그램을 동결해야합니까?
nkkollaw

1
@ nbrogi-조용히 얼어 붙는 것. 그러나 우분투에게 설득력있는 행운을 빕니다.
Dan Dascalescu 12

6

최근에 내 문제에 대한 해결책을 찾았습니다.

Linux OOM 킬러는 제대로 작업을 수행 할 수 없으므로 사용자 공간 OOM Killer : earlyoom을 사용하기 시작했습니다 . 그것은 C로 작성되었으며 상당히 구성 가능하며 나에게 매력처럼 작동합니다.

나는 또한 페이스 북의 OOMD 와 같은 서버에서 실행되도록 개발 된 대안에 대해 들었지만 이 시도는하지 않았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.