Slow-DNS-Lookup问题:默认启用了 ipv6-dns-lookup 以至于必须等待超时

标签: slow dns lookup | 发表时间:2012-12-08 00:55 | 作者:旁观者
出处:http://www.cnblogs.com/zhengyun_ustc/
@郑昀汇总

 

一. 现象:
Java HttpClient 从主站机房发起对××××的 open.×××.com 域名下 WebService 接口的 HTTP 请求,极其缓慢。
经排查:
1.1. wget 实测结果
不指定 IP协议,wget 访问它的接口,时间为 4.163 秒,基本浪费在解析主机的过程上。
如指定 wget 的 IP协议为IPV4,wget 测试则仅需 0.096 秒。
1.2. wget  对比测试:
不指定IP协议,wget 访问另一个电商的接口,时间为 0.798 秒。
1.3. dig  解析  open.×××.com
发现在解析 open.×××.com 的时候,会 CNAME 到一个全局变量中,再由这个全局变量选择最优的线路提供访问。
 
二. 有可能导致 Slow-DNS-Resolution 的原因:
1) 浏览器对××××的接口浏览快,不能证明什么。譬如火狐默认禁用了 ipv6 dns lookup:
http://images.cnblogs.com/cnblogs_com/zhengyun_ustc/255879/o_clipboard91.png
 
2)Ubuntu 从 10.4 开始引入一个问题:操作系统默认启用了 ipv6,导致一些应用程序发出 HTTP 请求时,在 ipv4 介入之前,总是先等待 ipv6 DNS lookup 超时(常有人报告需约30秒),这也是一个 DNS lookup 过程缓慢的常见原因。
 
3)也有人报告:『某一天运维部宣告公司网络已经全部 enable IPv6 了,在此之后在使用 php 的 curl 函数或使用 Linux 下的 wget 访问一个内部域名时,均发现需要等待大概 5 秒才能得到结果。原因是,没有为这个域名绑定一个 IPv6 的地址,wget 时必须等 ipv6 DNS lookup 超时。现在很多服务器都开启了 IPv6 却没有路由,无法真正工作,反而导致一些不可预料的问题。』
 
总之,此事应该与 ipv6-dns-lookup 有关。
 
三. 原因:
××××在网络接入设备上做了调整,解决了问题。
原因:
1)××××使用了 F5 的 GTM 设备(GSLB,全局负载均衡),即我们常说的智能DNS。
2)它把  需要让不同区域用户访问不同IDC节点的域名 通过 F5 的 GTM 来做解析。
3)可能它的设备默认启用了 ipv6,但对于不同域名却又没有配置 ipv6 地址。
 
四. ipv6-dns-lookup 背景知识:
4.1. Java 平台下 ipv6 是如何工作的?
并非所有操作系统都支持 ipv6 协议,即使 Java networking stack 优先尝试检测它,并在发现可用时透明地使用它,也还可以利用系统属性禁用它。在 ipv6 不可用或被显式禁用的情况下, Inet6Address 对大多数网络连接操作都不再是有效参数。
引自  javase 的 ipv6 guide 文档:
第一步, Java networking stack 先确认底层操作系统是否支持 ipv6。如果支持 ipv6 ,Java 将尝试使用  ipv6 stack
第二步,在 双堆栈(dual-stack,指ipv4 stack+ipv6 stack)系统上,将创建一个 ipv6 socket。在  separate-stack 系统上,事情要复杂得多,Java 将创建两个 socket,一个给 ipv4 一个给 ipv6。
第三步,对于客户端 TCP 应用,一旦 socket 连上了,那   internet-protocol family type 就固定了,多余的那个 socket 就关闭了。对于服务器端 TCP 应用,由于不知道下一个客户端请求用什么 ip family type,所以这两个 sockets 将继续保留。对于 UDP 应用,这两个 sockets 始终都需要保留。
 
4.2. ipv6 相关的系统参数
系统有两个参数:
1)首选的 协议栈:ipv4还是ipv6;
2)首选的 地址族(address family type):inet4 还是 inet6。
4.2.1. 协议栈
由于在一个双堆栈系统上, ipv6 socket 能与 ipv4 和 ipv6 对端交互,所以  ipv6 stack 是默认首选项
你可以通过如下系统参数修改配置:
java.net.preferIPv4Stack=<true|false>
对应的 java 代码是:
java.lang.System.setProperty("java.net.preferIPv4Stack", "true");
4.2.2. 地址族
默认我们首选 ipv4 地址族。
你可以通过如下系统参数修改配置:
java.net.preferIPv6Addresses=<true|false>
对应的 java 代码是:
java.lang.System.setProperty("java.net.preferIPv6Addresses", "false");
 
4.3. Linux 上禁用 ipv6 的办法:

Edit /etc/sysconfig/network. (A reboot will be required)
# vi /etc/sysconfig/network

Change:
NETWORKING_IPV6=yes

To:
NETWORKING_IPV6=no
Disable IPv6 Protocol Stack for Kernel
禁止IPV6的内核模块

Edit /etc/modprobe.conf.
# vi/etc/modprobe.conf

Add the following 2 lines: (A reboot will be required)
alias net-pf-10 off
alias ipv6 off

 

4.4. F5 上 ipv6 相关设置:
据说,通过如下命令可以设置 BIG-IP 禁用 ipv6 :
bigpipe db Ipv6.Enabled false
bigpipe save all
 
