有时我的 Linux 台式机、笔记本电脑或服务器会耗尽 RAM,因为我使用的实验性软件偶尔会尝试使用比我可用的更多的 RAM。发生这种情况时,系统和控制台会挂起几分钟,而 Linux 会在 RAM 和交换之间切换内存。似乎 Linux 正在尝试非常很难阻止任何程序被杀死,但就我而言,我只希望 Linux 继续杀死它,这样我就可以尽快恢复工作并重新运行它,而无需硬重启或等待几分钟。
是否有一个第三方程序可以在后台运行并实现以下逻辑?
when RAM usage is >98%:
kill the process using the most resident RAM
我试过了sudo sysctl vm.overcommit_memory=2
,但它并没有按照我认为的最佳情况运行。我不想在 RAM 不足时杀死无意中分配 1MB RAM 的小进程。我想杀死消耗 31.9GB RAM 的单个进程,因为显然是该进程有问题,而不是小进程。
另外,vm.overcommit_memory
这不是我想要的,因为vm.overcommit_ratio
对应于虚拟的记忆,不是居民内存,除以总物理内存。因此,分配 2GB 内存但不触及任何块(因此不存在于物理 RAM 中)的应用程序不应计入 overcommit_ratio。
答案1
我使用该库在 Python 3.6+ 中编写了一个快速实现psutil
。它似乎运行良好!它可能存在一些问题,但我会随着时间的推移对其进行调整。
import time
import psutil
percent_threshold = 0.95
def check_memory():
vm = psutil.virtual_memory()
percent = vm.active / vm.total
# Do we need to kill a process?
if percent > percent_threshold:
print(f"RAM usage is {percent}%")
# Search for process using the most resident memory
max_mem = 0
max_ps = None
for ps in psutil.process_iter():
mem = ps.memory_info().rss
if mem > max_mem:
max_ps = ps
max_mem = mem
# Kill process
cmd = " ".join(max_ps.cmdline())
print(f"Killing {cmd}")
print(f"using {max_mem / 2**20} MiB resident memory")
max_ps.terminate()
print("")
while True:
check_memory()
time.sleep(1.0)
terminate()
可以替换为kill()
以更快地终止程序,但如果阈值设置为 95%,终止速度就足够快了。在程序填满最后 5% 的时间内,此脚本选择的进程可以及时干净地终止。