메모리가 부족할 때 Linux가 정지되는 것을 어떻게 방지합니까?


25

오늘 (실수로) 많은 메모리를 빠르게 사용하는 Linux 상자에서 일부 프로그램을 실행했습니다. 내 시스템이 멈추고 응답하지 않아서 가해자를 죽일 수 없었습니다.

나중에 이것을 어떻게 방지 할 수 있습니까? 적어도 반응 형 코어 또는 무언가를 계속 실행할 수 없습니까?


메모리가 부족할 때 시스템이 중복되는 현상 및 잘 알려진 버그
Dan Dascalescu

답변:


15

나는 시스템이 실제로 "동결"되지 않았고 (커널이 정지되었다는 의미에서) 오히려 응답이없는 것이 틀림 없다. 인터랙티브 한 성능과 시스템 처리량이 급격히 떨어질 수밖에 없었습니다.

스왑을 해제 있지만 사용 가능한 디스크 캐시로 인한 성능 저하와 함께 성능 저하에서 OOM으로 죽인 프로세스 (및 발생하는 모든 재미)로 문제가 변경됩니다.

또는 프로세스 당 리소스 제한 (일반적으로 rlimit및 / 또는 라고도 함 ulimit)을 사용하여 단일 프로세스에서 엄청나게 많은 양의 메모리를 사용하여 스와핑을 유발할 가능성을 제거 할 수 있습니다. 시스템이 원하는 것보다 조금 더 많은 메모리를 원했기 때문에 불편한 순간.

대량의 메모리 사용을 유발할 수있는 작업을 수행 할 줄 알았다면, mlockall()쉘을 실행 한 다음 랩을 실행 한 랩퍼 프로그램을 작성할 수 있습니다. 그것은 메모리에 유지되며, CPU가 과도하게 사용되지 않고 문제가되는 것이기 때문에 "응답 성 코어를 유지하는"가장 가까운 것입니다.

개인적으로, 나는 "멍청한 일을하지 말라"는 자원 통제 방법에 가입한다. 당신이 루트를 가지고 있다면, 당신은 시스템 손상의 모든 종류를 할 수 있고, 일 때문에 아무것도 당신의 가능성이 결과를 모르는를 위험한 사업이다.


2
불행히도 "멍청한 일을하지 마십시오"는 Chrome과 같은 메모리를 많이 사용하는 애플리케이션을 실행하는 사용자에게는 도움이되지 않습니다 (문제 134612 , 393395 참조 ).
Dan Dascalescu

1
@ DanDascalescu 그리고 당신이 바보 같은 일을하고 있다는 것이 항상 분명하지는 않습니다. (복잡한) SQLite 쿼리에서 "UNION"을 "UNION ALL"로 변경했기 때문에 다른 날 컴퓨터가 중단되었습니다.
Michael

알려진 버그가있는 프로그램은 자원이 제한된 구성으로 실행될 수 있으며 ulimit, 심지어 요즘 청년층이라면 요즘 cgroup에서도 잘 작동합니다. 중요하지 않은 환경에서 영향을 검증하지 않고 프로덕션에서 쿼리를 변경하는 경우 근본 원인이 문제입니다.
울림

8

Tronic의 설명에서 위에서 언급했듯이 키보드 조합 SysRq- 을 사용하여 OOM-killer (메모리 킬러에서)를 직접 호출 할 수 있습니다 F.

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

OOM-killer는 일부 프로세스 (-es)를 종료하고 시스템이 다시 응답합니다. OOM-killer에 대한 직접 액세스는 기본적으로 활성화되어 있지 않을 수 있습니다. plz는 이 질문 을 확인하여 상태를 확인하거나 활성화하는 방법을 찾으십시오.

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



0

