应用因为某种原因导致系统内存占用率很高,导致应用对外服务能力下降或不可用。
是否能监控发现
是否有对应的预案
故障恢复的时长
-
模拟内存占用率高的手段有很多种,列举常用的几种
方法1:
自己写个应用不停的分配内存
#!/bin/sh
value=$(seq -w -s '' 0 100000000)
sleep 1200
以上脚本大概分配1G(100000000*9/1024/1024)左右的内存,注意seq大小的控制,如果太大会导致进程崩溃,适当调整seq的大小;如果内存压力不够,多起几个进程。
# -bash:xrealloc:无法分配18446744071562067968字节(已分配1945600字节)
# bash 4.4修复了这个问题(未验证)
方法2:使用stress命令
yum install stress -y
stress --vm 1 --vm-bytes 3.9G --vm-keep --timeout 120s
--vm 启动几个worker来进行压测
--vm-bytes 每个work分配的内存大小,不能超过物理内存总量,否则会运行失败
--vm-keep 保持内存高状态,如果不使用这个参数,内存会在占用率上去之后又下去,循环往复。
方法3:使用ramfs或tmpfs往内存里写入文件
mkdir z
#以下2选1,区别参见括号
1. mount -t ramfs ramfs z/ #(z目录写空间写满后会可以继续写入)
2. mount -t tmpfs -o size=2048M tmfs z/ #(z目录写满后,无法继续写入)
dd if=/dev/zero of=z/file bs=1M count=128
使用ramfs时要注意控制写入内存的大小,如果太大会触发系统OOM,从而导致系统不停的杀进程,比如ssh进程可能被杀导致远程连接失败。
可以通过设置以下参数,如果系统OOM,就让系统kernel panic后重启。
echo "vm.panic_on_oom=1" >> /etc/sysctl.conf
echo "kernel.panic=10" >> /etc/sysctl.conf
sysctl -p
方法4:一行命令
cat <(yes | tr \\n x | head -c $((1024*1024*100))) <(sleep 120) | grep n #占用100M内存
这个方法目前看不太稳定
方法5:循环创建n个进程来占用内存空间(推荐)
有现成的脚本可以参考,来自vmware:
./memoryspike.sh --operation=inject --load=80 --timeout=120000 #时间单位是毫秒
#help: --operation=<remediate | precheck | status >
# --operation=inject --load=<load> --timeout=<timeoutinMilliseconds>
方法六:使用阿里的chaosblade(推荐)
https://github.com/chaosblade-io
方法7:其他的奇技淫巧
https://codegolf.stackexchange.com/questions/24485/create-a-memory-leak-without-any-fork-bombs