文档章节

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

旁观者-郑昀
 旁观者-郑昀
发布于 2012/12/11 22:51
字数 1207
阅读 111
收藏 1

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

@郑昀汇总

 

一. 现象:
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.       
 

参考资源:

© 著作权归作者所有

旁观者-郑昀
粉丝 101
博文 77
码字总数 162700
作品 0
朝阳
私信 提问
用户定义网络中的内嵌DNS服务器

本节中的信息涵盖用户自定义网络中的容器的内嵌DNS服务器操作。连接到用户自定义网络的容器的DNS lookup与连接到默认 网络的容器的工作机制不同。 注意 :为了保持向后兼容性, 默认 网络的D...

A周立SpringCloud
2018/04/08
0
0
OpenDNS和Google DNS的解析速度比较

Google不久前刚刚发布了自己的DNS为将来Chrome OS做准备,两个DNS服务器的IP地址分别是8.8.8.8和8.8.4.4。我在张大嘴巴感叹米国IP资源如此丰富和牛鼻之后,毅然使用了这两个 DNS作为我的电脑...

红薯
2009/12/08
5K
1
nginx 反向代理aws上服务的问题排查

现象 nginx反向代理了两个服务A和B,其中A是本机,客户端访问正常;另一个B通过proxy_pass转发,地址是亚马逊内部的域名。客户端访问无结果返回,超时。 在nginx所在服务器curl B的域名是可以...

人不知
2016/05/10
185
0
Docker系列教程18-用户定义网络中的内嵌DNS服务器

原文: ,转载请说明出处。 本节中的信息涵盖用户自定义网络中的容器的内嵌DNS服务器操作。连接到用户自定义网络的容器的DNS lookup与连接到默认 网络的容器的工作机制不同。 注意 :为了保持...

EACDY
2018/05/07
307
0
pfSense book之DNS解析

pfSense中的DNS解析利用unbound,这是一个验证、递归、缓存DNS解析器,支持DNSSEC和各种选项。当前版本的pfSense默认启用DNS解析。 默认情况下,DNS解析程序不使用在“系统”>“常规设置”下...

鐵血男兒
2018/01/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

web前端入门到实战:图解原生dialog标签(非常详细)

在html5中,新增了很多语义化的标签。如footer、header之类的,今天的主角是dialog标签 顾名思义,就是用来定义对话框的。目前只有Chrome和Safari支持该标签,所以用的不多,不过确实挺好用的...

梦想编程
18分钟前
2
0
一些php常用函数积累

本文链接<?php// id: ecffe70d3af54df9bad97b61918ace7d global $ct_path, $ct_log_path;$log_path = "test_php.txt";// 是否先log到buffer,再通过CT_flush()一次性写入文件$......

一字见心
18分钟前
2
0
IntelliJ idea中 注释代码折叠

visual studio中有#region 可以折叠代码,IntelliJ idea 中也有类似功能 //region 描述代码//endregion

format
19分钟前
4
0
oracle表中更改主键

一、数据表有主键但无主键约束名 先删除之前的主键,后添加主键 ,执行SQL: a. alter table 表名 drop primary key; b. alter table 表名 add primary key(想要更改的字段名称); 二、数据表...

_Somuns
20分钟前
2
0
jQuery AJAX提交表单

我有一个名称为orderproductForm的表单,输入的数量不确定。 我想做某种jQuery.get或ajax或类似的事情,它将通过Ajax调用页面,并发送所有形式为orderproductForm的输入。 我想一种方法是做类...

技术盛宴
26分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部