우분투에 RAM이 빨리 떨어지고 컴퓨터가 멈추기 시작합니다. 어떤 명령으로 이것을 해결할 수 있습니까?


73

RAM과 스왑 공간이 모두 부족하여 백그라운드에서 소프트웨어를 컴파일 할 때 자주 발생하며 갑자기 모든 것이 느려지기 시작하고 [아무것도하지 않으면] 결국 정지됩니다.

이 질문은 그놈 터미널을 열고 내 이력을 검색하고 하나의 sudo명령을 실행할 수있는 충분한 시간과 리소스가 있다고 가정합니다 .

하드 재부팅이나 재부팅을하지 않아도되는 명령은 무엇입니까?


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
토마스 워드

1
스왑 공간이 부족하면 너무 적은 공간이 있다고 생각합니다. 이 컴퓨터에 20G의 스왑 공간이 있습니다. 요점은 사용 가능한 시스템으로 충분한 시간을 주어 메모리를 먹는 모든 것을 죽일 수 있다는 것입니다. 그것은 당신이 사용할 것만을 취하는 것이 아니라 결코 사용하지 않기를 바라는 것입니다.
JoL

1
RAM과 스왑이 모두 채워져 있습니까? 이 경우 OOM 핸들러는 컴파일러를 종료하고 메모리를 비 웁니다 (또한 빌드 프로세스를 망칩니다). 그렇지 않으면 방금 채워지고 있다고 생각됩니다. 스왑이 시스템 디스크에 있기 때문에 시스템 속도가 느려질 수 있습니다.
sudo

3
지원할 RAM이 충분하지 않은 경우 병렬 빌드 수를 줄이십시오. 빌드가 바뀌기 시작하면 속도가 느려집니다. 를 사용하면 예를 들어 한 번에 4 개의 병렬 빌드를 make시도하십시오 -j4.
Shahbaz

1
"Alexa는 나에게 8 기가의 숫양을 주문"

답변:


84

내 경험상 Firefox와 Chrome은 처음 7 대의 컴퓨터를 합친 것보다 많은 RAM을 사용합니다. 아마도 그것보다 더 많지만 내 요점에서 멀어지고 있습니다. 가장 먼저해야 할 일은 브라우저를 닫는 것 입니다. 명령?

killall -9 firefox google-chrome google-chrome-stable chromium-browser

가장 인기있는 브라우저를 하나의 명령으로 묶었지만 분명히 다른 것을 실행 중이거나 명령 중 하나를 사용하지 않는 경우 명령을 수정하십시오. 는 killall -9 ...중요한 비트입니다. 사람들은 SIGKILL(신호 번호 9) 에 대해 iffy를 얻지 만 브라우저는 매우 탄력적입니다. 그보다 천천히 종료 SIGTERM하면 브라우저에 많은 정리 RAM이 필요합니다. 추가 RAM이 많이 필요 하므로이 상황에서 감당할 수없는 것입니다.

이미 실행중인 터미널이나 Alt+ F2대화 상자 로 가져올 수 없으면 TTY로 전환하십시오. Control+ Alt+ F2를 사용하면 로그인이 가능하지만 속도가 느릴 수있는 TTY2로 이동 htop하여 문제를 디버깅하는 데 사용할 수 있습니다 . 나는 내가 얻을 수 없었던 정도로 RAM이 부족하다고 생각하지 않습니다 htop.

장기적인 해결책은 더 많은 RAM을 구매하거나 원격 컴퓨터를 통해 임대하거나 현재하고있는 일을하지 않는 것입니다. 복잡한 경제적 인 논증은 당신에게 맡기 겠지만 일반적으로 말하면 RAM은 저렴하지만 버스트 금액 만 필요한 경우 분당 청구되는 VPS 서버 또는 시간이 올바른 선택입니다.


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
토마스 워드

lazygit때때로 사용하는 자체 명령에 연결된 몇 가지 명령이 있는데 여기에 적용될 수 있습니까? 전체 killall ...스크립트는 단순 emptyram하거나 이와 유사한 것으로 축소 될 수 있습니다
Francisco Presencia

