Linux内存管理采用复杂但高效的机制,主要包括:
free命令
free -h # 人类可读格式显示
free -m # 以MB为单位显示
输出解释:
total
: 总内存used
: 已使用内存(包括缓存)free
: 完全空闲内存buff/cache
: 缓存和缓冲区available
: 实际可用内存top/htop命令
top
htop # 需要安装,更直观
关注RES
(常驻内存)和%MEM
列
vmstat
vmstat -s # 显示内存统计摘要
vmstat 1 5 # 每秒采样一次,共5次
查看进程内存
ps aux --sort=-%mem | head # 按内存使用排序
pmap -x <PID> # 查看特定进程内存映射
Swappiness控制内核将内存页交换到磁盘的倾向性(0-100):
# 查看当前值
cat /proc/sys/vm/swappiness
# 临时修改(推荐值10-60,服务器可设更低)
sudo sysctl vm.swappiness=10
# 永久修改
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
控制内核回收用于缓存目录和inode对象的内存的倾向:
# 查看当前值
cat /proc/sys/vm/vfs_cache_pressure
# 修改(默认100,增大值会更快回收缓存)
sudo sysctl vm.vfs_cache_pressure=50
减少TLB缺失,提高内存访问效率:
# 查看是否支持
cat /proc/meminfo | grep Huge
# 配置大页数量
echo "vm.nr_hugepages=1024" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
调整OOM Killer行为:
# 查看进程的OOM分数调整值
cat /proc/<PID>/oom_score_adj
# 保护重要进程(-1000到1000,值越低越不容易被杀死)
echo -500 > /proc/<PID>/oom_score_adj
使用cgroups限制进程组内存:
# 创建cgroup
sudo cgcreate -g memory:/my_group
# 设置内存限制(1GB)
echo 1G | sudo tee /sys/fs/cgroup/memory/my_group/memory.limit_in_bytes
# 将进程加入cgroup
echo <PID> | sudo tee /sys/fs/cgroup/memory/my_group/cgroup.procs
在必要时手动释放缓存(生产环境慎用):
# 释放PageCache
echo 1 | sudo tee /proc/sys/vm/drop_caches
# 释放dentries和inodes
echo 2 | sudo tee /proc/sys/vm/drop_caches
# 释放PageCache, dentries和inodes
echo 3 | sudo tee /proc/sys/vm/drop_caches
压缩内存页减少交换开销:
# 检查是否启用
cat /sys/module/zswap/parameters/enabled
# 启用(需内核支持)
sudo modprobe zswap
echo 1 | sudo tee /sys/module/zswap/parameters/enabled
自动合并常规页为大页:
# 查看当前模式
cat /sys/kernel/mm/transparent_hugepage/enabled
# 修改模式(建议madvise或never)
echo "madvise" | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
合并相同内存页:
# 启用KSM
echo 1 | sudo tee /sys/kernel/mm/ksm/run
# 调整扫描参数
echo 100 | sudo tee /sys/kernel/mm/ksm/pages_to_scan
内存泄漏检测
valgrind
检测应用程序内存泄漏smem
分析内存使用情况OOM问题
/var/log/kern.log
中的OOM日志dmesg | grep oom
查看OOM事件交换空间过度使用
si
(swap in)和so
(swap out)值(vmstat)通过以上方法和工具,您可以有效管理和优化Linux系统的内存使用,提高系统性能和稳定性。