while true;
do
if [ ! -n "$1" ];then
echo "pls set a arg for memfree that we assagin"
exit 1
fi
memfree=$1
echo "debug oom shell,we set memfree:${memfree}"
date
cat /proc/meminfo | grep -E 'MemFree|MemTotal'
ifconfig eth0
ifconfig vap000
ifconfig vap001
cat /proc/sys/net/vap0/link_table
a=`cat /proc/meminfo | grep -E MemFree | awk '{print $2}'`
if [ $a -lt $memfree ]; then
echo 1 > /proc/sys/kernel/printk ------》 出问题的时候调低printk的优先级
echo 7 > /proc/sys/net/vap0/debug_pkt ---》 将系统中指定模块的打印打开,关闭printk为了防止干扰
cat /proc/sys/net/vap0/counters ------》 打印发包数量的计数器
echo "oom issue happen"
dmesg -c
msleep 5
else
echo "no oom issue"
echo 5 > /proc/sys/kernel/printk
dmesg -c
sleep 4
fi
done;
Linux 系统中常常会有一些OOM 的 issue, 使用这个脚本可以时刻检测系统中内存的动态变化,本次我们遇到的问题是wireless driver 总是产生OOM的错误,使用脚本不断打印系统中的counter值, 最终找到了根本原因, 系统中某段时间内产生了大量的ARP包,造成了ARP攻击,从而让driver中分配内存过多,最终导致OOM。
解决的办法也当然就是在driver中加入一个throttle 函数来检测系统中的内存量即可