track服务优化

track服务优化之一 : DNS和域名

在互联网广告公司里,有一些服务是用作跟踪用户的,而这些代码嵌入的不多,qps也不高,然后文件大小也比较小,对于这样的应用我们如何进行优化呢。

我们http请求第一步开始说起。

大部分的http请求都是通过dns来进行的,这样dns解析的速度也关系到整个访问的速度。 下图中我们可以很明显的看到,这个请求最大的2个部分就是dns和内容下载。

14142519581_cde92247c1_z.jpg

我们知道DNS的缓存时间都由DNS设置TTL时间来决定的(除了部分local dns做强制缓存),而当一个域名在local dns中没有缓存时,local dns就会以迭代的方式去查询这个域名的解析。比如我们通过trace来模拟一个本地没有缓存的迭代过程。

下面是我们解析www.sohu.com的一个例子。 我们可以看到这里,首先是找到根域名的服务器,然后找到所有.com域名的根服务器,然后找到sohu.com域名的根服务器,然后解析了www.sohu.com, 而由于www.sohu.com做了一次cname,所以要进行解析,最终得到对应的IP地址。

而这个过程中,我们发现实际去dns.sohu.com的时间才52ms,而他去到根域名服务器和.com根域的解析时间加起来要452ms,而这个时间都是算在整个请求的时间内的。

14142949292_3223302e28_z.jpg

从上可以看到加快DNS解析速度的重要性,而在local dns中缓存是重重之重。而这个第一步就是统一域名,发现国内某些广告商居然用好多域名来进行跟踪。而google却只用了一个单独域名来进行。

下图是我直接访问这家广告公司的跟踪域名,可以看到光dns解析的时间就903ms,这个还是他们使用了dnspod的服务器的情况下。
14142949232_ddcb4b2a20_c.jpg

而他们的很多广告都使用了不同的域名,不过经过查询是应该用了泛域名解析。但是实际dns请求的时候还是会有延迟啊,local dns可不管是不是泛域名呢。 而这家广告商的这些域名指向最终都是同一个IP,那为什么不用单个域名呢?
14165904063_24dcd230ba_z.jpg

而我们看google ga,所有的ga使用的域名都是同一个。这样从dns层面减少了响应的时间。
14142519561_8ec892a088_c.jpg

从上面我们得到,使用单一域名在dns层面的好处是比较大的。

加快DNS解析速度的另外一个因素就是TTL时间。这个从解析速度来看自然是越大越好,比如很多根域名服务器都是缓存1周的,但是我们看到大量的还是缓存1个小时的。毕竟时间放太长,一旦网络出了问题都没办法切换。所以有些请求量很大的域名的ttl时间都是120秒左右的,就是怕万一有问题来不及切换。

这个就没有绝对的要求,全看各自的dns服务器的分布和性能了。


2个小问题vmware和中文域名

为了省去再进行手动编译,就直接把一个编译完成的虚拟机copy成另外一个,但是mac地址却变成一样了,这样没法连接了。放狗搜索了一下找到如下方法
vim CentOS-test1.vmx
修改如下2行
ethernet0.generatedAddress = “00:0c:29:50:6f:98”
uuid.bios = “56 4d 84 12 57 12 a7 6e-64 ac 83 5c fb 50 6f 98”

我自己就修改了最后一位把7改成8就可以了。重新启动虚拟机一切正常。

2010-04-27

如何在apache中添加中文域名
比如www.中国.com
打开CNNIC的中文域名在线转码页面,选择转成punycode,输入待转中文域名,转换后再绑定。 转码地址http://cnnic.cn/html/Dir/2003/10/29/1112.htm
然后转成了 http://www.xn--fiQs8S.com
ServerName http://www.xn--fiQs8S.com
ServerAlias http://www.中国.com

urchin中最常见内容中显示域名

在urchin显示的内容优化–最常见内容中默认是不带有域名的。例如
http://www.abc.com/test.html这里就只显示test.html,而万一我有test.abc.com/test.html那我就搞不清楚到底哪个是www子域名下的,哪个是test子域名下的。为了解决问题查看了urchin的帮助文档,居然还有现成的。
https://secure.urchin.com/helpwiki/cn/How_do_I_track_all_of_the_subdomains_for_my_site_in_separate_profiles%3F

   Filter Type: Custom filter > Advanced
   Field A: cs_host (Raw)
   Extract A: (.*)
   Field B: Request_Stem (Auto)
   Extract B: (.*)
   Output To: Request_Stem (Auto)
   Constructor: /$A1$B1

但是实际使用中却始终无法正常显示出来。为了解决这个问题无奈只好一个个查看urchin各个字段的解释。在http://www.google.com/support/urchin45/bin/answer.py?answer=28623&topic=7396你可以看到所有字段的解释

因为既然urchin能够获取主机名,那这里肯定也是可以显示的。最后解决问题的方法是:

   Filter Type: Custom filter > Advanced
   Field A: utm_request_hostname (AUTO)
   Extract A: (.*)
   Field B: Request_Stem (Auto)
   Extract B: (.*)
   Output To: Request_Stem (Auto)
   Constructor: $A1$B1

然后必填字段A 选择是,必填字段B选择否,覆盖输出字段选择是,区分大小写选择否。

这下终于OK了。