
때때로 나는 처리를 위해 메모리에 보관하고 싶은 엄청난 양의 데이터 덤프를 가지고 작업합니다. 때때로 프로그램이 생성할 메모리 양을 잘못 계산하거나 디버거가 사용 가능한 메모리를 초과하는 요소를 메모리 사용량에 곱합니다.
메모리가 부족한 프로세스를 시작할 때마다 정상적인 운영 체제에서 기대할 수 있는 것은 다음과 같습니다. 사용 가능한 메모리를 모두 먹어본 다음 다른 중요하지 않은 프로세스에 필요하지 않은 일부 메모리를 포기하도록 요청한 다음 교환해서 쓰세요.
Ubuntu가 나를 위해 하는 일은 다음과 같습니다. 모든 여유 메모리를 먹고 운영 체제에 모든 필수 서비스(그놈 세션, 터미널, 키보드)를 교체하도록 요청한 다음 작동을 멈추고 전원 플러그를 뽑을 때까지 기다립니다.
두 가지 질문:
- 운영체제는 어떤 것이 너무 중요해서 사용자 입력을 듣지 않아도 괜찮다고 어떻게 가정할 수 있습니까?
- 어리석은 프로세스가 시스템이 제공하는 것보다 더 많은 리소스를 소모하더라도 필수 서비스를 절대 교체하지 않고 항상 사용자 입력에 반응하도록 Ubuntu에 어떻게 지시할 수 있습니까?
답변1
아직 이 문제에 대한 해결책은 없지만 다른 사람들이 관심을 가질 수 있는 두 가지 해결 방법을 제안할 수 있습니다.
1)이른 시간
이는 메모리 사용량을 관찰하고 특정 임계값에 도달하면 가장 많은 메모리를 소비하는 프로세스를 종료하는 서비스입니다(참조:이것그리고이것리눅스 커널의 OOM 킬러에 관한 질문)
작은 덩어리로 메모리를 무한정 요청하는 데모 프로세스로 테스트했습니다. 첫인상은 이렇습니다. 악성 프로세스를 시작하면 RAM이 빠르게 소모됩니다. 그런 다음 교체가 시작되고 시스템이 응답하지 않게 됩니다. 몇 초 후에 시스템이 다시 온라인 상태가 됩니다. earlyoom의 로그에는 메모리와 스왑 사용량이 모두 90%에 도달한 후 메모리 소모 프로세스가 종료되었음을 보여줍니다.
스왑이 시작되고 프로세스가 종료된 후에도 다른 프로세스의 일부는 일반적으로 요청될 때까지 스왑 상태로 남아 있지만 이는 시작에 불과합니다.
2) 스왑을 비활성화하십시오.
나는 이것이논쟁의 여지가 있는 주제그러나 데스크톱 시스템, 특히 프로세스가 모든 메모리를 소모하려고 하는 경우가 종종 발생할 수 있는 개발 시스템의 경우에는 의미가 있습니다. 스왑이 없으면 OOM 킬러는 의도한 대로 작동합니다. 메모리가 부족해지면 다음을 찾습니다.죽이는 가장 좋은 방법그리고 그것을 제거합니다. 지연 없음, 지연 없음.
sudo swapoff -a
또는를 사용하여 현재 세션에 대한 스왑을 비활성화할 수 있습니다.변경 사항을 영구적으로 적용.
물론 문제에 대한 적절한 해결책은 주 메모리가 고갈되어도 내일이 없는 것처럼 메모리를 교환하기 시작할 때 시스템이 계속 반응하는 것입니다. 하지만 그런 일이 곧 일어날 것 같지는 않습니다.
답변2
+22.04 LTS부터
메모리 사용량을 자동으로 모니터링하고 메모리가 부족할 때 프로세스를 종료하려고 시도하는 systemd-oomd라는 서비스가 있으며 기본적으로 systemd의 일부로 설치됩니다. 현재 상태 유형을 보려면 oomctl
. 예제 출력:
Dry Run: no
Swap Used Limit: 90.00%
Default Memory Pressure Limit: 60.00%
Default Memory Pressure Duration: 20s
System Context:
Memory: Used: 4.1G Total: 15.5G
Swap: Used: 1.0G Total: 3.9G
Swap Monitored CGroups:
Path: /
Swap Usage: (see System Context)
Memory Pressure Monitored CGroups:
Path: /user.slice/user-1000.slice/[email protected]
Memory Pressure Limit: 50.00%
Pressure: Avg10: 0.00 Avg60: 0.02 Avg300: 0.00 Total: 9s
Current Memory Usage: 3.9G
Memory Min: 0B
Memory Low: 0B
Pgscan: 23663084
Last Pgscan: 23663084
기본적으로 메모리와 스왑 사용량이 모두 90%일 때 회수를 시작합니다. 사용자 슬라이스 제어 그룹에 메모리 압력을 사용합니다(예:[이메일 보호됨])는 대부분의 응용 프로그램이 생성되는 곳이지만 NetworkManager 및 Gnome Display Manager와 같은 시스템의 가장 중요한 구성 요소를 생성하는 system.slice 제어 그룹에는 없습니다. 즉, oomd는 시스템 프로세스보다 먼저 사용자 프로세스를 해제합니다. systemd-oomd의 현재 구성을 보려면 다음을 입력하십시오.
systemd-analyze cat-config systemd/oomd.conf
인용하다이 페이지그들이 하는 일에 대한 참고 자료입니다. 특정 시스템 장치의 OOM 매개변수를 편집하려면 지정된 변수를 추가하거나 편집하십시오.여기유닛 파일에
답변3
다음 두 가지 중 하나를 시도해 보세요.
1) swappiness 설정을 기본 설정인 60에서 10으로 변경합니다.즉: 추가하다VM.swappiness = 10/etc/sysctl.conf로(터미널에서 sudo gedit /etc/sysctl.conf
)을 입력한 다음 시스템을 재부팅합니다. 자세한 내용을 보려면 여기에서 swappiness를 검색하세요.
2) 스왑 기능이 도움이 되지 않는다면... 원하지 않더라도... 스왑 파일의 크기를 1.5x16G로 늘리고 도움이 되는지 확인하십시오.
계속해서 알려주세요. 건배, 알