![如何判断一个进程是否会出现内存不足的情况?](https://linux22.com/image/196532/%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%AD%E4%B8%80%E4%B8%AA%E8%BF%9B%E7%A8%8B%E6%98%AF%E5%90%A6%E4%BC%9A%E5%87%BA%E7%8E%B0%E5%86%85%E5%AD%98%E4%B8%8D%E8%B6%B3%E7%9A%84%E6%83%85%E5%86%B5%EF%BC%9F.png)
测试套件有几个测试,这将消耗相当多的内存(11GB)左右。在我的开发人员机器上运行这些测试时,这通常不是问题,但在 CI 上下文中,测试套件通常在没有那么多可用 RAM 的机器上执行。
当 CI 主机缺乏足够的内存时,我的测试套件会被 OOMkiller 停止,从而失败。
我不想让整个测试套件完全失败,而是想限制基于主机特性运行的测试。
这个想法是使用 valgrind 的massif
工具来获取给定测试将消耗多少内存的近似值,然后检查主机上有多少可用内存,并跳过那些超出此内存的测试。
然而,我有一种直觉,找出“有多少可用内存”是一项不简单的任务。
- 我无法控制 CI 将在哪些运行器上执行(并且可能有不同的运行器具有不同数量的可用 RAM)
- 对于跑步者,我不是
root
,因此几乎/无法控制OOM杀手本身 - 运行者很可能只是在某个随机云提供商上运行的 docker 容器(在这种情况下谁控制 OOMkiller?容器?主机?)
仅仅解析/proc/meminfo
似乎有点太天真了
- 这会给我容器内的可用内存吗?
MemAvailable
似乎是一个不错的选择,但即使在我的 32GB RAM 桌面上,当前也仅显示 10GB 可用内存,而且我仍然可以运行一个消耗资源的进程11GB内存(afactMemAvailable
忽略可用交换空间)
显然,系统是动态的,虽然当我开始测试时可能有足够的可用内存,但其他进程可能在测试运行时消耗内存,所以我仍然可能会内存不足
那么:我应该如何解决这个问题呢?有没有办法查询 OOMkiller 的内存限额?