시스템 메모리가 부족하더라도 우분투 동결 방지


24

때로는 처리를 위해 메모리에 유지하려는 거대한 데이터 덤프로 작업합니다. 때로는 프로그램에서 생성하는 메모리 양을 잘못 계산하거나 디버거가 사용 가능한 메모리를 초과하는 계수로 메모리 사용량을 곱합니다.

메모리가 부족한 프로세스를 시작할 때마다 이것은 정상적인 운영 체제에서 기대하는 것입니다. 사용 가능한 모든 메모리를 먹은 다음 필요하지 않은 메모리를 포기하도록 다른 비 필수 프로세스를 멋지게 요청하십시오. 스왑 쓰기.

우분투가 나를 위해하는 일은 다음과 같습니다. 모든 fre 메모리를 먹은 다음 운영 체제에 모든 필수 서비스 (그놈 세션, 터미널, 키보드)를 교환하도록 요청한 다음 전원 플러그를 뽑을 때까지 기다립니다.

두 가지 질문 :

  1. 운영 체제는 어떻게 사용자 입력을 듣지 않아도되는 것이 중요 할 수 있다고 가정 할 수 있습니까?
  2. 어리석은 프로세스가 시스템이 제공하는 것보다 더 많은 리소스를 소비하려고하더라도 우분투에게 필수 서비스를 교환하지 않고 항상 사용자 입력에 반응하도록 지시 할 수있는 방법은 무엇입니까?

얼마나 많은 RAM을 설치 했습니까? 스왑의 크기는 무엇입니까 (터미널에서 입력 swapon하여 확인하십시오)? 건배, Al
heynnema

3
16GB 램 및 16GB 스왑 그러나 이것이 핵심이 아닙니다.이 문제는 더 많은 메모리를 추가하여 해결할 수 없습니다.
클라 만

1
두 가지 중 하나를 시도하십시오. 1) swappiness설정을 10으로 변경하십시오 ( 예 : vm.swappiness = 10/etc/sysctl.conf). 이에 대한 자세한 내용은 스왑 피네스를 검색하십시오. 2) swappiness가 도움이되지 않는 경우 ... 원하지 않는 경우에도 ... swapfile의 크기를 1.5x16G로 늘리고 도움이되는지 확인하십시오. 계속 알려주세요. 건배, Al
heynnema

1
@Klamann 스왑을 추가해도 문제가 해결되지 않는다는 데 동의합니다. 모든 RAM + SWAP를 사용하는 프로그램이 중단되면 SWAP를 추가하면 불가피하게 지연됩니다.
WinEunuuchs2Unix

1
내가 말했듯이 @ WinEunuuchs2Unix 는 sysctl.conf에 추가vm.swappiness=10 해야합니다 . 숙련 된 사람은 sysctl.conf 파일을 편집하지 않고도 sysctl 명령을 즉시 사용하여 vm.swappiness = 10을 설정할 수 있습니다. Cheers, Al ps : OP가 응답하기를 기다립니다.
heynnema

답변:


5

여전히 문제에 대한 해결책이 없지만 다른 사람들에게 관심이있을 수있는 두 가지 해결 방법을 제공 할 수 있습니다.

1) 조기

즉 소비하는 특정 임계 값에 도달 할 때 가장 메모리 (또한 참조하는 프로세스 메모리 사용량을 감시하고 죽이는 서비스의 리눅스 커널의 OOM 킬러에 관한 질문)

작은 청크로 메모리를 무기한으로 요청하는 데모 프로세스로 테스트했습니다. 첫 인상은 다음과 같습니다. 불량 프로세스를 시작하면 모든 RAM이 빠르게 소모됩니다. 그런 다음 스와핑이 시작되고 시스템이 응답하지 않게됩니다. 몇 초 후에 시스템이 다시 온라인 상태가됩니다. earlyoom 로그는 메모리와 스왑 사용량이 모두 90 %에 도달 한 후 메모리 사용 프로세스를 종료했음을 나타냅니다.

스와핑이 시작되고 프로세스가 종료 된 후에도 여전히 성가신 지연이 발생하지만 다른 프로세스의 일부는 요청 될 때까지 스왑 상태를 유지하지만 시작입니다.

2) 스왑을 비활성화하십시오.

