Pod/Node 内存高负载故障注入
![Pod/Node 内存高负载故障注入](https://static001.geekbang.org/infoq/92/92fb82ed74758937613afc92416d6eb9.png)
1. 介绍
在复杂的分布式系统中,为了验证服务质量、监控告警、流量调度、弹性伸缩等能力,我们需要模拟不同的故障场景。本文将介绍如何使用混沌工具对 Pod/Node 进行内存负载故障注入,以达到指定的内存占用百分比。腾讯云混沌演练平台故障动作:标准集群 Pod/普通节点-内存利用率高。
![](https://static001.geekbang.org/infoq/06/066caf41b6c0702df38ee911994d05ac.png)
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% 内存
![](https://static001.geekbang.org/infoq/22/22ebc8d3ea0f03ece31dd637ef8efb5c.png)
4. 实现原理
混沌工具在进行内存负载故障注入时,主要通过以下方式实现:
ram 模式:启动进程 chaos_burnmem 不断申请内存,模拟主机/容器内存负载升高。当主机内存接近满载时,出于系统保护,操作系统会根据 OOM-KILL 算法,选择一些进程杀死。通常 chaos_burnmem 进程会被杀死。为了保护该进程在故障注入期间一直存在,不被杀死,可以打开 oomGuard 保护,降低该进程 oom-kill 权重,优先杀死其他进程。设置高负载的内存故障注入后,可能会使得机器无法登入与控制,请谨慎使用。
cache 模式:通过挂载 tmpfs 来实现内存占用。首先,挂载目录,然后计算内存占用的值,填充文件,速率为 100Mb/s。
5. 验证故障生效
我们可以通过以下命令查看内存使用情况,以验证故障是否生效:
物理机:通过 top
+ m
命令查看内存使用比例。
![](https://static001.geekbang.org/infoq/7b/7b2dbc96513683eeb0d580a8edda0974.png)
容器:通过 docker
![](https://static001.geekbang.org/infoq/1f/1f131798d4c972f74a2833f5b19e4e90.png)
版权声明: 本文为 InfoQ 作者【腾讯云混沌演练平台】的原创文章。
原文链接:【http://xie.infoq.cn/article/3bd2d3d7aee85038d89b781d5】。文章转载请联系作者。
评论