어떤 브라우저가 실행 중인지 알고 있으면 RAM 부족을 식별 할 수있는 대부분의 사람들이 수행한다고 가정하면 전체 명령을 실행할 필요가 없습니다. 확장하여, 나는 emptyram단지 펀치 인하는 것보다 스크립트를 작성했다는 것을 기억하기가 더 어렵다는 것을 알게 되었습니다 killall -9 firefox.
Oli

2
RAM 구매 ... RAM을 더 다운로드하지 않는 이유는 무엇입니까?
Stephan Bijzitter

1
아마도 당신은 농담을 할 수 있지만 당신이 가지고있는 훨씬 더 많은 RAM과 CPU가 필요한 짧은 시간 동안 무언가를해야한다면 , 분 단위로 VPS를 임대하는 것은 원샷에 대해 매우 경제적입니다.
Oli

66

Magic System Request Key가 활성화 된 시스템에서 Alt + System Request+ f(키보드에 표시되어 있지 않은 경우 System Request종종 Print Screen키에 있음)를 누르면 커널의 메모리 부족 킬러 (oomkiller)가 수동으로 호출되어 최악의 공격 프로세스를 선택합니다. 메모리 사용량과 그것을 죽입니다. 설명했던 것보다 시간이 덜 걸리고 시스템이 방금 시작하려고하거나 이미 시작한 경우이 작업을 수행 할 수 있습니다.이 경우 종료 된 항목을 정확히 신경 쓰지 않을 것입니다. 사용 가능한 시스템. 때때로 이것은 X를 죽일 수 있지만 요즘 대부분은 이전보다 나쁜 프로세스를 선택하는 것이 훨씬 낫습니다.


5
@ T.Saring으로 바로 들어가면 이미 메모리 먹는 사람을 잃거나 죽일 수 있습니다. 행동을 자제하면 아무것도 얻지 못합니다.
Ruslan

4
당신이 설정 한 경우에만 작동합니다 @Muzer kernel.sysrq1또는에서 올바른 비트를 포함하여 다수 /etc/sysctl.d/10-magic-sysrq.conf.
Ruslan

9
@ T.Sar 당신은 제정신 빌드 시스템을 사용한다면 진전을 잃지 않을 것입니다. 모든 객체 파일을 유지하지만 실제로 컴파일하는 객체 파일은 그대로 유지 한 다음 중단 한 부분으로 돌아갑니다.
Muzer

3
@ T.Sar 컴파일하는 것이 제정신이 아니기 때문에 빌드 시스템이 제정신이 아니라는 의미는 아닙니다. 옛날부터 빌드 시스템은 이후 컴파일에서 재사용하기 위해 객체 파일을 저장했습니다. 다른 한편으로, 나는 리눅스보다 일반적으로 잘 설계되지 않은 많은 소프트웨어 프로젝트의 이름을 말할 수있다. 예를 들어, 병렬 빌드 스레드가 8 개인 Firefox 또는 OpenOffice와 같은 것을 컴파일하면 기가 바이트 RAM의 순서로 쉽게 볼 수 있습니다. 또한 수백 개의 라이브러리에 의존하는 단일 기업 시스템이 많이 있습니다.
Muzer

7
@ T.Sar Linux는 실제로 컴파일러의 POV와 복잡하지 않습니다. 실제로 C 프로그램은 거의 없습니다. C ++는 어떻습니까? Eigen 또는 Boost를 사용하여 프로그램을 작성해 본 적이 있습니까? 컴파일러가 때때로 그러한 프로그램으로 얼마나 많은 메모리를 사용하는지 놀라게 될 것입니다. 복잡 할 필요는 없습니다.
Ruslan

20

다른 답변과 달리이 작업을 수행하는 동안 스왑을 비활성화하는 것이 좋습니다. 스왑은 시스템을 예측 가능한 방식으로 실행하고 디스크 캐시 공간을 확보하기 위해 사용하지 않는 페이지를 제거하여 디스크에 액세스하는 응용 프로그램의 처리량을 늘리는 데 종종 사용되지만,이 경우 시스템 속도가 느려지는 것처럼 들립니다. 너무 많이 사용되는 메모리가 강제로 스왑되도록 제거되어 사용할 수없는 수준으로 전환되었습니다.