나는 이것이 논란여지 가있는 주제 라는 것을 알고 있지만 프로세스가 모든 메모리를 소모하려고 시도하는 때때로 발생할 수있는 데스크탑 시스템 및 특히 개발 시스템의 목적을 위해 의미가 있습니다. 스왑이 없으면 OOM 킬러가 작동합니다. 의도 한대로. 메모리가 부족하면 가장 적합한 프로세스를 찾아서 제거합니다. 지연이없고 지연이 없습니다.

현재 세션에 대한 스왑을 비활성화 sudo swapoff -a하거나 변경 내용을 영구적으로 만들 수 있습니다 .


문제에 대한 올바른 해결책은 메인 메모리가 고갈되면 시스템이 응답을 유지하고 내일이 없을 때처럼 메모리를 교체하기 시작하지만 곧 일어나지 않는 것입니다.


1
스왑을 비활성화했으며 시스템이 메모리 부족 (<100MB)에서 정지 상태로 바로 이동합니다. OOM 킬러가 실제로 활성화되어 있는지 어떻게 알 수 있습니까?
마이클

0

다음 두 가지 중 하나를 시도하십시오.

1) swappiness 설정을 기본 설정 60에서 10으로 변경하십시오. , vm.swappiness = 10 을 /etc/sysctl.conf에 추가하고 (터미널에 sudo gedit /etc/sysctl.conf), 시스템을 재부팅하십시오. 이에 대한 자세한 내용은 스왑 피네스를 검색하십시오.

2) swappiness가 도움이되지 않는 경우 ... 원하지는 않지만 .... 스왑 파일의 크기를 1.5x16G로 늘리고 도움이되는지 확인하십시오.

계속 알려주세요. 건배, 알


몇 초마다 OS를 재부팅하면 실제로 성가신 일부 테스트를 실행하도록 VM을 설정했습니다. 우분투 16.04, 2 기가 바이트 램, 3 기가 바이트 스왑, 20 기가 바이트 디스크. 그런 다음 많은 메모리를 소비하는 스크립트를 실행했습니다. 기본 swappiness (60)를 사용하면 시스템이 정지되고 몇 분 후에 복구 시간이 허용되지 않기 때문에 시스템을 종료했습니다. swappiness 10을 사용하면 시스템이 몇 초 동안 정지 된 다음 입력을 받아들이지 만 프로세스를 시작할 수 없습니다 (예 : top메모리 호그 종료). 1 분 정도 지나면 프로세스가 종료됩니다. 완벽하지는 않지만 점점 가까워지고 있습니다.
클라 만

우리에게 계속 알려줘. VM은 실제로 작동하는 실제 OS를 모방하지는 않지만 설정을 사용하여 재생할 수 있습니다. swappiness가 문제를 해결하는 데 도움이 될지 궁금합니다. 건배, Al
heynnema

오 굿. 진행! 교환에 대해 조금 읽어보십시오. 약간의 값으로 연주 할 수 있습니다. 건배, Al
heynnema

시스템이 정지 될 때 얼마나 많은 스왑이 사용 되었습니까? 건배, Al
heynnema

2
왜, 그게 요점이 뭐야? 메모리를 더 많이 빨아 들이면 시스템이 멈추는 것을 막을 수 있습니다.
클라 만

0

비슷한 문제를 해결했습니다. 내 경험이 당신에게 적합한 지 모르겠습니다 ...

최근에는 USB에서 부팅하는 루프백 LVM 장치에 Linux를 설치하는 방법에 대한 가이드를 발표했습니다 (따라서 내부 디스크에 grub을 설치하지 않고 원본으로 남겨 두십시오). 다음은 가이드입니다 : https://github.com/DareDevil73/linux-on-loopback-usb .

그런 다음 높은 메모리로드로 인해 동결 문제가 발생하여 스왑 공간 사용량이 비정상적으로 나타났습니다 (모든 RAM이 소모되었으며 스왑 사용량이 거의 0에 가깝습니다). 분명히 LVM 스왑 파티션이 마운트되어 제대로 작동하지만 커널이 왜 예상대로 커널을 사용하지 않았는지 알 수 없습니다.

대체 솔루션을 시도했습니다. 스왑 루프백 파일 (LVM 아님)을 만들었고 정지가 사라졌습니다. 이제 스왑 파일이 그대로 사용되며 OS가 멈추지 않습니다!

자세한 정보 는 https://github.com/DareDevil73/linux-on-loopback-usb#known-issues참조 하십시오.


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