一、查询内存使用情况
1. 使用 free
命令查看内存状态
free -h
示例输出:
total used free shared buff/cache available
Mem: 7.7G 2.1G 1.2G 345M 4.4G 5.0G
Swap: 2.0G 512M 1.5G
参数说明:
-h
:以人类可读格式显示(GB/MB)total
:总内存量used
:已使用内存free
:空闲内存buff/cache
:缓存和缓冲区内存(可被回收)available
:可用内存(包括可回收的缓存)
2. 使用 top
或 htop
查看内存占用进程
top
# 或安装使用更友好的htop
sudo apt install htop # Debian/Ubuntu
sudo yum install htop # CentOS/RHEL
htop
在 top
中:
- 按
M
按内存使用排序 - 查看
%MEM
列显示进程内存占用百分比
3. 使用 vmstat
查看虚拟内存统计
vmstat -s
4. 检查 /proc/meminfo
获取详细信息
cat /proc/meminfo
二、理解Linux内存管理机制
Linux会尽可能利用内存进行缓存以提高性能,这表现为:
- 已用内存(
used
)可能看起来很高 - 缓存内存(
buff/cache
)会被自动释放当应用程序需要更多内存时 - 真正需要关注的是
available
值,它表示实际可用内存
三、手动释放内存的方法
1. 释放PageCache
sudo sync && sudo echo 1 > /proc/sys/vm/drop_caches
2. 释放dentries和inodes
sudo sync && sudo echo 2 > /proc/sys/vm/drop_caches
3. 释放PageCache、dentries和inodes
sudo sync && sudo echo 3 > /proc/sys/vm/drop_caches
4. 释放swap空间
sudo swapoff -a && sudo swapon -a
四、内存释放脚本
创建一个内存释放脚本 freemem.sh
:
#!/bin/bash
echo "当前内存状态:"
free -h
echo "开始释放内存..."
sync
# 释放页缓存、目录项和inode
echo 3 > /proc/sys/vm/drop_caches
# 重置swap
swapoff -a && swapon -a
echo "释放后的内存状态:"
free -h
使用方法:
chmod +x freemem.sh
sudo ./freemem.sh
五、排查内存泄漏问题
1. 查找内存占用最高的进程
ps aux --sort=-%mem | head -n 10
2. 监控内存变化
watch -n 1 "free -h"
3. 使用 smem
工具分析内存
sudo apt install smem # Debian/Ubuntu
sudo yum install smem # CentOS/RHEL
smem -s pss -r
六、长期内存管理建议
-
调整swappiness (控制交换空间使用频率)
# 查看当前值(默认60) cat /proc/sys/vm/swappiness # 临时设置为10(更少使用swap) sudo sysctl vm.swappiness=10 # 永久设置 echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf sudo sysctl -p
-
限制进程内存 (使用cgroups或ulimit)
-
定期重启内存占用高的服务
-
监控内存使用 (使用Nagios、Zabbix等监控工具)
七、注意事项
- 生产环境谨慎执行内存释放操作,可能影响性能
- 频繁手动释放内存不是长久之计,应找到根本原因
- 缓存(
buff/cache
)被占用是正常现象,无需过度担心 - 如果
available
内存长期不足,应考虑:- 增加物理内存
- 优化应用程序内存使用
- 查找内存泄漏
八、常见问题解答
Q: 为什么free显示内存几乎用完了,但系统运行正常?
A: Linux会充分利用内存做缓存,只要 available
值不低,系统就没有内存压力。
Q: 释放缓存会影响正在运行的程序吗?
A: 不会影响程序数据,但可能导致后续磁盘读取变慢,直到缓存重建。
Q: 如何判断是否有内存泄漏?
A: 观察特定进程的内存占用是否随时间持续增长,即使在其空闲时也不释放。