이 작업을 수행하는 동안 스왑을 모두 비활성화하는 것이 좋습니다. 따라서 메모리 부족 킬러는 RAM이 가득 차 자마자 작동합니다.

대체 솔루션 :

  • 스왑 파티션을 RAID1에 넣어 스왑의 읽기 속도를 높이십시오
    • 위험하다고 느끼는 경우 RAID0 또는 디스크가 오작동하는 경우 많은 수의 실행중인 프로그램이 중단됩니다.
  • 동시 빌드 작업 수를 줄이십시오 ( "더 많은 코어 = 더 빠른 속도", 우리는 RAM에 선형적인 비용이 든다는 것을 잊어 버렸습니다)
  • 이것은 두 가지 방법으로 갈 수 있지만 zswap커널에서 활성화 해보십시오 . 이렇게하면 스왑으로 전송되기 전에 페이지가 압축되어 기계 속도를 높일 수있는 충분한 공간을 제공 할 수 있습니다. 반면에, 여분의 압축 / 압축 해제로 인해 방해가 될 수 있습니다.
  • 최적화를 낮추거나 다른 컴파일러를 사용하십시오. 코드 최적화는 때때로 몇 기가 바이트의 메모리를 차지할 수 있습니다. LTO가 켜져 있으면 링크 단계에서도 많은 RAM을 사용하게됩니다. 다른 모든 방법이 실패 tcc하면 컴파일 된 제품에 약간의 런타임 성능 저하를 희생시키면서 더 가벼운 컴파일러 (예 :)로 프로젝트를 컴파일 할 수 있습니다 . 개발 / 디버깅 목적으로이 작업을 수행하는 경우 일반적으로 허용됩니다.

6
스왑을 끈 경우 메모리 부족시 Linux의 동작입니다. Linux가 메모리 부족 킬러를 호출하지 않고 대신 정지하면 설정에 더 큰 문제가 있음을 나타낼 수 있습니다. 물론 스왑이 켜져 있으면 동작이 약간 다릅니다.
Score_Under

10
@ Akiva 스왑없이 시도한 적이 있습니까? 이 답변은 현장에 있습니다. sudo swapoff -a바인드 상태 일 때 달리기 를하면 절약 할 수 있다고 덧붙이고 싶습니다 . 스왑 공간의 추가 사용을 즉시 중지합니다. 즉, 다음 순간에 OOM 킬러를 호출하고 기계를 작동 상태로 만들어야합니다. sudo swapoff -a또한 메모리 누수를 디버깅하거나 파이어 폭스를 컴파일 할 때 훌륭한 예방 조치입니다. 일반적으로 스왑은 약간 유용하지만 (예 : 최대 절전 모드 또는 실제로 필요없는 항목을 스왑하는 경우) 실제로 메모리를 사용하는 경우 고정이 더 나빠집니다.
Jonas Schäfer

2
@Score_Under : 각 디스크의 개별 스왑 파티션은 md raid0 장치의 스왑보다 훨씬 더 효율적입니다. 어디서 읽었는지 잊어 버려요. 리눅스 RAID 위키는 raid0보다 별도의 파티션을 권장하지만 더 좋은 이유에 대해서는 아무 것도 말하지 않습니다 . 어쨌든 예, RAID1 또는 RAID10n2는 스왑에 적합합니다. 특히 더럽지 만 매우 차가운 페이지를 스왑하여 페이지 캐시에 더 많은 RAM을 남겨 두려는 경우 특히 그렇습니다. 즉 스왑 성능은 큰 문제가 아닙니다.
Peter Cordes

2
내 요점은 귀하의 조언에 따라 스왑이 필요하기 때문에 해당 프로그램을 전혀 실행하지 못할 수 있다는 것입니다. 100 % 실패한 빌드는 시스템을 잠글 확률이 50 % 인 빌드보다 나쁘지 않습니까?
Dmitry Grigoryev

