前段时间一同事在问为甚么同样是 curl ,在 CentOS 7 上面抓取一个网页的域名解析延迟总是会多 150ms 左右?甚至在抓取 localhost 时候也是一样。具体说来,使用的命令是:
[root@centos7 ~]# curl -o /dev/null -s -w \ '%{time_namelookup}:%{time_connect}:%{time_starttransfer}: \ %{time_total}:%{speed_download}\n' http://localhost 0.150:0.151:0.151:0.151:47442.000
对比了一下 CentOS 6 上面的结果,确实差距很大
[root@centos6 ~]# curl -o /dev/null -s -w \ '%{time_namelookup}:%{time_connect}:%{time_starttransfer}: \ %{time_total}:%{speed_download}\n' http://localhost 0.001:0.001:0.001:0.001:114975.000
同事怀疑是 CentOS 7 的域名解析方式有变化,然而我换做用 wget 去抓发现 CentOS 7 延迟也是很低的,排除了这个可能。原因应该是出在 curl 上面。
排查方式:
用 ltrace 加上 -T 参数打印时间戳跟踪了一下,发现是 curl_easy_perform() 这个函数这里出了问题:
Google 了一番之后,发现这个问题其实已经有了修复,将 50ms, 100ms, 150ms… 这样的延迟增长替换为 4ms, 8ms, 16ms… 这样的了。只不过 CentOS 7 里面的版本较老,还没有加入这个补丁。
今天因为 RHEL 7.2 的发布,看了下 Changelog,也已经合入这个补丁了。
https://bugzilla.redhat.com/show_bug.cgi?id=1130239