1. 介绍
在复杂的分布式系统中,为了验证服务质量、监控告警、流量调度、弹性伸缩等能力,我们需要模拟不同的故障场景。本文将介绍如何使用混沌工具对 Pod/Node 进行内存负载故障注入,以达到指定的内存占用百分比。腾讯云混沌演练平台故障动作:标准集群 Pod/普通节点-内存利用率高。
2. 参数
在进行内存负载故障注入时,我们可以通过以下参数来控制:
- percent:内存使用率,取值是 0 到 100 的整数,默认值为 100。此参数为可选。
- mode:内存占用模式,有 ram 和 cache 两种。ram 采用代码实现,可控制占用速率,优先推荐此模式。cache 是通过挂载 tmpfs 实现 (只支持物理机模式使用)。默认值为 cache。
- reserve:保留内存的大小,单位是 MB,如果 percent 存在,则优先使用 percent 参数。此参数为可选。
- rate:内存占用速率,单位是 MB/S,默认值为 100MB/s。此参数为可选。
- oomGuard:是否降低故障注入进程被操作系统 oom-kill 可能性。开启后,会提升业务进程被 oom-kill 可能性。仅在 RAM 模式生效。默认值为 false。此参数为可选。
- duration:自动恢复时长,到达时间后会自动销毁故障。单位是秒。通用参数,默认值为 60。
3. 案例
3.1 占用 80% 内存
代码语言:bash
复制
./chaos-executor attack --target mem --action burn --flags "mode=ram;percent=80;duration=100"
4. 实现原理
混沌工具在进行内存负载故障注入时,主要通过以下方式实现:
- ram 模式:启动进程 chaos_burnmem 不断申请内存,模拟主机/容器内存负载升高。当主机内存接近满载时,出于系统保护,操作系统会根据 OOM-KILL 算法,选择一些进程杀死。通常 chaos_burnmem 进程会被杀死。为了保护该进程在故障注入期间一直存在,不被杀死,可以打开 oomGuard 保护,降低该进程 oom-kill 权重,优先杀死其他进程。设置高负载的内存故障注入后,可能会使得机器无法登入与控制,请谨慎使用。
- cache 模式:通过挂载 tmpfs 来实现内存占用。首先,挂载目录,然后计算内存占用的值,填充文件,速率为 100Mb/s。
代码语言:bash
复制
# 1、挂载目录
mkdir -p ${PATH}/burnmem_tmpfs
mount -t tmpfs tmpfs ${PATH}/burnmem_tmpfs -o size=100%
# 2、计算内存占用的值,填充文件,速率为 100Mb/s
dd if=/dev/zero of=${PATH}/burnmem_tmpfs/file bs=1M count=${fillMem}
5. 验证故障生效
我们可以通过以下命令查看内存使用情况,以验证故障是否生效:
- 物理机:通过
top
+m
命令查看内存使用比例。
- 容器:通过
docker