OOM 킬러가 제대로 작동하지 않아 운영 체제가 정지됨


23

몇 년 동안 내 운영 체제 의 OOM 킬러 가 제대로 작동하지 않아 시스템이 정지됩니다.
메모리 사용량이 매우 높으면 메모리를 비우기 위해 프로세스를 종료하는 대신 전체 시스템이 몇 시간 또는 며칠 동안 "정지"되는 경향이 있습니다 (사실 : 매우 느려짐) . 내가 기록한 최대 값은 재설정을 수행하기 위해 사임하기 전 7 일입니다. OOM에 도달하면 측정 할 수 없게 되기 전에 iowait 는 매우 높습니다 (~ 70 %). 도구 : 모든 프로그램이 내 하드 드라이브에서 매우 높은 처리량 (수십 MB / 초 당)으로 읽는다는 것을 보여주었습니다. 그 프로그램들은 무엇을 읽고 있습니까?


iotop

-디렉토리 계층?
-실행 코드 자체?
나는 지금 정확히하지 않습니다.

[편집]이 메시지를 썼을 때 (2017 년) 최신 ArchLinux (4.9.27-1-lts)를 사용하고 있었지만 몇 년 전에 이미 문제를 경험했습니다.
다양한 Linux 배포판과 다른 하드웨어 구성에서 동일한 문제가 발생했습니다.
현재 (2019), 최신 데비안 9.6 (4.9.0)을 사용하고 있습니다 . 스왑 파티션이 아닌 16GB 의 물리적 램, 내 OS가 설치된 SSD가 있습니다.

내가 가진 램의 양으로 인해 스왑 파티션을 활성화하고 싶지 않습니다. 스왑 파티션은 문제의 평가를 지연시키기 때문입니다.
또한 SSD를 너무 자주 교체하면 디스크 수명이 단축 될 수 있습니다.
그건 그렇고, 나는 이미 스왑 파티션을 사용하거나 사용하지 않고 시도했지만 문제의 평가를 지연시킬뿐 해결책은 아닙니다.

나에게 문제는 리눅스가 캐시 에서 필수 데이터를 삭제한다는 사실에 기인한다 . 이것은 하드 드라이브에서 매번 모든 것을 읽어야하기 때문에 시스템을 정지시킨다.

Linux가 실행중인 프로그램의 실행 코드 페이지를 삭제하지 않는지 궁금합니다. 이는 일반적으로 많은 양의 데이터를 읽지 않는 프로그램이 이러한 상황에서 어떻게 작동하는지 설명합니다.

이 문제를 해결하기 위해 여러 가지 시도를했습니다.
하나는 (1GB) 로 설정 /proc/sys/vm/min_free_kbytes되었습니다 1000000.
1GB 는 사용 가능한 상태로 유지되어야하므로이 메모리는 Linux에서 중요한 데이터를 캐시하기 위해 예약되어 있다고 생각했습니다.
그러나 효과가 없었습니다.

또한, 나는 정의하여 그것을 실제 메모리의 크기에 가상 메모리의 크기를 제한하는 이론에 큰 소리를 수있는 경우에도 그를 추가하는 것이 유용 생각 /proc/sys/vm/overcommit_memory하는 것은 2, 내 상황에서 상당히 기술적으로 가능하지 않다 응용 프로그램의 종류 때문에 내가 사용하는 데는 몇 가지 이유로 효과적으로 사용하는 것보다 더 많은 가상 메모리가 필요합니다.
파일에 따르면 /proc/meminfoCommited_AS값은 (16기가바이트은 종종 더 높은 내 시스템의 물리적 램의 두 배 이상이다 Commited_AS가 자주> 32기가바이트입니다).

나는이 문제를 /proc/sys/vm/overcommit_memory기본값으로 경험했습니다 : 0, 그리고 잠시 동안 그것을 정의했습니다 :. 1나는 프로그램 이 때의 반환 값을 확인하지 않기 때문에 잘못 행동하는 대신 OOM 킬러에 의해 살해되는 것을 선호 했기 때문에 malloc할당이 거부됩니다.

IRC 에서이 문제에 대해 이야기 할 때이 문제를 겪은 다른 Linux 사용자를 만났으므로 많은 사용자가 이것에 관심이 있다고 생각합니다.
나에게 이것은 Windows조차도 높은 메모리 사용량을 더 잘 다루기 때문에 받아 들일 수 없습니다.

더 자세한 정보가 필요하면 제안을 해주십시오.

문서 :
https://en.wikipedia.org/wiki/Thrashing_%28computer_science%29
https://en.wikipedia.org/wiki/Memory_overcommitment
https://www.kernel.org/doc/Documentation/sysctl/vm. txt
https://www.kernel.org/doc/Documentation/vm/overcommit-accounting
https://lwn.net/Articles/317814/

: 그들은 그것에 대해 얘기를
왜 리눅스가 메모리 부족 (OOM) 킬러가 자동으로 실행되지 않지만, SysRq를 키에 따라 작동?
OOM-killer가 때때로 리소스 호그를 죽이지 않는 이유는 무엇입니까?
OOM Killer 사전로드
강제 스와핑시 OOM-killer를 트리거 할 수 있습니까?
OOM 상황 근처에서 높은 대기 시간을 피하는 방법은 무엇입니까?
https://lwn.net/Articles/104179/
https://bbs.archlinux.org/viewtopic.php?id=233843


