저는 커널 4.4.0-36과 함께 Ubuntu 16.04.1 LTS를 실행하고 있습니다. 하지만 많은 배포판/커널 버전에서 끔찍한 커널 동작을 보았기 때문에 그것이 중요하지 않다고 생각합니다.
다음 시작점을 고려하세요.
- 내 시스템에 4GB RAM과 4GB 스왑 파티션이 있다고 가정해 보겠습니다.
- 저는 GNOME, 브라우저, 현재 열려 있는 IDE를 사용하여 데스크톱 환경을 실행하고 있습니다.
- 저는 프로그래밍을 하고 있는데 그 과정에서 프로그램에 무제한의 메모리를 할당하게 만드는 버그가 생겼습니다.
지금까지는 너무 좋았습니다. 이것이 제가 회복해야 할 것입니다. 그렇죠? 이 내 꺼야생각하다곧 출시 예정:
- 내 운영 체제는 내가 작성한 프로그램이 악의적이고 잘못 작동한다는 것을 깨달았습니다.
- 유용한 디버그 또는 로그 메시지와 함께 내 프로그램이 종료되었습니다.
- 활동을 재개할 수 있었습니다
그러나 이것은 Ubuntu의 기본 설치에서는 발생하지 않습니다. 무슨 일이 일어나는가?
- 결함이 있는 프로그램이 "무기한" 실행되도록 허용됨
- 결국 모든 물리적 메모리가 소진되면 시스템은 스와핑을 시작합니다.
- 문제의 프로그램이 점점 더 많은 메모리를 차지함에 따라 내 데스크톱 프로그램의 모든 페이지가 스왑으로 푸시되었습니다. 내 하드 드라이브에서 정말 무서운 소음이 나기 시작했습니다.
- 내 UI가 완전히 응답하지 않게 됩니다. 클릭은 발생 후 몇 분 후에 기록되며 일반적으로 마우스 움직임은 무시됩니다.
- 머신에 대한 모든 액세스가 효과적으로 중지됩니다. 여기에는 가상 터미널 변경, 가상 터미널을 통한 로그인, SSH를 통한 로그인이 포함됩니다.
- 문제가 되는 프로그램을 어떻게든 죽일 수 있다면 모든 것이 잘 되는 것은 아닙니다. 멀리.
- 이제 모든 사용자 인터페이스와 시스템 서비스가 교체되었으며 천천히 물리적 RAM으로 다시 교체되기 시작했습니다. 내 하드 드라이브는 이 시점에서도 여전히 미쳐가고 있습니다.
- 시스템이 "진정"되는 데는 약 0.5 - 1시간이 걸립니다.
재설정 버튼을 누르지 않고 기기를 다시 시작하는 데에도 시간이 오래 걸립니다. 기억이 부족하다는 단순한 일이 이렇게 치명적인 사건을 일으킬 수 있다고 누가 생각이나 했을까요?
몇 가지 질문이 있습니다.
- 누가 데스크탑 시스템에서 스왑을 사용하는 것이 좋은 생각이라고 생각했으며 그 이유는 무엇입니까?
- 단순히 스왑을 비활성화해야 합니까? 이렇게 하지 않는 이유는 무엇입니까?
- 스왑을 비활성화하는 것보다 더 좋은 방법이 있습니까? 예를 들어, 악성 프로그램과의 스와핑을 제한하고 시스템 서비스와 사용자 인터페이스를 물리적 메모리에 유지하는 방법이 있습니까?
답변1
제한된 스왑, 물리적 메모리 또는 둘 다를 사용할 수 있습니다 cgroups
. 보다 원시적인 접근 방식은 ulimit를 사용하는 것이었지만 이제는 cgroup이 표준이 되었습니다. (전체 cgroup 문서를 복사하여 붙여넣지는 않겠습니다.) cgroup을 사용하면 계층 구조의 각 프로그램에 대한 CPU 및 디스크 I/O 사용량 제한을 지정하여 중요한 작업에 대해 더 높은 우선 순위를 설정할 수도 있습니다.
답변2
메모리가 고갈되었을 때 디스크 사용을 방지하려면 swappiness sysctl을 조정하고 1 또는 0으로 설정해야 할 수도 있습니다.