Linux에서 실제 메모리가 가득 차서 시스템이 "정지"되는 것을 방지합니다.

Linux에서 실제 메모리가 가득 차서 시스템이 "정지"되는 것을 방지합니다.

나는 얼마전에 Linux가 메모리가 부족하면 프로세스를 종료한다는 것을 배웠습니다. 이전에는 swapoff 명령을 사용하여 스왑을 분리했습니다. 일반적으로 어떤 프로세스가 루프의 메모리 누수와 같은 버그로 인해 모든 메모리를 차지하면 잘못된 프로세스를 죽이는 대신 시스템이 정지됩니다(기술적으로는 정말 느리다는 것을 알고 있습니다).

어떻게 하면 이를 방지할 수 있나요? 완벽한 소프트웨어는 없습니다. 저는 잘못 코딩된 프로그램을 실행하고 가끔 이 문제에 직면합니다. 매번 시스템을 재설정해야 합니다. 이것이 단지 최신 커널의 한계일까요? 물리적 메모리가 넓더라도 커널이 물리적 메모리를 효율적으로 활용하기 위해 어느 정도 스왑을 사용한다는 것을 알고 있기 때문에 스왑을 끌 수는 없습니다.

더 작은 스왑 공간을 사용하는 것이 옵션일 수 있습니다(OOM 전 시간이 더 짧음).

답변1

핵심충분한 저장킬러는 최후의 수단으로 사용됩니다. 실행 중인 프로세스에 충분한 메모리 및/또는 스왑 공간을 제공하면 해당 프로세스가 트리거되지 않습니다.

시스템에 물리적 메모리가 부족해지면 스왑 공간을 사용하기 시작합니다. 이 시점부터 속도가 느려지기 시작하며 때로는 극적으로 느려집니다. 동일한 물리적 메모리를 사용하려는 활성 프로세스가 충분하면 시스템은 실제로 실행하는 것보다 프로세스를 교체하는 데 더 많은 시간을 소비하기 시작합니다.

스왑 공간이 거의 소진되면 커널은 다른 프로세스를 계속 실행하기 위해 프로세스를 종료하기 시작합니다. 선정 과정에 사용된 OOMK 기준을 조사할 필요가 없었기 때문에 여기서는 설명할 수 없습니다.

해결 방법은 다음 중 하나 이상입니다.

  • 물리적 메모리 추가
  • 더 많은 (또는 일부) 스왑을 추가하십시오. 이는 디스크 파티션 또는 파일일 수 있습니다.
  • 실행 중인 프로세스의 수 또는 크기 줄이기
  • 런어웨이 메모리가 있는 프로세스의 코드 수정

기타 참고자료

각 프로세스가 사용할 수 있는 메모리 양에 대한 제한을 설정할 수 있습니다. 이 값을 초과하려고 시도하면 할당 요청이 실패합니다. 일반적으로 이로 인해 할당 요청의 반환 값을 테스트하지 않기 때문에 제어되지 않은 방식으로 또는 치명적인 예외가 있는 제어된 방식으로 프로그램이 충돌하게 됩니다.

답변2

이것은 오랫동안 나를 괴롭혀온 오래된 질문이다. Linux에 대한 내 경험에 따르면 OOM 킬러가 손상되었습니다. 이것은 작동하지 않습니다. 크롬 브라우저는 죽지 않습니다. 다른 프로세스는 종료되지 않습니다. 오늘 아침 Tumblerd 프로세스가 2.1GB를 사용하여 내 시스템을 거의 충돌시킬 뻔했습니다. 고통스러울 정도로 얼어붙은 시스템(아래 키보드 단축키 덕분에 살아남았습니다)에서 3분을 기다린 후에도 Linux는 2.1GB의 프로세스를 종료하지 않았으며 이는 작동하지 않는다는 추가 증거입니다.

나는 누군가에게 그것이 작동하는지 물어보려고 여기 있는 것이 아니므로, 타이핑을 다른 사람들에게 맡기십시오. 평소 bla bla bla...(무례하네요)

이 문제를 해결할 수 있는 유일한 방법은 항상 free -h를 사용하여 사용 가능한 메모리를 모니터링하는 것이었습니다. 그렇지 않으면 짧은 시간 임계값을 놓치고 전체 시스템이 정지되어 하드 재설정이 발생할 수 있습니다. 모든 Chromium 프로세스를 종료하는 스크립트를 위해 XFCE에 키보드 단축키가 설정되어 있는데, 이는 내 특정 사용 사례에 충분합니다. 하지만 "가장 많은 메모리를 사용하는 프로세스를 종료"하는 방법을 찾을 수 있다면 더 좋을 것입니다(앞에서 언급한 오늘 아침 일찍 발생한 정지로 인해 현재 찾고 있습니다).

먼저 다음 명령을 사용하여 종료하려는 프로세스를 테스트하십시오.

ps aux | grep STRING
ps aux | grep PORTION_OF_NAME_WITHOUT_QUOTES_OR_SPACES

종료하려는 프로세스가 표시되면 아래 스크립트에서 괄호 안에 넣으세요.

#!/bin/bash
#
kill -9 $(ps aux | grep type=renderer)
# the above will kill all my Chromium processes
# without having to restart my entire browser or losing progress
# incognito window will be kept alive, instead of lost
#
killall tumblerd
# (optional)

빈 텍스트 파일에 붙여넣고 SOMETHING.SH로 저장한 다음 chmod a+x /path/to/SOMETHING.SH를 실행하여 실행 가능하게 만들고 키보드 단축키에 할당합니다(XFCE에서 가능).

텀블러드 프로세스 관련 문제를 피하는 가장 좋은 방법은 비디오 썸네일 생성만 담당하므로 시스템에서 이를 제거하는 것입니다.

sudo apt remove tumbler

따라서 이 글을 읽고 있는 사람이라면 Linux의 OOM 킬러가 손상되었다고 의심하더라도 틀린 것이 아니며 자신이 생각하는 것에 대해 다른 사람이 죄책감을 느끼게 하지 마십시오.

편집: 내 실수는 핫키 활성화 스크립트에서 sudo를 사용하지 않는 것입니다. 그렇지 않으면 터미널에서 직접 실행할 때만 비밀번호를 묻는 메시지를 표시하지 않기 때문에 나머지 스크립트가 실행되지 않습니다.

관련 정보