问题现象描述
最近我们公司的生产环境Debian服务器频繁出现无预警的内存爆满情况。系统会在毫无征兆的情况下突然耗尽所有可用内存,导致服务完全不可用,最终只能通过强制重启来恢复。最令人头疼的是系统日志中完全找不到相关错误记录,就像什么都没发生过一样。
初步排查思路
面对这种"隐形杀手",我建议采用以下排查策略:
# 实时监控内存变化
watch -n 1 free -m
# 按内存使用排序进程
ps aux --sort=-%mem | head -n 10
高级诊断工具
当常规方法失效时,我们需要更专业的工具:
# 安装sysstat工具包
apt-get install sysstat
# 配置sar日志收集(每5分钟记录一次)
sed -i 's/ENABLED="false"/ENABLED="true"/' /etc/default/sysstat
systemctl restart sysstat
内存泄漏检测方案
对于可能的内存泄漏问题,我们可以使用valgrind进行检测:
# 安装valgrind
apt-get install valgrind
# 检测示例(以nginx为例)
valgrind --leak-check=full --show-leak-kinds=all /usr/sbin/nginx -t
应急处理脚本
这里提供一个自动监控和报警的shell脚本:
#!/bin/bash
THRESHOLD=90
while true; do
MEM_USAGE=$(free | awk '/Mem/{printf("%d"), $3/$2*100}')
if [ $MEM_USAGE -gt $THRESHOLD ]; then
echo "内存使用超过阈值!当前使用率: ${MEM_USAGE}%" | mail -s "内存告警" admin@example.com
# 自动dump内存占用前10的进程
ps aux --sort=-%mem | head -n 11 > /var/log/mem_usage_$(date +%Y%m%d%H%M%S).log
fi
sleep 60
done
内核参数调优
有时候适当调整内核参数可以缓解问题:
# 防止OOM killer过早介入
echo "vm.overcommit_memory = 2" >> /etc/sysctl.conf
echo "vm.overcommit_ratio = 95" >> /etc/sysctl.conf
sysctl -p
长期监控方案
建议部署Prometheus+Grafana监控体系:
# node_exporter安装示例
wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
tar xvfz node_exporter-*
cd node_exporter-*
./node_exporter &