当Linux系统频繁出现内存耗尽问题时,首先需要准确定位问题根源:
检查系统内存状态
free -h
top
htop
vmstat 1
查看内存占用最高的进程
ps aux --sort=-%mem | head
检查OOM Killer日志
dmesg | grep -i "out of memory"
grep -i "oom" /var/log/messages
# 释放页缓存
echo 1 > /proc/sys/vm/drop_caches
# 释放dentries和inodes
echo 2 > /proc/sys/vm/drop_caches
# 释放页缓存、dentries和inodes
echo 3 > /proc/sys/vm/drop_caches
调整系统参数
# 调整swappiness (0-100, 默认60)
echo "vm.swappiness=10" >> /etc/sysctl.conf
sysctl -p
# 调整overcommit设置 (谨慎使用)
echo "vm.overcommit_memory=2" >> /etc/sysctl.conf
echo "vm.overcommit_ratio=80" >> /etc/sysctl.conf
sysctl -p
优化应用程序
监控与预警
# 安装监控工具
apt install sysstat # Debian/Ubuntu
yum install sysstat # CentOS/RHEL
# 配置cron定期收集内存使用数据
*/5 * * * * /usr/lib/sa/sa1 1 1
使用cgroups限制内存
# 创建cgroup
cgcreate -g memory:/my_group
# 设置内存限制(1GB)
echo 1G > /sys/fs/cgroup/memory/my_group/memory.limit_in_bytes
# 将进程加入cgroup
cgclassify -g memory:/my_group <pid>
Valgrind - 检测内存泄漏
valgrind --leak-check=full ./your_application
pmap - 查看进程内存映射
pmap -x <pid>
smem - 更详细的内存报告
smem -tk
perf - 性能分析
perf stat -e cache-misses ./your_application
通过以上方法,您应该能够有效诊断和解决Linux系统中的内存耗尽问题。如果问题持续存在,可能需要深入分析特定应用程序的内存使用模式或考虑升级硬件资源。