2
스왑이 없으면 많은 컴퓨터에서 많은 양의 코드를 컴파일 할 수 없습니다. 왜 그가 희생하고 싶은 컴파일이라고 가정합니까?
David Schwartz

14

다음 명령을 사용하여 (필요한 경우 반복적으로) 시스템에서 가장 많은 RAM을 사용하여 프로세스를 종료 할 수 있습니다.

ps -eo pid --no-headers --sort=-%mem | head -1 | xargs kill -9

와:

  • ps -eo pid --no-headers --sort=-%mem: 실행중인 모든 프로세스의 프로세스 ID를 메모리 사용량별로 정렬하여 표시합니다.
  • head -1: 첫 번째 줄만 유지하십시오 (가장 많은 메모리를 사용하는 프로세스)
  • xargs kill -9: 프로세스를 종료

Dmitry의 정확한 의견 다음에 편집하십시오.

민감한 작업이 실행되고 있지 않을 때 (원치 않는 작업) 실행해야하는 빠르고 더러운 솔루션입니다 kill -9.


5
이것은 OOM 킬러가 상황을 처리하게하는 것보다 훨씬 나쁩니다. OOM 킬러는 그보다 훨씬 똑똑합니다. 진행중인 컴파일이있는 컴퓨터에서 실제로 이러한 명령을 실행합니까?
Dmitry Grigoryev

@DmitryGrigoryev 때로는 데스크탑에서 Xorg를 죽이는 것이 현명합니다. 현대 커널에서 OOMK는 약간의 정신력을 얻은 것으로 보이지만 결국에는 그것을 신뢰하지는 않습니다.
Ruslan

11

리소스 소비 명령을 실행하기 전에 setrlimit (2) 시스템 호출을 사용할 수 있습니다 . 아마도 ulimitbash 쉘 (또는 limitzsh에 내장)을 -vfor 와 함께 사용할 수 RLIMIT_AS있습니다. 그러면 너무 큰 가상 주소 공간 소비 (예 : malloc (3)에서 사용하는 mmap (2) 또는 sbrk (2) 사용 )가 실패합니다 ( errno (3) 가 ).ENOMEM

그런 다음 ulimit시스템을 정지시키기 전에 (즉, 입력 한 후 쉘의 배고픈 프로세스 ) 종료됩니다.

또한 Linux Ate My RAM을 읽고 메모리 초과 커밋을 비활성화 하십시오 (명령 echo 0 > /proc/sys/vm/overcommit_memory 을 루트로 실행하여 proc (5) ... 참조).


11

이것은 백그라운드에서 소프트웨어를 컴파일 할 때 나 에게 자주 발생 합니다.

이 경우 "killall -9 make"(또는 작성하지 않은 경우 컴파일 관리에 사용하는 모든 것)와 같은 것이 있습니다. 이것은 컴파일 진행을 더 이상 멈추게하고, 시작된 모든 컴파일러 프로세스를 SIGHUP 할 것입니다 (필요하게도 멈추게 함) 로. 그리고 웹 브라우저, X 세션 또는 일부 프로세스 대신 문제의 실제 원인을 임의로 죽이기 때문에 당시 시스템에서 수행중인 다른 작업을 방해하지 않습니다.


2
이 대답을 찾기 위해 지금까지 아래로 스크롤해야한다는 것은 부끄러운 일입니다. 나는 누군가 가이 RAM 먹는 사람의 진행을 중단시키는 방법을 제안하기를 바랐습니다.
TOOGAM

OP가 기대하는 대답 근처에 아무것도 없지만 문학적 질문에 대답합니다.
9ilsdx 9rvj 0lo

9

자신을 위해 더 많은 스왑을 만드십시오.

다음은 8G 스왑을 추가합니다.

dd if=/dev/zero of=/root/moreswap bs=1M count=8192
mkswap /root/moreswap
swapon /root/moreswap

