当Linux系统出现内存不足问题时,首先需要准确诊断当前内存使用情况:
使用free -h
命令查看内存概况
free -h
输出示例:
total used free shared buff/cache available
Mem: 15G 4.2G 500M 1.2G 10G 9.1G
Swap: 2.0G 1.5G 500M
使用top
或htop
查看进程内存占用
top
# 或
htop
检查OOM Killer日志
dmesg | grep -i "out of memory"
grep -i kill /var/log/messages*
识别并终止内存占用高的进程
ps aux --sort=-%mem | head -10
kill -9 [PID] # 谨慎使用,确保了解进程作用
清理缓存
# 清理页面缓存
echo 1 > /proc/sys/vm/drop_caches
# 清理目录项和inodes
echo 2 > /proc/sys/vm/drop_caches
# 清理页面缓存、目录项和inodes
echo 3 > /proc/sys/vm/drop_caches
检查现有Swap
swapon --show
free -h
创建Swap文件(如果没有或需要增加)
# 创建4GB Swap文件示例
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 永久生效,添加到/etc/fstab
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
调整Swappiness(控制内存换出到Swap的倾向)
# 查看当前值(默认60)
cat /proc/sys/vm/swappiness
# 临时设置为更保守的值(如10)
sudo sysctl vm.swappiness=10
# 永久生效
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
调整内存分配策略
# 查看当前overcommit设置
cat /proc/sys/vm/overcommit_memory
# 设置为1(允许适度超量分配)
sudo sysctl vm.overcommit_memory=1
限制用户/进程内存使用
# 使用ulimit限制单个进程内存
ulimit -v [KB数]
# 使用cgroups限制用户/组内存使用
设置内存监控和自动报警:
# 使用cron定期检查
*/5 * * * * /usr/bin/free -m | awk '/Mem:/ {if ($3/$2 > 0.9) print "内存不足警告!"}' | mail -s "内存警报" admin@example.com
或使用专业监控工具: - Nagios - Zabbix - Prometheus + Grafana
通过以上方法,您应该能够有效诊断和解决Linux系统中的内存不足问题。