stress-ng按百分比压测Ubuntu容器内存不达预期问题咨询
问题1:使用百分比参数压测无法达到预期内存占用的原因
- 百分比计算逻辑和预期不符:
stress-ng的--vm-bytes N%的计算基数不同版本实现有差异,部分版本基于系统总物理内存(/proc/meminfo的MemTotal)计算,部分版本基于可用内存(MemAvailable)计算,和你预期的「容器内存limit的10%」基数不一致。 - 参数含义理解偏差:
--vm-bytes指定的是单个vm worker的内存分配额度,不是所有worker的总分配额度,如果你启动2个worker,按百分比算的总分配量会和你预期的单份10%存在偏差。 - 统计口径差异:
docker stats统计的是容器的常驻物理内存(RSS),也就是实际被进程使用的物理内存大小;而stress-ng通过mmap先分配的是虚拟内存,只有被实际写入的页才会被内核分配物理内存、计入RSS。加上stress-ng的vm worker默认会循环执行mmap→写入→munmap操作,不会长期持有所有分配的内存,最终统计到的内存使用率会低于理论值。 - 容器隔离的影响:如果容器没有配置
lxcfs等组件做/proc文件系统的隔离,容器内的stress-ng读取到的内存总大小是宿主机的内存总量,不是容器的cgroup内存限制,也会导致百分比计算偏差。
问题2:stress-ng可以将内存使用率压到100%
可以实现,但需要调整参数和运行环境:
- 必须添加
--vm-keep参数,让vm worker分配内存后一直持有,不执行munmap释放,避免内存循环分配释放导致占不满。 - 建议关闭系统swap,或者将
vm.swappiness内核参数调整为0,避免内存数据被交换到swap分区,导致物理内存使用率达不到100%。 - 压测时需要预留少量内存给内核进程、OOM killer调度使用,否则
stress-ng进程可能在内存占满前就被OOM killer提前终止。如果是容器环境,还要确保容器的内存limit足够,cgroup的OOM策略不会提前杀死压测进程。 - 建议用固定内存值而非百分比做精准压测,计算时需要减去容器本身的基线内存占用,再配置对应的
--vm-bytes参数,更易达到预期的使用率目标。
内容的提问来源于stack exchange,提问作者Oussama Ben Ghorbel
相关产品推荐
相关产品推荐

