当内存不足时终止最耗内存的进程

当内存不足时终止最耗内存的进程

有时我的 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% 的时间内,此脚本选择的进程可以及时干净地终止。

相关内容