여전히 느리지 만 (스왑 중) 실제로 부족하지 않아야합니다. 최신 버전의 Linux는 파일로 교체 할 수 있습니다. 요즘 스왑 파티션의 유일한 용도는 랩톱을 최대 절전 모드로 전환하는 것입니다.


1
이 메소드는 실제로 여기 스크립트로 구현되었습니다 . 스왑을 즉시 추가하는 데 매우 유용합니다.
Sergiy Kolodyazhnyy

7
스왑은 일반적으로 현명하지만 많은 양을 할당하면 OOM 킬러가 개입하여 자원 봉사자를 선택하기 전에 기계가 더 많이 쓰러 질 수 있습니다. "스왑으로 램을 두 배로 늘리는"것에 관한 오래된 역할은 오래 전부터 사라졌습니다. 개인적으로 ~ 1GB 이상의 스왑 총계를 할당하는 데 아무런 가치가 없습니다.
Criggie

5
ext4에 다음과 같은 작업을 할 수 있습니다 fallocate -l 8G /root/moreswap대신 dd어느 시스템이 대패가있는 동안 I / O 8GB의 작업을 수행 할 필요 방지 할 수 있습니다. 그러나 다른 파일 시스템에서는 작동하지 않습니다. 스왑 온은 쓰지 않은 익스텐트를 홀로 보는 XFS가 아닙니다. (이 xfs 메일 링리스트 토론진행 되지 않았다고 생각합니다 ). swapd디스크 공간을 절약하기 위해 스왑 파일을 생성 / 제거하는 데몬 도 참조하십시오 . 또한 askubuntu.com/questions/905668/…
Peter Cordes

1
@Criggie "개인적으로 ~ 1GB 이상의 스왑 합계를 할당해도 아무런 가치가 없습니다"-Firefox를 구축하려고 했습니까?
Dmitry Grigoryev

1
@Akiva 내가 마지막으로 확인했을 때 권장되는 빌드 구성은 16GB의 RAM이었습니다. 기본 실행 파일 ( xul.dll)은 약 50MB이므로 Linux 커널보다 약 10 배 무겁습니다.
Dmitry Grigoryev

5

짧은 통지로 여유 RAM을 얻는 한 가지 방법은 zram 을 사용 하여 압축 된 RAM 디스크를 만들고 스왑하는 것입니다. 절반 정도의 CPU를 사용하면 일반 스왑보다 훨씬 빠르며 웹 브라우저와 같은 많은 최신 RAM 호그로 압축률이 상당히 높습니다.

zram을 설치하고 구성했다고 가정하면 실행하면됩니다.

sudo service zramswap start

btrfs와 같은 모든 파일 시스템에서 작동합니까?
Akiva

1
@Akiva zram은 디스크를 절대 건드리지 않으므로 예라고 말할 것입니다.)
Dmitry Grigoryev

3

sudo swapoff -a스왑을 비활성화하여 시스템 메모리가 부족한 경우 커널이 가장 높은 점수를 가진 프로세스를 자동으로 종료시킵니다 . RAM이 많이 사용되어 스왑에 들어가서 영원히 멈추게하는 것보다 통제력이 떨어지면 죽이는 것을 알고 있다면 이것을 사용합니다. sudo swapon -a나중에 다시 활성화하는 데 사용하십시오 .

나중에 스왑 설정을 살펴볼 수 있습니다. 스왑이 루트 파티션과 동일한 디스크에있는 것처럼 들리므로 스왑을 수행 할 때 시스템 속도가 느려질 수 있으므로 가능하면 피하십시오. 또한 제 생각에 현대 시스템은 종종 너무 많은 스왑으로 구성됩니다. 32GiB RAM은 일반적으로 32GiB를 스왑 공간에 배치하려는 것처럼 기본적으로 32GiB 스왑이 할당됨을 의미합니다.


아, 방금 누군가가 어딘가에서 그 의견을 언급 한 것을 보았습니다.
sudo

3

또 다른 방법은이 명령을 통해 메모리 페이지 캐시를 비우는 것입니다.

