2014年2月10日星期一

nscd dns 缓存引起的修改hosts 不及时生效

​以下一个需要修改的 ip 对于hosts,发现不生效
[root@app]# cat /etc/hosts |grep app_db.56.com
10.11.81.13 app_db.56.com
[root@app]# ping app_db.56.com
PING uevent_db.56.com (120.31.133.142) 56(84) bytes of data.
120.31.133.142 是旧的,相应的 hosts 文件对应 ip 已修改,
10.11.81.13 app_db.56.com app_db
但ping 的时候内核仍然使用旧的ip
[root@app]# ping app_db
PING app_db.56.com (10.11.81.13) 56(84) bytes of data.
64 bytes from SHNHDX81-13.opi.com (10.11.81.13): icmp_seq=1 ttl=60 time=41.3 ms
64 bytes from SHNHDX81-13.opi.com (10.11.81.13): icmp_seq=2 ttl=60 time=31.2 ms

[root@app]# ping app_db.56.com
PING app_db.56.com (10.11.81.13) 56(84) bytes of data.
64 bytes from SHNHDX81-13.opi.com (10.11.81.13): icmp_seq=1 ttl=60 time=31.9 ms
64 bytes from SHNHDX81-13.opi.com (10.11.81.13): icmp_seq=2 ttl=60 time=31.2 ms

注意到ping 的 那一行和 ttl 返回的行不一样。
检查host.conf 文件
[root@ZHONGSH26-131-DX-DB etc]# vim /etc/host.conf 
multi on

使用的是 multi on ,将其修改为  
order hosts,bind
还是没神马效果,指向的还是旧的 hostname :
[root@app]# ping app2.56.com           
PING app2.56.com (10.11.81.123) 56(84) bytes of data.
^C
--- app2.56.com ping statistics ---
24 packets transmitted, 0 received, 100% packet loss, time 23447ms

[root@app]# ping 2.56.com              
PING app2.56.com (10.11.81.13) 56(84) bytes of data.
64 bytes from app2.56.com (10.11.81.13): icmp_seq=1 ttl=60 time=31.3 ms
64 bytes from app2.56.com (10.11.81.13): icmp_seq=2 ttl=60 time=31.2 ms
^C
--- app2.56.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1736ms
rtt min/avg/max/mdev = 31.250/31.292/31.335/0.181 ms
[root@ZHONGSH26-131-DX-DB etc]# cat /etc/hosts |grep app2
10.11.81.14 app2.56.com 2.56.com

怀疑是系统内核的问题,但是我任意加一个新的 ip 和对应的 hosts,是没有问题。就是将其修改过后就是不生效。
混了这几年,还是有盲区啊,这情况还是头次遇到,得想办法查出来。通过strace 来跟踪一下到底是调用了哪些文件。
[root@app]# strace -f -F -o /root/ping.txt /bin/ping app_db.56.com

预计发了两次数据包之后,我 Ctrl C 中断。看了一下那个 ping.txt 文件,果然有发现:
21292 socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 4
21292 connect(4, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = 0
21292 sendto(4, "\2\0\0\0\r\0\0\0\6\0\0\0hosts\0", 18, MSG_NOSIGNAL, NULL, 0) = 18

为什么要用这个socket 呢? google 之,发现是一个dns 本地缓存服务。继续跟进,ps 发现是起来的:
[root@app]# ps -ef |grep nscd
nscd      3027     1  0 17:29 ?        00:00:00 /usr/sbin/nscd

配置文件就是 /etc/nscd.conf ,我看了一下,主要有这么一堆:
  enable-cache            passwd          yes
        positive-time-to-live   passwd          600
        negative-time-to-live   passwd          20
        suggested-size          passwd          211
        check-files             passwd          yes
        persistent              passwd          yes
        shared                  passwd          yes
        max-db-size             passwd          33554432
        auto-propagate          passwd          yes

        enable-cache            group           yes
        positive-time-to-live   group           3600
        negative-time-to-live   group           60
        suggested-size          group           211
        check-files             group           yes
        persistent              group           yes
        shared                  group           yes
        max-db-size             group           33554432
        auto-propagate          group           yes

        enable-cache            hosts           yes
        positive-time-to-live   hosts           3600
        negative-time-to-live   hosts           20
        suggested-size          hosts           211
        check-files             hosts           yes
        persistent              hosts           yes
        shared                  hosts           yes
        max-db-size             hosts           33554432

        enable-cache            services        yes
        positive-time-to-live   services        28800
        negative-time-to-live   services        20
        suggested-size          services        211
        check-files             services        yes
        persistent              services        yes
        shared                  services        yes
        max-db-size             services        33554432

我看是貌似全部加上了,这个服务对于我们全部基于hosts 的应用来讲,相当的无用,反而会带来一些
麻烦。顺便也打算研究一下这个服务。我先是把注释的部分拿掉,看hosts 修改是否能够及时生效:

# ping app_db.56.com
PING app_db.56.com (10.11.81.14) 56(84) bytes of data.
64 bytes from app_db.56.com (10.11.81.14): icmp_seq=1 ttl=60 time=31.3 ms

再改一下,生效:
# ping app_db.56.com 
PING app_db.56.com (10.11.81.13) 56(84) bytes of data.
64 bytes from app_db.56.com (10.11.81.13): icmp_seq=1 ttl=60 time=31.3 ms
64 bytes from app_db.56.com (10.11.81.13): icmp_seq=2 ttl=60 time=31.4 ms
附一个网上的说明:

dns缓存在服务器上的作用

  在需要通过域名与外界进行数据交互的时候,dns缓存就派上用场了,它可以减少域名解析的时间,提高效率.例如以下情况:
  使用爬虫采集网络上的页面数据,
  使用auth2.0协议从其他平台(如微博或QQ)获取用户数据,
  使用第三方支付接口,
  使用短信通道下发短信等.

dns缓存到底能提升多少性能呢?

  首先要看网络和dns服务器的能力,dns解析越慢,dns缓存的优势就越大.比如我们在北京用的dns服务器202.106.0.20和google的dns服务器8.8.8.8速度会差不少.
  如果dns服务器比较稳定,那它对效率的影响就是一个常数.这个常数有多大呢?
  我简单试了一下.在局域网内进行压力测试,压一个nginx下的静态页面,使用202.106.0.20这个dns服务器,不用dns缓存.平均一分钟可以访问27万次.压一个简单的php页面,平均一分钟可以访问22万次.加上nscd服务后,静态页面平均一分钟可以访问120万次,要快4倍多.php页面平均一分钟可以访问50万次,快一倍多.
  如果是做搜索引擎或是一些代理服务类的项目,比如短信通道,数据推送服务,这个性能提升还是比较可观的.但在一般的项目中,一台服务器每分钟发22万次请求的情况是很少见的,所以这个性能提升也微呼其微.
  但在追求极限的道路上,每一小步都至关重要噢~

没有评论:

发表评论