Linux系统内存管理及优化方法可以从以下几个层面进行:
1. 内存监控分析
使用`free -m`查看内存总量、已用、缓存及可用内存,重点关注`available`值而非`free`。
`top`/`htop`动态监控进程内存占用,按`M`按内存排序,`RES`列显示物理内存占用。
`vmstat 1`分析si/so(交换分区换入换出)值,持续不为零说明内存不足。
`smem -s rss`统计进程实际物理内存占用,比`top`更准确。
2. 内核参数调优
调整`/proc/sys/vm/swappiness`(默认60),降低到10-30可减少交换倾向,但需保留部分交换空间应对突发负载。服务器建议设置为`echo 10 > /proc/sys/vm/swappiness`。
修改`dirty_ratio`(默认20%)和`dirty_background_ratio`(默认10%)控制脏页写回阈值,避免IO突发。数据库场景可适当降低。
启用透明大页(THP)可能引发延迟问题,可通过`echo never > /sys/kernel/mm/transparent_hugepage/enabled`禁用。
3. OOM Killer机制
查看`/var/log/messages`中的OOM日志,使用`dmesg | grep oom`定位进程。
通过`/proc/
对于关键服务,建议通过cgroup限制内存并配置预留值。
4. 缓存与Slab优化
使用`slabtop`查看内核slab占用,异常高时可尝试`echo 2 > /proc/sys/vm/drop_caches`释放(生产环境慎用)。
调整`vfs_cache_pressure`(默认100)控制inode/dentry缓存回收压力,数值越大回收越积极。
5. 应用层优化
Java应用需合理设置JVM堆内存(-Xmx/-Xms)及GC策略,避免堆外内存泄漏。
使用`pmap -x
对于内存密集型应用(如Redis),建议配置`vm.overcommit_memory=1`并关闭swap。
6. 高级技术方案
使用cgroups v2限制内存子系统,防止单个进程耗尽资源。
考虑使用zswap/z3fold压缩交换内容(需内核支持)。
大规模部署时可启用NUMA亲和性策略,减少跨节点内存访问。
扩展知识:
Linux内存使用包含Page Cache(文件缓存)、Slab(内核对象缓存)、Buffer(块设备缓冲)等,`free`显示的used值包含缓存,实际可用内存应参考`available`。
内存碎片化问题可通过`/proc/buddyinfo`监控,严重时需重启或使用`kernelcare`等工具在线整理。
内核>=4.6支持`memory.reclaim`接口精准回收内存,较`drop_caches`更可控。
调试时可结合`perf mem`、`valgrind`等工具进行深度分析,长期运行的系统建议部署Prometheus+Grafana实现内存监控可视化。