echo 3 | sudo tee /proc/sys/vm/drop_caches

에서 kernel.org 문서 (강조는 추가) :

drop_caches

이를 쓰면 커널이 클린 캐시를 삭제하고 덴 트리 및 아이 노드와 같은 회수 가능한 슬래브 객체를 삭제합니다. 일단 삭제되면 메모리가 해제 됩니다.

페이지 캐시를 비우려면 : echo 1> / proc / sys / vm / drop_caches 회수 가능한 슬래브 객체 (덴 트리 및 inode 포함)를 비우려면 : echo 2> / proc / sys / vm / drop_caches 슬래브 객체 및 페이지 캐시를 비우려면 : echo 3> / proc / sys / vm / drop_caches

이것은 비파괴적인 작업 이며 더티 오브젝트를 해제하지 않습니다. 이 작업으로 사용 가능한 개체 수를 늘리기 위해 사용자는 / proc / sys / vm / drop_caches에 쓰기 전에`sync '를 실행할 수 있습니다. 이렇게하면 시스템에서 더티 오브젝트의 수가 최소화되고 더 많은 후보를 제거 할 수 있습니다.


흥미로운 ... 명령 논리를 설명 할까?
Akiva

1
@Akiva는 기본적으로 리눅스 커널이 RAM을 비우도록 지시합니다. 이것은 원인을 제거하지 못하여 문제가되는 프로세스를 죽이고 있으므로 Oli의 대답은 문제의 해결책입니다. 캐시를 삭제하면 시스템의 메모리 부족을 방지 할 수 있으므로 작동 중지를 방지 할 수 있으므로 실제 문제를 파악할 시간이 필요합니다. 이것은 아마도 스왑 파일을 만드는 것보다 약간 빠를 것입니다. 특히 SSD가 아닌 하드 드라이브를 사용하는 경우
Sergiy Kolodyazhnyy

7
캐시는 메모리를 채울 때 가장 먼저해야 할 일이므로 이것이 큰 도움이 될 것이라고는 생각하지 않습니다. 사실,이 명령이 커널 동작 디버깅이나 디스크 액세스 최적화 타이밍 이외의 실용적인 용도는 아니라고 생각합니다. 더 많은 성능이 필요한 시스템에서이 명령을 실행하지 않는 것이 좋습니다.
Score_Under

2
@Score_Under- "캐시는 메모리를 채울 때 가장 먼저해야 할 일"입니다 /proc/sys/vm/swappiness. 이는 의 설정에 따라 다릅니다 . swappiness를 0으로 설정하면 맞습니다. 기본 설정은 60입니다. 그러나 200으로 설정하면 가장 최근에 실행되는 프로세스 중 가장 적게 사용되는 페이지가됩니다. 특정한 경우이 명령 유용 할 수 있습니다. 그러나 swappiness를 0 (또는 일부 낮은 값, 20 또는 30)으로 설정하는 것이 더 일반적인 방법입니다.
Jules

3
@Score_Under이 명령은 kswapd버그가있는 오래된 커널에서 유용했습니다 (일부 사람들 은 cronjob을 만들 수도 있습니다). 그러나 당신 말이 맞습니다.이 질문에 도움이 될지 의심 스럽습니다.
Dmitry Grigoryev

1

"백그라운드에서 컴파일하는 중"이라고 말했습니다. 포 그라운드에서 무엇을하고 있습니까? Eclipse 또는 기타 리소스가 많은 IDE로 개발하는 경우 콘솔에서 모든 것이 올바르게 종료되었는지 확인하십시오.

개발 환경에서는 종종 개발중인 여러 프로세스를 시작할 수 있으며, 더 이상 관심이없는 경우에도 디버거에서 또는 제대로 완료되지 않은 경우에도 중단 될 수 있습니다. 개발자가주의를 기울이지 않으면 수 기가 바이트를 함께 사용하여 하루 동안 잊혀진 수십 개의 프로세스가 누적 될 수 있습니다.

IDE에서 종료해야하는 모든 것이 종료되었는지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.