红联Linux门户
Linux帮助

RHLE6/CENTOS6解析域名慢处理及关闭ipv6

发布时间:2016-04-27 10:41:37来源:linux网站作者:levy_cui

业务发现访问域名api的时候总是慢,换成IP就快,如:
curl -i 'http://api.xxxx.com/credit/getfiel?us=zhang&pwd=74432a70431


方法一:关闭ipv6

1、查看系统是否开启ipv6
a) 命令:ifconfig
注释:有 “inet6 addr:。。。。。。。“ 的表示开启了ipv6功能

b)通过内核模块加载信息查看
命令:lsmod | grep ipv6

2、ipv6关闭方法
在/etc/modprobe.d/dist.conf结尾添加

alias net-pf-10 off
alias ipv6 off

3、reboot重启电脑。


方法二:设置options single-request-reopen

修改如下:
在/etc/resolv.conf文件添加下面一行:
options single-request-reopen

修改/etc/sysctl.conf文件:
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.all.disable_ipv6=1

# sysctl -p 使之生效


具体说明:

下面描述的问题我在几次实际工作中都碰到过,一直没有做一个比较明确的整理,昨天再次碰到的时候(在构建capistrano环境是用bundle 安装包的时候发现速度极其慢),查看到一个写的比较好的blog,于是想把他翻译成中文,share在这里。 版权归原博主所有。

先把结论摆上,在RHLE6/CENTOS6的环境里,需要在/etc/resolv.conf加如下参数

options single-request-reopen     # 注意全部是小写字母


原因说明:RHEL5/CentOS5/Ubuntu等等linux下,dns的解析请求过程如下。

RHLE6/CENTOS6解析域名慢处理及关闭ipv6

1 主机从一个随机的源端口,请求 DNS的AAAA 记录,
2 主机接受dns服务器返回AAAA记录,
3 主机从一个另一个随机的源端口,请求 DNS的A 记录,
3 主机dns 服务器返回A记录,


如果是RHEL6/CentOS6,交互过程有所不同,如图:

RHLE6/CENTOS6解析域名慢处理及关闭ipv6

1 主机从一个随机的源端口,请求 DNS的A 记录,
2 主机从同一个源端口,请求 DNS的AAAA 记录,
3 主机接受dns服务器返回A记录,
4 主机接受 dns服务器返回AAAA记录,

上面3,4并没有严格的先后顺序,实际的顺序受网络环境,服务器环境的影响。
理论上讲centos6的这种工作机制,效率更高,端口复用度更高,能节省更多的资源。
但是这里也同样存在着一个问题。比如在存在防火墙等机制的网络环境中,同样源目的ip,同样源目的port,同样的第4层协议的连接会被防火墙看成是同一个会话,因此会存在返回包被丢弃现象。
如下图。

RHLE6/CENTOS6解析域名慢处理及关闭ipv6


此时的整个dns解析过程如下:
1 主机从一个随机的源端口,请求 DNS的A 记录,
2 主机从同一个源端口,请求 DNS的AAAA 记录,
3 主机先收到dns返回的AAAA记录,
4 防火墙认为本次交互通信已经完成,关闭连接,
5 于是剩下的dns服务器返回的A记录响应包被防火墙丢弃
6 等待5秒超时之后,主机因为收不到A记录的响应,重新通过新的端口发起A记录查询请求,此后的机制等同于centos5)
7 主机收到dns的A记录响应;
8 主机从另一个新的源端口发起AAAA
9 主机收到dns的AAAA记录响应;
我们看到在这个解析的序列里面,dns解析有5秒的延迟发生。所以当用linux系统安装大量远程包的时候宏观上看延迟就非常大了(linux是不缓存dns解析记录的)。


那么到底  options single-request-reopen  这个参数的作用是什么的,man 5 resolv,conf的结果如下:

single-request-reopen (since glibc 2.9)
The resolver uses the same socket for the A and AAAA
requests.  Some hardware mistakenly sends back only one
reply.  When that happens the client system will sit
and wait for the second reply.  Turning this option on
changes this behavior so that if two requests from the
same port are not handled correctly it will close the
socket and open a new one before sending the second
request


本文永久更新地址:http://www.linuxdiyf.com/linux/20135.html