거의 가득 찬 RAM에서 컴퓨터 정지, 디스크 캐시 문제 작업하면 문제가

내가 생각하는 문제는 스레드 와 다소 유사합니다 .

스왑을 활성화 또는 비활성화했는지 여부는 실제로 사용 된 RAM 양이 최대에 가까워지고 디스크 캐시를위한 공간이 거의 없을 때마다 시스템이 완전히 응답하지 않게됩니다.

디스크는 격렬하게 회전하며 때로는 10-30 분 동안 기다린 후에는 고정이 풀리지 않으며 때로는 타당하지 않습니다. 때로는 빨리 행동하면 천천히 콘솔을 열고 브라우저와 같은 램 먹는 응용 프로그램을 죽일 수 있으며 시스템이 거의 즉시 정지됩니다.

이 문제로 인해 스왑에서 아무것도 볼 수 없으며 때로는 몇 MB 만 있고이 문제가 나타난 직후에 있습니다. 교육을받지 않은 추측은 디스크 캐시에 너무 욕심이 많거나 메모리 관리가 관대하다는 것입니다. 따라서 메모리가 필요할 때 메모리가 빨리 풀리지 않고 시스템이 고갈됩니다.

디스크 캐시에로드 된 이후에 시스템이 충분히 빨리 언로드 할 수없는 lagrge 파일 (500MB +)을 사용하여 작업하면 문제가 실제로 빠르게 달성 될 수 있습니다.

어떤 도움이나 아이디어라도 대단히 감사하겠습니다.

지금은 컴퓨터가 멈출 수 있고 항상 다시 시작해야 할 때 끊임없이 두려움에 따라 살아야합니다. 실제로 램이 부족하면 broser와 같은 사용자 공간 응용 프로그램을 죽이는 것이 훨씬 좋습니다. 가급적이면 먼저 죽일 마크를 표시 할 수 있다면)

이 상황에서 미스터리가 바뀌지 않는 이유는 무엇입니까?

업데이트 : 한동안 멈추지 않았지만 이제 여러 번 다시 발생했습니다. 나는 항상 화면에 램 모니터를 유지하고 있으며 중단이 발생해도 여전히 ~ 30 %의 여유 공간을 보여줍니다 (디스크 캐시에 사용됨). 추가 증상 : 비디오 (VLC 플레이어)를 시청할 때 몇 초 후에 소리가 먼저 멈춰지고 이미지가 멈 춥니 다. 소리가 멈추는 동안 나는 여전히 PC를 제어 할 수 있지만 이미지가 멈 추면 더 이상 마우스를 움직일 수 없으므로 잠시 기다린 후에 다시 시작했습니다. Btw, 이것은 비디오를보기 시작했을 때 발생하지 않았지만 (20 분)에 시간이 있었고 브라우저와 oowrite가 항상 두 번째 화면에서 열려 있었지만 그 당시에는 다른 일을하지 않았습니다. 기본적으로 무언가는 한 시점에서 발생하기로 결정하고 시스템을 정지시킵니다.

의견의 요청에 따라 교수형 직후 dmesg를 실행했습니다. 내가 지금 여기있다, 아무것도 이상한 알 didnt는하지만,보고 무엇을 몰랐어요 :
https://docs.google.com/document/d/1iQih0Ee2DwsGd3VuQZu0bPbg0JGjSOCRZhu0B05CMYs/edit?hl=en_US&authkey=CPzF7bcC



답변

이 문제를 해결하려면 다음 설정을 총 실제 RAM의 약 5 % -6 %로 컴퓨터의 코어 수로 나눈 값으로 설정해야합니다.

sysctl -w vm.min_free_kbytes=65536

이것은 코어 당 설정이므로 2GB RAM과 2 개의 코어가있는 경우 1GB의 6 % 만 계산하고 안전을 위해 약간만 추가했습니다.

이로 인해 컴퓨터는이 양의 RAM을 사용 가능하게 유지해야하므로 디스크 파일을 캐시하는 기능이 제한됩니다. 물론 여전히 캐시를 시도하고 즉시 스왑 아웃하려고하므로 스왑을 제한해야합니다.

sysctl -w vm.swappiness=5

(100 = 가능한 한 자주 교환, 0 = 필요한 경우에만 교환)

결과적으로 리눅스는 더 이상 무작위로 약 1GB의 전체 동영상 파일을 램으로로드하지 않고 시스템을 죽이는 것을 결정하지 않습니다.

이제 메모리 부족 현상을 피할 수있는 예약 된 공간이 충분 해 문제가되었습니다 (이전처럼 더 이상 정지가 없는지 확인).

