内存分析与调优
内存分析命令
# 内存概览
free -h
# total used free shared buff/cache available
# Mem: 16Gi 4Gi 2Gi 100Mi 10Gi 11Gi
# 关键看 available,不是 free(buff/cache 可回收)
# 进程内存排序
ps aux --sort=-%mem | head -20
# 详细内存映射
pmap -x <pid>
# Slab 缓存(内核对象缓存)
slabtop
# 内存统计
vmstat 1 5
# si/so: Swap In/Out(不为 0 说明内存不足开始用 Swap)
Swap 管理
# 查看 Swap 使用
swapon --show
cat /proc/swaps
# 调整 Swap 使用倾向(0-100,越低越不愿用 Swap)
# 生产环境数据库服务器建议设为 1-10
sysctl vm.swappiness=10
echo 'vm.swappiness=10' >> /etc/sysctl.d/99-swap.conf
警告
数据库服务器(MySQL/Redis)应尽量避免使用 Swap,Swap 会导致严重的性能抖动。Redis 甚至建议 vm.swappiness=1。
OOM Killer
# 查看 OOM 日志
dmesg | grep -i "out of memory"
journalctl -k | grep -i oom
# 调整 OOM 优先级(-1000 到 1000,越高越优先被杀)
# 保护关键进程
echo -1000 > /proc/<pid>/oom_score_adj
# 或使用 systemd
[Service]
OOMScoreAdjust=-500
内存调优要点
| 参数 | 推荐值 | 说明 |
|---|---|---|
vm.swappiness | 1-10(DB)/ 30(通用) | Swap 使用倾向 |
vm.overcommit_memory | 0(默认)或 2 | 内存过量分配策略 |
vm.dirty_ratio | 20-40 | 脏页占内存比例上限 |
vm.min_free_kbytes | 根据内存大小 | 保留最低空闲内存 |
常见面试问题
Q1: free 命令中 buff/cache 是什么?可以释放吗?
答案:
- Buffer:块设备的 IO 缓冲区(较少)
- Cache:文件系统页缓存(较多,加速文件读取)
两者都可以被系统自动回收。available 列 = free + 可回收的 buff/cache,这才是真正可用的内存。
手动释放(生产环境慎用):echo 3 > /proc/sys/vm/drop_caches