这个坑值得记一笔。活动前把后端从四台扩到十四台,只在其中一台做了单机压测,活动开始后发现新机器的内核参数是镜像默认值,连接数一上来就丢包。

刚开始盯着「连接池与缓存配置没随机器一起下发」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。新机器的 sysctl 是镜像默认值,没和应用机对齐;只压单机,没验证负载均衡的分配是否均匀;新机器没做时间同步,日志时间线对不上。

动手时先对比新旧机器的关键内核参数

sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog fs.file-max

再往下用配置管理批量下发并校验

ansible all -i hosts -m shell -a 'sysctl -p /etc/sysctl.d/99-app.conf'

接着对整组后端做一次全链路压测

wrk -t16 -c2000 -d300s --latency http://www.example.com/api/list

压测期间观察各后端的连接分布

for ip in 10.0.1.10 10.0.1.11 10.0.1.12; do echo -n "$ip "; ssh $ip 'ss -s | grep estab'; done

怎么算真的好了,看的是同一批现象。十四台机器的关键参数完全一致,全链路压测下各后端 CPU 差距在一成以内,没有单台先到瓶颈。

提醒一点。扩容的验证对象是整组而不是单机,负载均衡、连接池、缓存要一起看;新机器入组前先跑一遍配置基线。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189