引言
作業系統中/etc/resolv.conf設定檔中的內容一般為空白,如果該檔案配置不正確,將導致ssh、route、netstat命令響應慢的問題。
在/etc/resolv.conf添加錯誤地內容,導致涉及網域名稱解析相關的命令響應慢,是維護工作中較常遇到的問題。
相關案例
現象:使用其他機器ssh串連一機器,響應很慢,需要10多秒時間才有輸入密碼的提示響應。
問題解決:
被串連機器的/etc/resolv.conf檔案中包含了以下內容:
XXXXX:~ # cat /etc/resolv.confnameserver 202.102.152.3search XXX
由於配置了/etc/resolv.conf檔案,該機器成為DNS Client,而DNS Server為202.102.152.3這個ip對應的機器。
執行ssh時,該主機會根據以上配置進行網域名稱解析,由於202.102.152.3這台機器ip不可達,主機將嘗試多次網域名稱解析,直到達到逾時次數。
route/netstat命令輸出慢
執行route和netstat命令時,也會進行網域名稱解析,像以上那樣錯誤地配置/etc/resolv.conf檔案,也會導致route、netstat命令輸出緩慢。
而執行route –n和netstat –n時則不會有緩慢的問題,因為加了-n選項,命令執行時將輸出XXX.XXX.XXX.XXX點分十進位的ip地址,不進行網域名稱解析。
strace跟蹤分析
在《自助Linux之問題診斷工具strace》一文中,介紹了strace的用法,像這類命令執行相應慢或執行出錯的問題,使用strace進行問題分析再適合不過了。
下面我們將大腦清空,“忘記”上文內容,來學習如何使用strace來分析ssh登陸慢的問題。
首先,我們在使用ssh的機器上使用strace跟一下ssh命令:
linux198 /root# strace -o ssh.strace -fT ssh 10.71.171.140
可以看到輸出檔案ssh.strace中,ssh命令在底層的一個select調用阻塞了15s:
……23452 write(3, "\325/S\265\223\246H\241nG\237\4,\2201\23\235]<\5] 7ke\200"..., 912) = 912 <0.000010>23452 select(4, [3], NULL, NULL, NULL) = 1 (in [3]) <15.098772>……
儘管select系統調用本身是非阻塞的,ssh仍等待select的返回再往下執行。除此之外沒有獲得其他有用資訊。
這時我們再在被ssh登陸慢的、有問題的機器,跟一下sshd進程,先尋找sshd進程的pid:
slot10-sles10sp2:~ # ps aux | grep sshd | grep -v greproot 5352 0.0 0.0 26068 1432 ? Ss 12:27 0:00 /usr/sbin/sshd -o PidFile=/var/run/sshd.init.pidroot 7761 0.0 0.0 40792 2912 ? Ss 14:55 0:00 sshd: root@pts/0
再使用-p選項對運行中的進程使用strace跟蹤:
slot10-sles10sp2:~ # strace -o sshd.strace -fT -p 5352Process 5352 attached - interrupt to quit
以上命令執行時會掛住,等待ssh串連的到來。這時我們在另一台機器上使用ssh 10.71.171.140命令串連該機器。
使用ssh成功登陸之後,ctrl+c將strace命令停止,我們可以看到sshd.strace檔案中有以下輸出:
16894 open("/etc/resolv.conf", O_RDONLY) = 4 <0.000026>16894 fstat(4, {st_mode=S_IFREG|0644, st_size=40, ...}) = 0 <0.000023>16894 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b0eb8dbf000 <0.000024>16894 read(4, "nameserver 202.102.152.3\nsearch "..., 4096) = 40 <0.000028>16894 read(4, "", 4096) = 0 <0.000023>16894 close(4) = 0 <0.000024>16894 munmap(0x2b0eb8dbf000, 4096) = 0 <0.000026>16894 socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4 <0.000027>16894 connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("202.102.152.3")}, 28) = 0 <0.000025>16894 fcntl(4, F_GETFL) = 0x2 (flags O_RDWR) <0.000024>16894 fcntl(4, F_SETFL, O_RDWR|O_NONBLOCK) = 0 <0.000023>16894 poll([{fd=4, events=POLLOUT, revents=POLLOUT}], 1, 0) = 1 <0.000024>16894 sendto(4, "\313\367\1\0\0\1\0\0\0\0\0\0\003198\003172\00271\00210"..., 44, 0, NULL, 0) = 44 <0.000117>16894 poll([{fd=4, events=POLLIN}], 1, 5000) = 0 <5.000046>16894 poll([{fd=4, events=POLLOUT, revents=POLLOUT}], 1, 0) = 1 <0.000024>16894 sendto(4, "\313\367\1\0\0\1\0\0\0\0\0\0\003198\003172\00271\00210"..., 44, 0, NULL, 0) = 44 <0.000035>16894 poll([{fd=4, events=POLLIN}], 1, 5000) = 0 <4.999760>16894 close(4) = 0 <0.000028>
從以上輸出可以看到,當有串連到來的時候,sshd進程會開啟並讀取/etc/resolv.conf檔案的內容,對其中的DNS nameserver建立socket,然後調用poll函數,每個poll調用5s後逾時返回。
進一步地,我們瞭解/etc/resolv.conf檔案的作用,查看/etc/resolv.conf檔案的配置,從而解決問題。
小結
本文討論了/etc/resolv.conf檔案配置錯誤,導致ssh登陸慢(包括從其他機器跳轉慢、使用putty等軟體登陸慢)、reoute/netstat命令執行慢的問題。
通過問題的複現,使用strace進行問題分析,我們也小試了一下牛刀,熟悉了strace的使用方法。
引用:http://www.cnblogs.com/bangerlee/articles/2460619.html