BIG-IP 与 ipv6 有关的参数默认值如下所示:
Ipv6.Enabled = true
Ipv6.Nbr.DelayTime = 1
Ipv6.Nbr.IncompleteTimeout = 5
Ipv6.Nbr.MaxEntries = 2048
Ipv6.Nbr.ReachableTimeout = 30
Ipv6.Nbr.ReapTimeout = 3600
Ipv6.Nbr.Retries = 2
 
附录A:
‘-4’‘--inet4-only’‘-6’‘--inet6-only’Force connecting to IPv4 or IPv6 addresses. With ‘--inet4-only’ or ‘-4’, Wget will only connect to IPv4 hosts, ignoring AAAA records in DNS, and refusing to connect to IPv6 addresses specified in URLs. Conversely, with ‘--inet6-only’ or ‘-6’, Wget will only connect to IPv6 hosts and ignore A records and IPv4 addresses.       
 

本文链接

相关 [slow dns lookup] 推荐:

Slow-DNS-Lookup问题:默认启用了 ipv6-dns-lookup 以至于必须等待超时

- - 博客园_旁观者
Java HttpClient 从主站机房发起对××××的 open.×××.com 域名下 WebService 接口的 HTTP 请求,极其缓慢. 不指定 IP协议,wget 访问它的接口,时间为 4.163 秒,基本浪费在解析主机的过程上. 如指定 wget 的 IP协议为IPV4,wget 测试则仅需 0.096 秒.

[转]用mysqldumpslow分析mysql的slow query log

- - 小彰
mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysql启动的时候加入一些参数. 如果在my.cnf里面修改,需增加如下几行. long_query_time 是指执行超过多久的sql会被log下来,这里是1秒. log-slow-queries 设置把日志写在那里,可以为空,系统会给一个缺省的文件 host_name-slow.log,我生成的log就在mysql的data目录.

备用的dns

- - 互联网 - ITeye博客
下载软件 百度找出来了 居然被解析到了本地. cr173 被指向到了 127.0.0.1. 找遍了hosts 和路由器 最后才发现是万恶的联通. 阿里dns 速度和质量都不错. 百度dns 评测说较慢 备胎. 114DNS安全版 (114.114.114.119, 114.114.115.119).

用MySQL Slow Log解决MySQL CPU占用高的问题

- - OurMySQL
   在Linux VPS系统上有时候会发现MySQL占用CPU高,导致系统的负载比较高. 这种情况很可能是某个SQL语句执行的时间太长导致的. 优化一下这个SQL语句或者优化一下这个SQL引用的某个表的索引一般能解决问题.    但是怎么找到是哪个SQL语句的执行时间过长呢. 可以通过MySQL Slow Log来找,详解如下.

Public DNS Tool-DNS切换工具

- - 无名小卒
Public DNS Tool v9.1下载: dbank| kuaipan| 官方. 无名小卒(Digital Fingerprint: b98c67913fef00419d415179421ab42f) Related Posts. Webluker-免费CDN、DNS解析和网站监控服务.

DNS解析过程及DNS TTL值

- - IT技术博客大学习
标签:   DNS   TTL.    经常说DNS劫持,也常常说域名解析不正确. 在阅读《HTTP权威指南》缓存一章时,提到缓存文档过期采用“生存时间技术”与DNS类似. 所以抽空学习了解了一下DNS的解析过程,以及DNS TTL值的概念. 根域名服务器(root-servers.org)是互联网域名解析系统(DNS)中最高级别的域名服务器,全球仅有13台根服务器.

新网DNS故障

- - 月光微博客
  新网的DNS服务今天出现长时间故障,包括新网自身在内的大量域名都无法解析,导致网站无法打开,例如使用新网服务的jiathis等网站域名都无法解析.   做为一个域名服务商,DNS发生如此长时间的故障,并且导致客户的域名无法解析,实在太不应该了.   建议新网的客户对新网进行集体诉讼,或者干脆把域名转走算了.

DNS服务-详解

- - 操作系统 - ITeye博客
DNS(Domain Name System)域名系统,在TCP/IP网络中有非常重要的地位,能够提供域名与IP地址的解析服务. <1> 客户机提交域名解析请求,并将该请求发送给本地的域名服务器. <2> 当本地的域名服务器收到请求后,就先查询本地的缓存. 如果有查询的DNS信息记录,则直接返回查询的结果.

域名遭遇DNS污染

- - 望月的博客
费劲九牛二虎之力,终于将在 万网注册的wangyueblog.com这个域名转移到godaddy,然而舒心的日子没有几天,麻烦又来了,由于日益严重的 DNS污染,域名常常出现解析错误,真是屋漏偏逢连夜雨,不过,blogging还得继续,所以还是得想办法,在这里将想法和办法分享,仅供参考. 某些网络运营商为了某些目的,对DNS进行了某些操作,导致使用ISP的正常上网设置无法通过域名取得正确的IP地址.

公共DNS服务器更换工具Public DNS Server Tool

- - 软矿
不知道大家有没有偶尔会遇到过QQ能上但网络却死活上不去或者打开速度慢得非常不正常的情况,出现这种情况的其中一个可能因素就是你所用的服务商DNS出现了障碍. 这种情况下,你可以尝试通过更换可用的DNS服务器来碰下运气. 但手动更改DNS似乎有点麻烦,且一时半刻你也找不到可用的DNS服务器,此时 Public DNS Server Tool将会为你解决这个麻烦.