You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免OOM临近状态下的高延迟?附Linux无Swap测试用例

解决无Swap Linux系统下高优先级进程被低优先级进程拖慢的问题

这个问题的核心在于无Swap环境下,系统接近OOM时,内核会陷入高强度的内存回收工作——kswapd线程疯狂扫描内存、回收页缓存,同时进程会因为内存分配失败进入不可中断睡眠(D状态),这些内核操作的优先级极高,哪怕你把用户态进程调到-19的高优先级,也会被内存压力相关的内核工作抢占CPU时间,导致延迟。

下面是几个可行的解决方案,按从根源到辅助的顺序排列:

1. 用Cgroups限制低优先级进程的内存使用(最推荐)

直接从源头避免系统进入OOM临近状态,给普通用户的低优先级进程组设置内存上限,让它们无法吃光系统内存。

  • 用systemd快速给普通用户shell设置内存限制:
    # 普通用户执行,启动一个内存上限为500M的shell,后续所有进程都受此限制
    systemd-run --user --scope -p MemoryMax=500M bash
    
  • 用Cgroup v2手动配置(适合需要长期生效的场景):
    # root用户创建内存限制组
    cgcreate -g memory:/lowmem_processes
    # 设置内存上限为1G(根据你的系统总内存调整)
    cgset -r memory.max=1G lowmem_processes
    # 让普通用户的进程在这个组里运行
    cgexec -g memory:lowmem_processes -u your_username bash
    

这样普通用户的进程最多占用指定内存,不会触发全局内存压力,高优先级进程自然不会被拖慢。

2. 调整OOM分数,让高优先级进程更“安全”

通过oom_score_adj控制OOM killer的选择优先级,确保内存耗尽时先杀掉低优先级进程,而不是让系统长时间处于内存紧张状态。

  • 给你的高优先级root进程设置最低OOM分数(几乎不会被OOM killer选中):
    # 替换pid为你的高优先级进程PID
    echo -1000 > /proc/[pid]/oom_score_adj
    
  • 给普通用户的低优先级进程设置最高OOM分数(优先被清理):
    # 替换pid为普通用户进程PID
    echo 1000 > /proc/[pid]/oom_score_adj
    

这个方法不能阻止内存压力,但能让系统在OOM前快速清理低优先级进程,减少高优先级进程被阻塞的时间。

3. 启用Early OOM Killer,提前干预

使用earlyoom工具,它会在系统接近OOM(比如可用内存低于5%)时就主动杀掉占用内存最多的低优先级进程,避免内核进入疯狂回收内存的状态。

  • 安装并启用(以Debian/Ubuntu为例):
    sudo apt install earlyoom
    sudo systemctl enable --now earlyoom
    
  • 可以调整配置文件/etc/default/earlyoom,设置触发阈值,比如:
    EARLYOOM_ARGS="-r 5 -s 5"  # 可用内存低于5%或Swap低于5%时触发(这里Swap为0,只看内存)
    

Early OOM能在系统陷入严重内存压力前就解决问题,比内核自带的OOM killer反应更快。

4. 给高优先级进程设置实时调度类(谨慎使用)

如果前面的方法还不够,可以把高优先级进程设置为实时调度类,它的优先级会高于所有普通进程(包括内核的kswapd,不过kswapd是内核线程,优先级也很高),但要注意:实时进程如果占用CPU不释放,会导致系统无响应。

# root用户执行,将进程设置为FIFO实时调度类,优先级99(最高)
chrt -f 99 date

这个方法是最后的手段,只适合短周期、低CPU占用的进程(比如你的每秒date命令)。


内容的提问来源于stack exchange,提问作者Mikko Rantalainen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:34:44