하루 동안 테스트 한 후-잠금이 사라지면 물건이 더 자주 캐시되기 때문에 사소한 속도 저하가 발생하지만 몇 시간마다 컴퓨터를 다시 시작할 필요가 없으면 그와 함께 살 수 있습니다.

여기서 교훈은-기본 메모리 관리는 유스 케이스 중 하나이며 일부 사람들이 달리 제안하려고하더라도 최상의 것은 아닙니다. 홈 엔터테인먼트 우분투는 서버와 다르게 구성해야합니다.


이러한 설정을 다음 /etc/sysctl.conf과 같이 추가하여 영구적으로 설정하려고 할 수 있습니다 .

vm.swappiness=5
vm.min_free_kbytes=65536


답변

이것은 우분투 14.04의 새로운 설치에서 나에게 일어났다.

필자의 경우 언급 한 sysctl 문제와 관련이 없습니다.

대신, 문제는 설치 중 스왑 파티션의 UUID가 설치 후와 다르다는 것입니다. 따라서 스왑이 활성화되지 않았으며 몇 시간 후에 컴퓨터가 잠겼습니다.

솔루션은 스왑 파티션의 현재 UUID와를 확인했다

sudo blkid

다음 sudo nano /etc/fstabBLKID에 의해보고 된 하나 잘못된 스왑의 UUID 값을 대체합니다.

변경 사항에 영향을주는 간단한 재부팅 및 voila.


답변

이 질문이 오래되었다는 것을 알고 있지만 Acer C720 크롬 북의 Ubuntu (Chrubuntu) 14.04에서이 문제가 발생했습니다. Krišjānis Nesenbergs 솔루션을 시도했지만 다소 효과가 있었지만 여전히 충돌했습니다.

마침내 SSD에서 물리적 스왑을 사용하는 대신 zram을 설치하여 작동하는 솔루션을 찾았습니다. 그것을 설치하려면 다음 과 같은 지침을 따르 십시오 .

sudo apt-get install zram-config

그 후 /etc/init/zram-config.conf21 행에서 수정하여 zram 스왑의 크기를 구성 할 수있었습니다 .

20: # Calculate the memory to user for zram (1/2 of ram)
21: mem=$(((totalmem / 2 / ${NRDEVICES}) * 1024))

나는 zram 크기를 내가 가지고있는 ram의 크기와 동일한 크기로 만들기 위해 2를 1로 바꿨습니다. 그렇게 한 후에 더 이상 멈추거나 시스템이 응답하지 않았습니다.


답변

아무것도 나를 위해 일하지 않았다!!

그래서 메모리 사용을 모니터링하는 스크립트를 작성했습니다. 메모리 소비가 임계 값을 늘리면 먼저 RAM 캐시를 지우려고 시도합니다. 스크립트에서이 임계 값을 구성 할 수 있습니다. 메모리 소비가 임계 값 아래로 떨어지지 않으면 메모리 소비가 임계 값 아래가 될 때까지 메모리 소비가 감소하는 순서로 프로세스를 강제 종료합니다. 기본적으로 96 %로 설정했습니다. 스크립트에서 변수 RAM_USAGE_THRESHOLD의 값을 변경하여 구성 할 수 있습니다.

높은 메모리를 소비하는 프로세스를 죽이는 것이 완벽한 솔루션은 아니지만 모든 작업을 잃지 않고 하나의 응용 프로그램을 종료하는 것이 좋습니다! RAM 사용량이 임계 값을 늘리면 스크립트에서 데스크탑 알림을 보냅니다. 또한 프로세스가 종료되면 알려줍니다.

#!/usr/bin/env python
import psutil, time
import tkinter as tk
from subprocess import Popen, PIPE
import tkinter
from tkinter import messagebox
root = tkinter.Tk()
root.withdraw()

RAM_USAGE_THRESHOLD = 96
MAX_NUM_PROCESS_KILL = 100

