服务器端性能工具箱(2)- DNS

1,588 阅读2分钟

接着上次的网络带宽继续说,网络带宽问题解决完了,但用户反馈还是很慢,时好时坏,怎么办?

做为开发者,最禁忌类似这样的回答:我这没有问题啊,你看service log,P99都是10ms了,健康的不得了,肯定是客户端的问题,找他们去吧

开发者都应该具备Barrels stop here的情怀,是你的问题搞定它,不是你的问题给出你的最佳解决方案

第一步,到用户那里去复现问题

用户不会无缘无故的抱怨(除非就想找事),既然他说慢,可能哪里真出了问题。先圈几个怀疑点(怀疑点的圈定,可能需要经验,没有经验可以分析数据),客户端发请求拿数据无非就几个步骤,本地请求准备,建立连接,准备传输,传输,服务器端接收到请求处理请求,返回,呈现,每个环节都做一下耗时分析,看看哪里耗时较多,介绍个工具,curl,ubuntu 下安装方式:sudo apt-get install curl

这是个很强大的命令,有很多参数,可以自行学习,只说解决问题要用到的:

curl -o /dev/null -s -w %{time_connect},%{time_namelookup},%{time_connect},%{time_pretransfer},%{time_starttransfer},%{time_total} http://yourdomain/api/xxx

time_connect:建立连接时间

time_namelookup:DNS解析时间

time_pretransfer:从建立连接到开始传输文件的时间

time_starttransfer:收到第一个字节的时间

time_total:整个请求时间

注意单位是秒

如果连续收集数据,分析可以得出类似下图:

那么问题显而易见了

注:可能有的同学会问,怎样才能去用户那里复现,提供两个思路,使用代理(命令本身可支持)或客户端上传log

第二步,如何解决

我们知道使用域名的好处在于可读性与IP地址变更,我新换了一台服务器(比如换机放了,域名对应的IP变下就行)可对客户端透明,但是增加了从域名到IP的解析时间

  1. 更改客户端的DNS cache 策略,默认30秒(记忆中好像是)

    —不足:比如改成30分钟,但如果IP变更,更新起来就有点慢了

  2. 自己APP中管理域名-IP变更策略

    首次启动更新IP(background),以后用IP访问,后定期background更新

本案例的出发点是一个全球化的服务,优化也比这要复杂很多,涉及到多国机房的多种问题,但解决问题的思路大致相同

上面的例子是HTTP,其它协议思路类似

国内的qq,weixin等都使用IP绕开域名。对性能的苛求需要放弃安逸的事物,自己动手,定制化