跳到主要内容

内存分析与调优

内存分析命令

# 内存概览
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.swappiness1-10(DB)/ 30(通用)Swap 使用倾向
vm.overcommit_memory0(默认)或 2内存过量分配策略
vm.dirty_ratio20-40脏页占内存比例上限
vm.min_free_kbytes根据内存大小保留最低空闲内存

常见面试问题

Q1: free 命令中 buff/cache 是什么?可以释放吗?

答案

  • Buffer:块设备的 IO 缓冲区(较少)
  • Cache:文件系统页缓存(较多,加速文件读取)

两者都可以被系统自动回收。available 列 = free + 可回收的 buff/cache,这才是真正可用的内存。

手动释放(生产环境慎用):echo 3 > /proc/sys/vm/drop_caches

相关链接