Linux服务器内存与Swap调优实战:OOM机制与vm参数配置

Linux服务器内存管理与Swap的职责划分

服务器内存调优的核心不是把Swap调大或调小,而是理解内存回收机制后按业务特性配置。Linux把物理内存和Swap统一纳入虚拟内存管理,内存不足时内核按LRU算法回收缓存页,回收失败才触发Swap。Swap在磁盘上,速度比物理内存慢几个数量级,频繁换页会让服务延迟陡增。

先看当前内存与Swap的真实占用,用free与swapon命令确认Swap挂载情况。生产服务器如果Swap为0,内存峰值时OOM概率上升;Swap开得过大,又容易把内存吃紧的问题掩盖成磁盘IO饱和。

# 查看内存和swap用量
free -h
swapon --show
# 查看页面换入换出统计
vmstat 1 5

vm.swappiness参数与内存回收策略配置

vm.swappiness决定内核倾向回收匿名页还是文件缓存页,范围0到100。默认60,多数服务器场景应调低到10左右,让内存优先给应用,Swap只做兜底。对延迟敏感的应用,比如数据库,可以把swappiness设为1到10。

修改方式建议写入sysctl.conf持久化,而不是只执行sysctl -w,否则重启后失效。

# /etc/sysctl.conf
vm.swappiness = 10
vm.vfs_cache_pressure = 50
# 立即生效
sysctl -p

vfs_cache_pressure控制内核回收dentry和inode缓存的积极程度。默认100,调低到50让文件元数据缓存更持久,对大量小文件读写的服务有收益。

OOM机制与关键进程保护

内存耗尽时内核触发OOM Killer,按oom_score杀进程。数据库、消息队列这类核心进程被误杀会造成业务中断,要提前把关键进程的oom_score_adj调低,让内核优先杀其他进程。

# 查看进程的oom分数
cat /proc/<pid>/oom_score
# 保护关键进程,adj范围-1000到1000
echo -200 > /proc/<pid>/oom_score_adj

systemd管理的服务在service文件里加OOMScoreAdjust=-200。容器环境在容器内设置,但内核以整个宿主机内存为观察边界,宿主机层面也需要配置。

cgroup内存限制与OOM隔离

多服务共用一台机器时,cgroup可以隔离内存上限。cgroup v2的memory.max设置硬上限,超过即触发回收或OOM。开启memory.oom.group后,同一cgroup下的进程被一起处理,避免只杀一个子进程导致父进程僵住。

# 创建cgroup并设置内存上限4GB
mkdir /sys/fs/cgroup/myservice
echo 4294967296 > /sys/fs/cgroup/myservice/memory.max
echo 1 > /sys/fs/cgroup/myservice/memory.oom.group
echo <pid> > /sys/fs/cgroup/myservice/cgroup.procs

docker容器的-m参数映射到cgroup内存上限,–oom-kill-disable要谨慎使用,禁掉OOM后进程会无限阻塞在内存分配上,问题更难定位。

Swap与内存监控的运维检查项

监控内存不能只看内存百分比。Swap in/out速率(si和so)持续大于0说明内存压力大,需要扩内存或降低工作集。dmesg出现page allocation failure说明内存碎片化或耗尽,碎片化严重时重启可能是最快解法。

把Swap与分页回收指标接入Prometheus,持续观测比盯内存百分比能更早发现问题。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-nei-cun-yu-swap-diao-you-shi-zhan-oom-ji-zhi/

(0)
小编小编
上一篇 1天前
下一篇 1天前

相关推荐