커널을 다시 컴파일하고 싶다면 다음 질문 섹션 에서 패치 를 시도해보십시오 EDIT. /programming//q/52067753/10239615 높은 메모리 부족 상태
에서 Active(file)페이지를 제거하지 않으므로 OOM-killer를 허용합니다. 커널이 더 이상 OS를 정지시키는 모든 프로세스의 실행 가능 코드 페이지를 디스크에서 다시 읽는 데 몇 분의 시간을 소비 할 필요가 없기 때문에 거의 즉시 트리거됩니다.


-1

이것은 특히 예방하기 어려운 것입니다. 커널이 스와핑을 시작하기 때문입니다. 한 가지 해결책은 스왑을 끄는 것입니다. 스왑을 시작하지 않고 시스템 메모리가 부족하면 커널이 일부 프로세스를 종료시킵니다. 일반적으로 올바른 프로세스를 강제 종료하여 선택하지만 응답없는 시스템을 갖는 것보다 임의 프로세스를 강제 종료하는 것이 좋습니다.

서버에 충분한 RAM이 있고 스왑 공간을 사용하기 시작하면 문제가 발생하기 때문에 이는 서버에 특히 적합한 솔루션입니다. 그러나 데스크톱에는 일반적으로 스왑 공간이 필요하므로 데스크톱에는 적합한 솔루션이 없다고 생각합니다. 특히 메모리 누수가 의심되는 경우 서버에서 종종 스왑 공간을 끕니다.


4
사용하지 않는 페이지가 스왑 아웃되고 디스크 캐시에 사용 가능한 여유 공간이 없기 때문에 시스템에서 스왑을 해제하는 것은 좋지 않습니다. 이다 특히 메모리 누수가있을 때 사실.
울림

2
그리고 스왑을 해제해도 페이징으로 인해 시스템이 여전히 느려지 게됩니다. 더러운 페이지 대신 깨끗한 페이지를 열렬하게 페이징합니다. (이후 스왑없이, 그것은 축출 더러운 페이지는 항상 EVICT 깨끗한 사람을 없을 것이다 않을 수 있습니다.)
데이비드 슈워츠

메모리 누수가있는 서버가 있습니다. 처음 발생했을 때 서버가 응답하지 않기 때문에 재설정 버튼을 눌러야했습니다. 그러나 이제 스왑을 해제 했으므로 서버는 너무 커지면 아파치 자식을 죽입니다 (MaxRequestsPerChild 외에도 안전 장치입니다). 결과적으로 서버가 문제없이 실행됩니다. 어쨌든 사용되지 않은 페이지가 많지 않으며 깨끗한 페이지를 열렬하게 페이징하지 않습니다.
Antonis Christofides

@AntonisChristofides : 나는 당신이 그것에 대한 테이크 아웃 레슨이 무엇인지 어떻게 생각하는지 잘 모르겠습니다. 실제 메모리에서 거의 액세스하지 않는 더티 페이지를 제거 할 수 없어 성능이 저하되고 근본적인 문제를 해결하지 못하여 OOM 킬러가 중요한 프로세스를 종료 할 수있는 위험이 있기 때문에 솔루션은 확실히 나쁜 방법입니다. 내가 경고 한 특정 위험에 직면하지는 않았지만 스왑이 없기 때문에 여전히 위험에 처해 있습니다.
David Schwartz

8
스왑 유무에 관계없이 OOM 킬러가 자동으로 실행되기 전에 여전히 정지됩니다. 이것은 실제로 수정해야하는 커널 버그입니다 (즉, 모든 디스크 캐시를 삭제하기 전에 OOM 킬러를 일찍 실행). 불행히도 커널 개발자와 다른 많은 사람들은 문제를 보지 못합니다. 스왑 비활성화 / 활성화, 더 많은 RAM 구입, 적은 프로세스 실행, 제한 설정 등과 같은 일반적인 제안은 커널의 낮은 메모리 처리가 낙타의 공을 빨아 먹는 근본적인 문제를 해결하지 못합니다. 한편, 시스템이 멈췄을 때 OOM 킬러를 수동 (SysRq-F)으로 실행하면 더 빨리 복구됩니다.
Tronic 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.