resolv.conf文件配置相關的案例


引言

操作系統中/etc/resolv.conf配置文件中的內容一般為空,如果該文件配置不正確,將導致sshroutenetstat命令響應慢的問題。

/etc/resolv.conf添加錯誤地內容,導致涉及域名解析相關的命令響應慢,是維護工作中較常遇到的問題。

 

相關案例

現象:使用其他機器ssh連接一機器,響應很慢,需要10多秒時間才有輸入密碼的提示響應。

 

問題解決:

被連接機器的/etc/resolv.conf文件中包含了以下內容:

XXXXX:~ # cat /etc/resolv.conf
nameserver 202.102.152.3
search XXX

由於配置了/etc/resolv.conf文件,該機器成為DNS Client,而DNS Server202.102.152.3這個ip對應的機器。

 

執行ssh時,該主機會根據以上配置進行域名解析,由於202.102.152.3這台機器ip不可達,主機將嘗試多次域名解析,直到達到超時次數。

 

route/netstat命令輸出慢

執行routenetstat命令時,也會進行域名解析,像以上那樣錯誤地配置/etc/resolv.conf文件,也會導致routenetstat命令輸出緩慢。

 

而執行route –nnetstat –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 grep
root      5352  0.0  0.0  26068  1432 ?        Ss   12:27   0:00 /usr/sbin/sshd -o PidFile=/var/run/sshd.init.pid
root      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 5352
Process 5352 attached - interrupt to quit

以上命令執行時會掛住,等待ssh連接的到來。這時我們在另一台機器上使用ssh 10.71.171.140命令連接該機器。

 

使用ssh成功登陸之后,ctrl+cstrace命令停止,我們可以看到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的使用方法。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM