아무것도 나를 위해 일하지 않았다!!
그래서 메모리 사용을 모니터링하는 스크립트를 작성했습니다. 메모리 소비가 임계 값을 늘리면 먼저 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
도움이 되었기를 바랍니다...