curl -o /dev/null -s -w 'dns=%{time_namelookup} connect=%{time_connect} total=%{time_total}\n' http://api.local/health
cat /etc/resolv.conf
接口压测 QPS 停在 2000,平均响应 180 毫秒,其中 60 毫秒花在连接建立。抓包里每个请求前面都有一次 A 查询,域名解析没有任何缓存。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,压测脚本里每轮都新建客户端,连接池是空的,每次都要重新解析域名。JVM 的 DNS 缓存默认 30 秒,但压测代码里改成了 0。解析走内网 DNS,单次 20 到 60 毫秒,占掉三分之一的耗时。
「DNS 解析耗时」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
处理上按这个顺序:压测脚本里复用一个客户端 把连接池打开;打开 JVM 的 networkaddress.cache.ttl 缓存;把域名换成 IP 做一次对照 确认差距来自解析;用 curl 拆开 connect 和 total 两部分看。
改完只确认一件事:QPS 涨到 3200 以上,time_namelookup 稳定在 1 毫秒以内。
