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

大共享内存分配时系统卡顿,疑与高IOPS AIO NVMe读取相关

问题分析与解决方案

卡顿原因

  1. 内存规整(Compaction)的资源竞争
    反复分配释放不同大小的共享内存会导致系统内存碎片化严重,当分配100GB级别的大段共享内存时,内核需要触发内存规整操作来整理出连续的物理页框。这个过程需要扫描大量内存页,而后台的4K随机AIO读操作会持续占用CPU和内存总线带宽,直接拉长了内存规整的耗时,引发系统卡顿。

  2. O_DIRECT的隐性内存开销
    虽然O_DIRECT绕过了文件系统页缓存,但NVMe的AIO操作依赖DMA缓冲区(同样是物理内存),且AIO的提交/完成会占用内核工作线程(kworker)。当内存分配触发内核内存管理操作时,这些kworker与内存管理线程会争抢CPU时间片,进一步放大调度延迟,导致系统响应变慢。

  3. 多进程内存分配的叠加压力
    多个进程独立执行大内存分配操作,会让内核内存管理模块同时处理多个高负载请求,加上AIO的持续IO压力,系统调度器无法及时响应其他任务,最终表现为全局卡顿。

解决方向

  • 使用大页技术减少碎片化
    开启透明大页(THP):执行echo always > /sys/kernel/mm/transparent_hugepage/enabled,让内核自动为大内存分配使用2MB/1GB的大页,减少内存碎片化和规整需求。如果THP的自动行为不符合预期,也可以显式使用/dev/hugepages分配大页内存。

  • 调整内存规整参数
    修改/sys/kernel/mm/compaction/下的参数:比如将compact_unevictable_allowed设为0,避免内核尝试规整不可回收的内存页,减少规整操作的扫描范围;或者降低compaction_proactiveness,减少主动规整的频率。

  • 优化AIO实现
    用io_uring替代传统AIO:io_uring通过共享环形队列减少内核用户态切换,降低kworker线程的开销,能有效减少与内存分配操作的资源竞争。同时可以适当降低AIO队列深度,避免过度占用CPU和内存带宽。

  • 预分配内存避免频繁分配释放
    如果内存大小变化范围可控,在进程启动时预分配足够大的共享内存块,后续仅在预分配的块内调整使用范围,避免频繁触发内核的大内存分配和规整操作。

  • 错开多进程的内存分配时机
    通过进程间同步机制(比如信号量、锁),让多个进程的大内存分配操作错开执行,避免同时触发内核内存管理的高负载任务。

  • 调整内核内存阈值
    适当增大/proc/sys/vm/min_free_kbytes的值,确保系统保留足够的空闲内存,减少内存分配时的紧急回收和规整操作。建议根据总内存设置(比如总内存1TB时,可设为1GB左右)。

内容的提问来源于stack exchange,提问作者Amor Fati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:05:26