OOM 상황이 매우 제대로 처리되지 않았습니다. 스왑을 비활성화하는 것이 더 낫습니까?

OOM 상황이 매우 제대로 처리되지 않았습니다. 스왑을 비활성화하는 것이 더 낫습니까?

저는 커널 4.4.0-36과 함께 Ubuntu 16.04.1 LTS를 실행하고 있습니다. 하지만 많은 배포판/커널 버전에서 끔찍한 커널 동작을 보았기 때문에 그것이 중요하지 않다고 생각합니다.

다음 시작점을 고려하세요.

  • 내 시스템에 4GB RAM과 4GB 스왑 파티션이 있다고 가정해 보겠습니다.
  • 저는 GNOME, 브라우저, 현재 열려 있는 IDE를 사용하여 데스크톱 환경을 실행하고 있습니다.
  • 저는 프로그래밍을 하고 있는데 그 과정에서 프로그램에 무제한의 메모리를 할당하게 만드는 버그가 생겼습니다.

지금까지는 너무 좋았습니다. 이것이 제가 회복해야 할 것입니다. 그렇죠? 이 내 꺼야생각하다곧 출시 예정:

  1. 내 운영 체제는 내가 작성한 프로그램이 악의적이고 잘못 작동한다는 것을 깨달았습니다.
  2. 유용한 디버그 또는 로그 메시지와 함께 내 프로그램이 종료되었습니다.
  3. 활동을 재개할 수 있었습니다

그러나 이것은 Ubuntu의 기본 설치에서는 발생하지 않습니다. 무슨 일이 일어나는가?

  1. 결함이 있는 프로그램이 "무기한" 실행되도록 허용됨
  2. 결국 모든 물리적 메모리가 소진되면 시스템은 스와핑을 시작합니다.
  3. 문제의 프로그램이 점점 더 많은 메모리를 차지함에 따라 내 데스크톱 프로그램의 모든 페이지가 스왑으로 푸시되었습니다. 내 하드 드라이브에서 정말 무서운 소음이 나기 시작했습니다.
  4. 내 UI가 완전히 응답하지 않게 됩니다. 클릭은 발생 후 몇 분 후에 기록되며 일반적으로 마우스 움직임은 무시됩니다.
  5. 머신에 대한 모든 액세스가 효과적으로 중지됩니다. 여기에는 가상 터미널 변경, 가상 터미널을 통한 로그인, SSH를 통한 로그인이 포함됩니다.
  6. 문제가 되는 프로그램을 어떻게든 죽일 수 있다면 모든 것이 잘 되는 것은 아닙니다. 멀리.
  7. 이제 모든 사용자 인터페이스와 시스템 서비스가 교체되었으며 천천히 물리적 RAM으로 다시 교체되기 시작했습니다. 내 하드 드라이브는 이 시점에서도 여전히 미쳐가고 있습니다.
  8. 시스템이 "진정"되는 데는 약 0.5 - 1시간이 걸립니다.

재설정 버튼을 누르지 않고 기기를 다시 시작하는 데에도 시간이 오래 걸립니다. 기억이 부족하다는 단순한 일이 이렇게 치명적인 사건을 일으킬 수 있다고 누가 생각이나 했을까요?

몇 가지 질문이 있습니다.

  • 누가 데스크탑 시스템에서 스왑을 사용하는 것이 좋은 생각이라고 생각했으며 그 이유는 무엇입니까?
  • 단순히 스왑을 비활성화해야 합니까? 이렇게 하지 않는 이유는 무엇입니까?
  • 스왑을 비활성화하는 것보다 더 좋은 방법이 있습니까? 예를 들어, 악성 프로그램과의 스와핑을 제한하고 시스템 서비스와 사용자 인터페이스를 물리적 메모리에 유지하는 방법이 있습니까?

답변1

제한된 스왑, 물리적 메모리 또는 둘 다를 사용할 수 있습니다 cgroups. 보다 원시적인 접근 방식은 ulimit를 사용하는 것이었지만 이제는 cgroup이 표준이 되었습니다. (전체 cgroup 문서를 복사하여 붙여넣지는 않겠습니다.) cgroup을 사용하면 계층 구조의 각 프로그램에 대한 CPU 및 디스크 I/O 사용량 제한을 지정하여 중요한 작업에 대해 더 높은 우선 순위를 설정할 수도 있습니다.

답변2

메모리가 고갈되었을 때 디스크 사용을 방지하려면 swappiness sysctl을 조정하고 1 또는 0으로 설정해야 할 수도 있습니다.

관련 정보