def main():
    if psutil.virtual_memory().percent >= RAM_USAGE_THRESHOLD:
        # Clear RAM cache
        mem_warn = "Memory usage critical: {}%\nClearing RAM Cache".\
            format(psutil.virtual_memory().percent)
        print(mem_warn)
        Popen("notify-send \"{}\"".format(mem_warn), shell=True)
        print("Clearing RAM Cache")
        print(Popen('echo 1 > /proc/sys/vm/drop_caches',
                    stdout=PIPE, stderr=PIPE,
                    shell=True).communicate())
        post_cache_mssg = "Memory usage after clearing RAM cache: {}%".format(
                            psutil.virtual_memory().percent)
        Popen("notify-send \"{}\"".format(post_cache_mssg), shell=True)
        print(post_cache_mssg)

        if psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD:
            print("Clearing RAM cache saved the day")
            return
        # Kill top C{MAX_NUM_PROCESS_KILL} highest memory consuming processes.
        ps_killed_notify = ""
        for i, ps in enumerate(sorted(psutil.process_iter(),
                                      key=lambda x: x.memory_percent(),
                                      reverse=True)):
            # Do not kill root
            if ps.pid == 1:
                continue
            elif (i > MAX_NUM_PROCESS_KILL) or \
                    (psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD):
                messagebox.showwarning('Killed proccess - save_hang',
                                       ps_killed_notify)
                Popen("notify-send \"{}\"".format(ps_killed_notify), shell=True)
                return
            else:
                try:
                    ps_killed_mssg = "Killed {} {} ({}) which was consuming {" \
                                     "} % memory (memory usage={})". \
                        format(i, ps.name(), ps.pid, ps.memory_percent(),
                               psutil.virtual_memory().percent)
                    ps.kill()
                    time.sleep(1)
                    ps_killed_mssg += "Current memory usage={}".\
                        format(psutil.virtual_memory().percent)
                    print(ps_killed_mssg)
                    ps_killed_notify += ps_killed_mssg + "\n"
                except Exception as err:
                    print("Error while killing {}: {}".format(ps.pid, err))
    else:
        print("Memory usage = " + str(psutil.virtual_memory().percent))
    root.update()


if __name__ == "__main__":
    while True:
        try:
            main()
        except Exception as err:
            print(err)
        time.sleep(1)

save_hang.py 파일에 코드를 저장하십시오. 다음과 같이 스크립트를 실행하십시오.

sudo python save_hang.py

이 스크립트는 Python 3에만 호환되며 tkinter 패키지를 설치해야합니다. 다음과 같이 설치할 수 있습니다.

sudo apt-get install python3-tk

도움이 되었기를 바랍니다…


답변

내 생각에 당신이 vm.swappiness매우 낮은 값으로 설정 하면 커널이 너무 늦게 교환되어 시스템이 작동하기에 RAM이 너무 낮아집니다.

다음을 실행하여 현재 swappiness 설정을 표시 할 수 있습니다.

sysctl vm.swappiness

기본적으로이 값은 60으로 설정되어 있습니다. Ubuntu Wiki 는이 값을 10으로 설정하는 것이 좋지만 더 높은 값으로 설정하는 것이 좋습니다. 다음을 실행하여 변경할 수 있습니다.

sudo sysctl vm.swappiness=10

이것은 현재 세션에 대해서만 변경 되며 , 영구적으로 만들 vm.swappiness = 10려면 /etc/sysctl.conf파일 에 추가해야 합니다.

디스크 속도가 느리면 새 디스크를 구입하십시오.


답변

나는이 문제로 오랫동안 어려움을 겪었지만 지금은 내 노트북에서 해결 된 것 같습니다.

다른 답변이 당신에게 도움이되지 않으면 (내가 대부분 시도했습니다) 컴퓨터 교체가 시작될 때 RAM에 더 많은 공간을 확보하기 위해 min_free_kbytes 와 함께 사용 하십시오 (빈 RAM 에서이 최소값에 도달하기 직전에).

16GB RAM이 있지만 나중에 메모리가 가득 차서 일부 항목이 스왑 될 때까지 10-30 분 동안 응답이 중지되었습니다.

적어도 나를 위해 min_free_kbytes 값을 권장 값보다 높게 설정 하면 스왑 프로세스가 훨씬 빨라집니다.

16GB RAM의 경우 다음을 시도하십시오.

vm.min_free_kbytes=500000

이 값을 설정하려면 다른 답변을 보거나 Google 🙂


답변

나는 작은 ext4 스토리지 파티션과 하드 드라이브의 스왑 파일을 사용하여 라이브 Ubuntu SD 카드에서 랩톱 중 하나를 지속적으로 실행합니다. 거의 모든 RAM을 사용하고 swappiness 값이 너무 낮을 때 (때로는 잡음이 있기 때문에 하드 드라이브를 완전히 끄는 것을 선호합니다), Linux 성능은 나를 위해 절벽에서 떨어지는 경향이 있습니다. Firefox를 종료하려면 TTY1이 15 분이 걸립니다.

/proc/sys/vm/vfs_cache_pressure기본값 100에서 6000 값으로 올리면 이를 방지하는 데 도움이됩니다. 그러나 커널 문서는 그렇게하지 말라고 경고합니다.

Increasing vfs_cache_pressure significantly beyond 100 may have negative
performance impact. Reclaim code needs to take various locks to find freeable
directory and inode objects. With vfs_cache_pressure=1000, it will look for
ten times more freeable objects than there are.

나는 이것이 일의 부작용을 완전히 확신하지 못하므로 이것을 조심스럽게해야합니다.