服务器内存告急、swap疯狂写、OOM乱杀无辜进程——我踩过的三个大坑一次讲清
# 服务器内存告急、swap疯狂写、OOM乱杀无辜进程——我踩过的三个大坑一次讲清很多运维看到内存告警,第一反应就是 `free -h` 看一眼,然后"内存不够,加钱升配"。我认为这是最蠢的处理方式。之前线上一个支付服务被 OOM 杀了三次,我连续三周半夜爬起来重启,后来才发现根本不是内存不够,是 swap 配置在作祟。先把最坑的三个点拆开讲。## 一、swap 的三个坑,最后一个坑死人### 坑1:swappiness=60 是默认值,但服务器不该用内核算什么走 swap,看的就是这个值。默认 60,意味着内存用到一定比例就开始把进程的冷页往 swap 里倒——物理内存明明还够,swap 却在疯长。之前线上 Redis 集群,内存用到 80%,我查延迟从 0.5ms 飙到 200ms,查了两天网络、查了主从,最后才反应过来是 swap 在换页。```shell# 【个人机房踩坑记录:Redis延迟飙升两天没头绪,最后发现是swap在偷摸换页,swappiness太高了】cat /proc/sys/vm/swappiness# 实时观测,so(swap-out)0 且内存available还很多,就是swappiness的锅vmstat 1 10 | awk 'NR2{print $8}'```修法很简单:```shell# 【个人踩坑记录:数据库和缓存机上我全调到1,写盘不换页,延迟直接回来】sysctl -w vm.swappiness=1echo 'vm.swappiness = 1' /etc/sysctl.conf```### 坑2:swap 满了 ≠ 内存满了容器平台上这个坑最多。宿主机给容器 1G swap,业务实际要 3G,容器里看到 swap 100% 直接被 OOM 杀。运维以为是业务吃内存,其实是 swap 空间分配太小。```shell# 【个人踩坑记录:容器里swa