这个坑值得记一笔。活动前把后端从四台扩到十四台,只在其中一台做了单机压测,活动开始后发现新机器的内核参数是镜像默认值,连接数一上来就丢包。
刚开始盯着「连接池与缓存配置没随机器一起下发」,折腾了半个多小时,排掉了。
这类报错背后常见的原因有几处,逐个排除就行。新机器的 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 差距在一成以内,没有单台先到瓶颈。
提醒一点。扩容的验证对象是整组而不是单机,负载均衡、连接池、缓存要一起看;新机器入组前先跑一遍配置基线。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