1
나는 이것이 당신이 스 래싱하는 경우에 당신이 기대 해야하는 것이라고 생각하지만, 실제로 100 % "사용"에 접근하고 있지 않습니다. 즉, 파일 백업되고 너무 많은 메모리 사용이 "버프 / 캐시"로 계산됩니다. (이 구문은 tmpfs 할당이 "버퍼 / 캐시"로 표시되지만 실제 파일 시스템으로 페이징 될 수 없기 때문에 사소한 것으로 가정합니다). min_free_kbytes관련이 없으며 캐시 된 페이지를 예약하지 않습니다. AFAICT 어떤 vm
sysctls도

2
나는 몇 년 동안이 정확한 문제에 대한 해결책을 찾지 못했습니다. 나는 HDD로 SSD를 교체 한 후 처음으로 문제를 발견했다고 생각합니다. 이로 인해 스와핑을 완전히 비활성화 할 수 없었지만 이러한 변경 전에는 결코 발생하지 않았다고 보장 할 수 없으므로 관련이 없을 수 있습니다. Archlinux btw에 있습니다.
brunocodutra


1
@ dsstorefile1 감사합니다. 그러나이 상황에서 커널이 제대로 할 수 없을 때 어떻게 OOM 킬러를 트리거 할 수 있습니까?
M89

1
크롬이 모든 RAM을 통해 누출되었을 때 도움이되었습니다 ... (결국 실제 디스크 스왑 파티션을 추가하고 결국 상당한 양의 RAM으로 업그레이드했지만)
Gert van den Berg

답변:


5

나는 이유에 (같은 물건)이 설명을 발견했습니다 kswapd0는 않습니다 일정한 디스크 읽기가 발생 OOM 킬러가 잘못된 프로세스를 죽이기도하기 전에 :

  1. 이 askubuntu SE 답변 의 답변과 의견을 참조하십시오
  2. 유닉스 SE에 대한 답변과 David Schwartz의 답변 참조

난 정말 모든 동안 왜이 일정 디스크 읽기를 얻고 있었다에 나의 눈을 뜨게 1에서 여기에 코멘트를 인용 것 냉동 :

예를 들어 스왑이없고 시스템에 RAM이 거의없는 경우를 생각해보십시오. 커널은 Firefox에서 메모리를 가져옵니다 (Firefox는 디스크에서로드 된 실행 코드를 실행 중이기 때문에 가능합니다. 필요한 경우 디스크에서 코드를 다시로드 할 수 있습니다). Firefox가 N 초 후에 해당 RAM에 다시 액세스해야하는 경우, CPU가 "하드 결함"을 생성하여 Linux가 일부 RAM을 해제 (예 : 다른 프로세스에서 일부 RAM 사용)하고 디스크에서 누락 된 데이터를로드 한 다음 Firefox가 다음과 같이 계속되도록합니다. 보통의. 이것은 일반적인 스와핑과 매우 유사하며 kswapd0이 수행합니다. – Mikko Rantalainen 2 월 15 일 13:08

누구 든지이 동작을 비활성화하는 방법에 대한 방법이 있다면 ( 커널을 어떤 옵션으로 다시 컴파일 할 수 있습니까? ) 가능한 한 빨리 알려주십시오! 감사합니다!

업데이트 : 내가 지금까지 찾은 유일한 방법은 커널 패치를 통해이며, 그것은 불가능 스왑과 나를 위해 작동 (예. CONFIG_SWAP is not set하지만 스왑이 활성화 된 다른 사람을 위해 일을하지 않는) 것 같다 ; 질문 안에있는 패치를보십시오 .


제발 제거 유효하지 않은 텍스트를. 텍스트에서 "EDIT"로 편집에 태그를 지정하지 마십시오. 그것들은 개정 이력 에서 분명하다 .
Kusalananda

1
@Kusalananda이 사용자는 아마도 가장 많은 기여를 한 사람이므로 격려를 받아야합니다.
M89

@ Kusalananda 나는 다른 사람들이 시도하고 작동하지 않는 것을 다른 사람들이 볼 수 있도록 유지하는 것이 중요하다고 생각했습니다. 아마도 UPDATE대신에 EDIT더 좋았을까요?

@MarcusLinsner 아니요, 죄송합니다. 오해하셨습니다. 당신이 무엇을 시도했다 표시하면이 때 당신이 무엇을 묻는 질문. 대답은 그것이 현재 제기됨에 따라 질문에 대한 올바른합니다. 한 번의 수정으로 독자에게 이전 수정무시 하도록 요청하기도합니다 . 편집 기록을보고 싶은 사람은 여기에서 볼 수 있습니다 .
Kusalananda

0

메모리 컨트롤러 의 memory.min매개 변수 cgroups-v2가 도움이됩니다.

즉, 인용하겠습니다.

하드 메모리 보호. cgroup의 메모리 사용량이 유효 최소 경계 내에 있으면 cgroup의 메모리는 어떠한 조건에서도 회수되지 않습니다. 사용 가능한 보호되지 않은 재생 가능 메모리가 없으면 OOM 킬러가 호출됩니다.

출처 : https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html


좀 더 자세히 설명해 주시겠습니까? 귀하의 답변은 OP 질문에 대답하는 데 약간 부족합니다.
역설
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.