RAM과 스왑 공간이 모두 부족하여 백그라운드에서 소프트웨어를 컴파일 할 때 자주 발생하며 갑자기 모든 것이 느려지기 시작하고 [아무것도하지 않으면] 결국 정지됩니다.
이 질문은 그놈 터미널을 열고 내 이력을 검색하고 하나의 sudo
명령을 실행할 수있는 충분한 시간과 리소스가 있다고 가정합니다 .
하드 재부팅이나 재부팅을하지 않아도되는 명령은 무엇입니까?
make
시도하십시오 -j4
.
RAM과 스왑 공간이 모두 부족하여 백그라운드에서 소프트웨어를 컴파일 할 때 자주 발생하며 갑자기 모든 것이 느려지기 시작하고 [아무것도하지 않으면] 결국 정지됩니다.
이 질문은 그놈 터미널을 열고 내 이력을 검색하고 하나의 sudo
명령을 실행할 수있는 충분한 시간과 리소스가 있다고 가정합니다 .
하드 재부팅이나 재부팅을하지 않아도되는 명령은 무엇입니까?
make
시도하십시오 -j4
.
답변:
내 경험상 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
하거나 이와 유사한 것으로 축소 될 수 있습니다
emptyram
단지 펀치 인하는 것보다 스크립트를 작성했다는 것을 기억하기가 더 어렵다는 것을 알게 되었습니다 killall -9 firefox
.
Magic System Request Key가 활성화 된 시스템에서 Alt + System Request+ f(키보드에 표시되어 있지 않은 경우 System Request종종 Print Screen키에 있음)를 누르면 커널의 메모리 부족 킬러 (oomkiller)가 수동으로 호출되어 최악의 공격 프로세스를 선택합니다. 메모리 사용량과 그것을 죽입니다. 설명했던 것보다 시간이 덜 걸리고 시스템이 방금 시작하려고하거나 이미 시작한 경우이 작업을 수행 할 수 있습니다.이 경우 종료 된 항목을 정확히 신경 쓰지 않을 것입니다. 사용 가능한 시스템. 때때로 이것은 X를 죽일 수 있지만 요즘 대부분은 이전보다 나쁜 프로세스를 선택하는 것이 훨씬 낫습니다.
kernel.sysrq
에 1
또는에서 올바른 비트를 포함하여 다수 /etc/sysctl.d/10-magic-sysrq.conf
.
다른 답변과 달리이 작업을 수행하는 동안 스왑을 비활성화하는 것이 좋습니다. 스왑은 시스템을 예측 가능한 방식으로 실행하고 디스크 캐시 공간을 확보하기 위해 사용하지 않는 페이지를 제거하여 디스크에 액세스하는 응용 프로그램의 처리량을 늘리는 데 종종 사용되지만,이 경우 시스템 속도가 느려지는 것처럼 들립니다. 너무 많이 사용되는 메모리가 강제로 스왑되도록 제거되어 사용할 수없는 수준으로 전환되었습니다.
이 작업을 수행하는 동안 스왑을 모두 비활성화하는 것이 좋습니다. 따라서 메모리 부족 킬러는 RAM이 가득 차 자마자 작동합니다.
대체 솔루션 :
zswap
커널에서 활성화 해보십시오 . 이렇게하면 스왑으로 전송되기 전에 페이지가 압축되어 기계 속도를 높일 수있는 충분한 공간을 제공 할 수 있습니다. 반면에, 여분의 압축 / 압축 해제로 인해 방해가 될 수 있습니다.tcc
하면 컴파일 된 제품에 약간의 런타임 성능 저하를 희생시키면서 더 가벼운 컴파일러 (예 :)로 프로젝트를 컴파일 할 수 있습니다 . 개발 / 디버깅 목적으로이 작업을 수행하는 경우 일반적으로 허용됩니다.sudo swapoff -a
바인드 상태 일 때 달리기 를하면 절약 할 수 있다고 덧붙이고 싶습니다 . 스왑 공간의 추가 사용을 즉시 중지합니다. 즉, 다음 순간에 OOM 킬러를 호출하고 기계를 작동 상태로 만들어야합니다. sudo swapoff -a
또한 메모리 누수를 디버깅하거나 파이어 폭스를 컴파일 할 때 훌륭한 예방 조치입니다. 일반적으로 스왑은 약간 유용하지만 (예 : 최대 절전 모드 또는 실제로 필요없는 항목을 스왑하는 경우) 실제로 메모리를 사용하는 경우 고정이 더 나빠집니다.
다음 명령을 사용하여 (필요한 경우 반복적으로) 시스템에서 가장 많은 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
.
리소스 소비 명령을 실행하기 전에 setrlimit (2) 시스템 호출을 사용할 수 있습니다 . 아마도 ulimit
bash 쉘 (또는 limit
zsh에 내장)을 -v
for 와 함께 사용할 수 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) ... 참조).
이것은 백그라운드에서 소프트웨어를 컴파일 할 때 나 에게 자주 발생 합니다.
이 경우 "killall -9 make"(또는 작성하지 않은 경우 컴파일 관리에 사용하는 모든 것)와 같은 것이 있습니다. 이것은 컴파일 진행을 더 이상 멈추게하고, 시작된 모든 컴파일러 프로세스를 SIGHUP 할 것입니다 (필요하게도 멈추게 함) 로. 그리고 웹 브라우저, X 세션 또는 일부 프로세스 대신 문제의 실제 원인을 임의로 죽이기 때문에 당시 시스템에서 수행중인 다른 작업을 방해하지 않습니다.
자신을 위해 더 많은 스왑을 만드십시오.
다음은 8G 스왑을 추가합니다.
dd if=/dev/zero of=/root/moreswap bs=1M count=8192
mkswap /root/moreswap
swapon /root/moreswap
여전히 느리지 만 (스왑 중) 실제로 부족하지 않아야합니다. 최신 버전의 Linux는 파일로 교체 할 수 있습니다. 요즘 스왑 파티션의 유일한 용도는 랩톱을 최대 절전 모드로 전환하는 것입니다.
fallocate -l 8G /root/moreswap
대신 dd
어느 시스템이 대패가있는 동안 I / O 8GB의 작업을 수행 할 필요 방지 할 수 있습니다. 그러나 다른 파일 시스템에서는 작동하지 않습니다. 스왑 온은 쓰지 않은 익스텐트를 홀로 보는 XFS가 아닙니다. (이 xfs 메일 링리스트 토론 이 진행 되지 않았다고 생각합니다 ). swapd
디스크 공간을 절약하기 위해 스왑 파일을 생성 / 제거하는 데몬 도 참조하십시오 . 또한 askubuntu.com/questions/905668/…
xul.dll
)은 약 50MB이므로 Linux 커널보다 약 10 배 무겁습니다.
짧은 통지로 여유 RAM을 얻는 한 가지 방법은 zram 을 사용 하여 압축 된 RAM 디스크를 만들고 스왑하는 것입니다. 절반 정도의 CPU를 사용하면 일반 스왑보다 훨씬 빠르며 웹 브라우저와 같은 많은 최신 RAM 호그로 압축률이 상당히 높습니다.
zram을 설치하고 구성했다고 가정하면 실행하면됩니다.
sudo service zramswap start
sudo swapoff -a
스왑을 비활성화하여 시스템 메모리가 부족한 경우 커널이 가장 높은 점수를 가진 프로세스를 자동으로 종료시킵니다 . RAM이 많이 사용되어 스왑에 들어가서 영원히 멈추게하는 것보다 통제력이 떨어지면 죽이는 것을 알고 있다면 이것을 사용합니다. sudo swapon -a
나중에 다시 활성화하는 데 사용하십시오 .
나중에 스왑 설정을 살펴볼 수 있습니다. 스왑이 루트 파티션과 동일한 디스크에있는 것처럼 들리므로 스왑을 수행 할 때 시스템 속도가 느려질 수 있으므로 가능하면 피하십시오. 또한 제 생각에 현대 시스템은 종종 너무 많은 스왑으로 구성됩니다. 32GiB RAM은 일반적으로 32GiB를 스왑 공간에 배치하려는 것처럼 기본적으로 32GiB 스왑이 할당됨을 의미합니다.
또 다른 방법은이 명령을 통해 메모리 페이지 캐시를 비우는 것입니다.
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 '를 실행할 수 있습니다. 이렇게하면 시스템에서 더티 오브젝트의 수가 최소화되고 더 많은 후보를 제거 할 수 있습니다.
/proc/sys/vm/swappiness
. 이는 의 설정에 따라 다릅니다 . swappiness를 0으로 설정하면 맞습니다. 기본 설정은 60입니다. 그러나 200으로 설정하면 가장 최근에 실행되는 프로세스 중 가장 적게 사용되는 페이지가됩니다. 특정한 경우이 명령 이 유용 할 수 있습니다. 그러나 swappiness를 0 (또는 일부 낮은 값, 20 또는 30)으로 설정하는 것이 더 일반적인 방법입니다.
kswapd
버그가있는 오래된 커널에서 유용했습니다 (일부 사람들 은 cronjob을 만들 수도 있습니다). 그러나 당신 말이 맞습니다.이 질문에 도움이 될지 의심 스럽습니다.
"백그라운드에서 컴파일하는 중"이라고 말했습니다. 포 그라운드에서 무엇을하고 있습니까? Eclipse 또는 기타 리소스가 많은 IDE로 개발하는 경우 콘솔에서 모든 것이 올바르게 종료되었는지 확인하십시오.
개발 환경에서는 종종 개발중인 여러 프로세스를 시작할 수 있으며, 더 이상 관심이없는 경우에도 디버거에서 또는 제대로 완료되지 않은 경우에도 중단 될 수 있습니다. 개발자가주의를 기울이지 않으면 수 기가 바이트를 함께 사용하여 하루 동안 잊혀진 수십 개의 프로세스가 누적 될 수 있습니다.
IDE에서 종료해야하는 모든 것이 종료되었는지 확인하십시오.