自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux服務器故障排查實用指南

譯文
運維 服務器運維
由于造成網(wǎng)絡問題的因素多種多樣,因此網(wǎng)絡故障排查技能就成了每位服務器或網(wǎng)絡服務負責人必不可少的重要素質(zhì)。Linux為我們提供了大量網(wǎng)絡故障排查工具,在本文中,我們將討論一些常見的網(wǎng)絡問題,并介紹如何利用某些Linux工具追蹤意外狀況發(fā)生的根本原因。

 由于造成網(wǎng)絡問題的因素多種多樣,因此網(wǎng)絡故障排查技能就成了每位服務器或網(wǎng)絡服務負責人必不可少的重要素質(zhì)。Linux為我們提供了大量網(wǎng)絡故障排查工具,在本文中,我們將討論一些常見的網(wǎng)絡問題,并介紹如何利用某些Linux工具追蹤意外狀況發(fā)生的根本原因。

問題:服務器A無法與服務器B通信

可能大家在實際工作中最常見的網(wǎng)絡故障就是一臺服務器無法與另一臺網(wǎng)絡上的服務器進行通信。本小節(jié)將通過實例講解具體處理辦法。在實例中,一臺名為dev1的服務器無法訪問另一臺名為web1的服務器中的網(wǎng)絡服務(端口80)。導致這一現(xiàn)象的原因相當繁雜,因此我們需要一步步測試操作活動,進而通過排除法找到故障的根源。

一般說來,在對這樣的問題進行故障排查時,大家可能會跳過某些初始步驟(例如檢查鏈接等),因為接下來的某些測試環(huán)節(jié)能起到同樣的診斷作用。舉例來說,如果我們測試并確認DNS能夠正常工作,那么就證明我們的主機是能夠與本地網(wǎng)絡進行通信的。但在本次實例解析中,我們將本著謹慎的態(tài)度執(zhí)行每一個步驟,借以理解各個級別的不同測試方式。

  • 問題出在客戶機還是服務器端?

大家可以利用一項快速測試縮小造成故障的范圍,即通過同一網(wǎng)絡中的另一臺主機嘗試訪問對應服務器。在本實例中,我們姑且將另一臺與dev1同處一套網(wǎng)絡環(huán)境下的服務器命名為dev2,并嘗試通過它訪問web1。如果dev2也不能正常訪問web1,那么顯然問題很可能出在web1或者是dev1、dev2及web1之間的網(wǎng)絡身上。如果dev2能夠正常訪問web1,那么我們就可以斷定dev1出問題的機率較大。首先,我們假設dev2能夠訪問web1,因此我們開始將故障排查的重點放在dev1這邊。

  • 線纜插好了嗎?

故障排查的第一步要在客戶機上進行。大家首先要確認自己客戶機的網(wǎng)絡連接沒有問題。要做到這一點,我們可以使用ethtool程序(通過ethtool工具包安裝)對鏈接(即以太網(wǎng)設備與網(wǎng)絡構(gòu)成物理連接)情況加以檢測。如果大家無法確定自己使用的是哪個端口,那么請運行/sbin/ifconfig命令將所有可用的網(wǎng)絡端口及其設定列出。我們假設自己的以太網(wǎng)設備在eth0端口上,那么:

 $ sudo ethtool eth0
Settings for eth0:
     Supported ports: [ TP ]
     Supported link modes:   10baseT/Half 10baseT/Full 
                               100baseT/Half 100baseT/Full 
                               1000baseT/Half 1000baseT/Full 
     Supports auto-negotiation: Yes
     Advertised link modes:  10baseT/Half 10baseT/Full 
                               100baseT/Half 100baseT/Full 
                               1000baseT/Half 1000baseT/Full 
     Advertised auto-negotiation: Yes
     Speed: 100Mb/s
     Duplex: Full
     Port: Twisted Pair
     PHYAD: 0
     Transceiver: internal
     Auto-negotiation: on
     Supports Wake-on: pg
     Wake-on: d
     Current message level: 0x000000ff (255)
     Link detected: yes

在最后一行中,大家可以看到檢測結(jié)果顯示鏈接設置為“yes”,所以dev1已經(jīng)與網(wǎng)絡構(gòu)成物理連接。如果這項檢測的結(jié)果為“no”,那么我們需要親自檢查dev1的網(wǎng)絡連接,并將線纜插實到位。在確定物理連接沒有問題之后,執(zhí)行下面的步驟。

注意:ethtool絕不僅僅是一款用于檢測鏈接狀況的工具,它還能夠診斷并糾正雙工問題。當Linux服務器與網(wǎng)絡連通時,通常會與網(wǎng)絡自動協(xié)商以獲取傳輸速度信息以及該網(wǎng)絡是否支持全雙工。在本實例中,傳輸速度經(jīng)ethtool檢測為100Mb/秒,且該網(wǎng)絡支持全雙工機制。如果大家發(fā)現(xiàn)主機的網(wǎng)絡傳輸速度緩慢,那么速度及雙工設定是首先需要關(guān)注的重點。如前文所示運行ethtool,若大家發(fā)現(xiàn)雙工被設定為一半,則運行以下命令:

$ sudo ethtool -s eth0 autoneg off duplex full

意思是利用自己的以太網(wǎng)設備代替eth0。

端口正常嗎?

一旦確認了服務器與網(wǎng)絡之間物理連接的完好性,接下來就是判斷主機上的網(wǎng)絡端口是否配置正確。在這方面,最好的檢查方式就是運行ifconfig命令并將端口作為參數(shù)后綴。因此要測試eth0的設置,大家應該運行以下內(nèi)容:

 

$ sudo ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:17:42:1f:18:be  
          inet addr:10.1.1.7  Bcast:10.1.1.255  Mask:255.255.255.0
          inet6 addr: fe80::217:42ff:fe1f:18be/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:1 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:229 (229.0 B)  TX bytes:2178 (2.1 KB)
          Interrupt:10 

在上述輸出結(jié)果中,第二行可能最值得我們關(guān)注,因為其內(nèi)容是解釋我們的主機已經(jīng)被配置了一套IP地址(10.1.1.7)與子網(wǎng)掩碼(255.255.255.0)?,F(xiàn)在,大家需要確認這樣的設置結(jié)果是否正確。如果端口未受配置,請嘗試運行sudo ifup eth0,然后再次運行ifconfig重新檢查端口是否出現(xiàn)。如果設置錯誤或端口未出現(xiàn),則檢查/etc/network/interfaces路徑(Debian系統(tǒng))或/etc/-sysconfig/-network_scripts/ifcfg-<interface>路徑(紅帽系統(tǒng))。在這些文件中,大家可以修正網(wǎng)絡設置中存在的所有錯誤?,F(xiàn)在如果主機通過DHCP獲得自身IP,我們則需要將故障排查轉(zhuǎn)移到DHCP主機處,找出為什么我們沒有正確獲得IP租用周期。

#p#

問題出在本地網(wǎng)絡中嗎?

排除了端口出現(xiàn)的問題之后,接下來我們就該檢查默認網(wǎng)關(guān)是否被設置及我們能否對其進行訪問。route命令將顯示出我們當前的路由表,包括默認網(wǎng)關(guān):

$ sudo route -n
Kernel IP routing table
Destination     Gateway      Genmask          Flags Metric Ref     Use Iface
10.1.1.0        *             255.255.255.0    U     0      0        0 eth0
default         10.1.1.1     0.0.0.0           UG    100    0        0 eth0

以上內(nèi)容中值得關(guān)注的在于最后一行,也就是default那段內(nèi)容。在這里,大家可以看到主機網(wǎng)關(guān)為10.1.1.1.請注意,由于我們在route命令后添加了-n選項,所以命令不會嘗試將這些IP地址解析為實際主機名稱。這種方式能讓命令的運行更迅速,但更重要的是,我們不希望故障排查工作受到任何潛在DNS錯誤的影響。如果大家沒有在這里看到經(jīng)過配置的默認網(wǎng)關(guān),而我們想要檢查的主機處于另一子網(wǎng)之下(例如web1為10.1.2.5),那么問題很可能就出在這里。要將其解決,大家一定要確保網(wǎng)關(guān)設置要么處于Debian系統(tǒng)的/etc/network/interfaces路徑下、要么是在紅帽系統(tǒng)的/etc/-sysconfig/network_scripts/ifcfg-<interface>路徑下;如果IP是由DHCP所分配,則確保網(wǎng)關(guān)在DHCP服務器中被正確設置。在Debian系統(tǒng)中,我們運行如下命令進行端口重置:

$ sudo service networking restart

而在紅帽系統(tǒng)中我們需要運行如下命令進行端口重置:

$ sudo service network restart

請大家注意,即使是如此基本的操作命令在不同的系統(tǒng)發(fā)行版中也存在著差異。

一旦確認網(wǎng)關(guān)配置完成,我們可以利用ping命令來確認與網(wǎng)關(guān)的通信效果:

$ ping -c 5 10.1.1.1
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
64 bytes from 10.1.1.1: icmp_seq=1 ttl=64 time=3.13 ms
64 bytes from 10.1.1.1: icmp_seq=2 ttl=64 time=1.43 ms
64 bytes from 10.1.1.1: icmp_seq=3 ttl=64 time=1.79 ms
64 bytes from 10.1.1.1: icmp_seq=5 ttl=64 time=1.50 ms
--- 10.1.1.1 ping statistics ---
5 packets transmitted, 4 received, 20% packet loss, time 4020ms
rtt min/avg/max/mdev = 1.436/1.966/3.132/0.686 ms

如大家所見,我們已經(jīng)能夠正確ping通網(wǎng)關(guān),這至少意味著大家與10.1.1.0網(wǎng)絡能夠進行通信。如果無法ping通網(wǎng)關(guān),那么原因可能分以下幾種。首先,這可能表示我們的網(wǎng)關(guān)自動阻斷ICMP數(shù)據(jù)包。如果是這樣,請告訴網(wǎng)絡管理員阻斷ICMP是種討厭的壞習慣,由此帶來的安全收益也微乎其微。然后嘗試ping同一子網(wǎng)下的另一臺Linux主機。如果ICMP沒有被阻斷,那么可能是主機交換機端口的VLAN設置有誤,所以我們需要進一步檢查接入的交換機。

#p#

DNS能正常工作嗎?

一旦確認了與網(wǎng)關(guān)之間的通信能力,下面要做的就是測試DNS功能是否正常。nslookup與dig兩款工具都能用于排查DNS方面的問題,但由于在本實例中大家只需要進行一基礎(chǔ)測試,因此我們建議使用nslookup命令可查看服務器能否將web1正確解析為IP地址:

$ nslookup web1
Server: 10.1.1.3
Address: 10.1.1.3#53
Name: web1.example.net
Address: 10.1.2.5

如上所示,實例中的DNS服務器能夠正常工作。web1主機擴展為web1.example.net且被解析為10.1.2.5地址。當然,大家別忘了確認解析出的IP地址與web1應該使用的IP地址相匹配。在本實例中,因為DNS沒有問題,所以我們可以直接跳到下一部分;但有時候DNS也可能出現(xiàn)問題。

沒有配置過的名稱服務器或無法訪問名稱服務器

如果大家看到如下錯誤,這可能意味著要么我們的主機沒有配置過的名稱服務器,要么這些服務器無法進行訪問:

$ nslookup web1
;; connection timed out; no servers could be reached

在這兩種情況下,我們都需要檢查/etc/resolv.conf文件以確認是否存在已配置的名稱服務器。如果我們在這里找不到任何已配置的IP地址,則需要在文件中添加一個名稱服務器。相反,如果我們看到如下所示的內(nèi)容,則需要通過ping命令對主機與名稱服務器之間的連接進行排查:

search example.net
nameserver 10.1.1.3

如果無法ping通名稱服務器,且其IP地址與我們的主機處于同一子網(wǎng)下(在本實例中,10.1.1.3代表處于同一子網(wǎng)下),則代表名稱服務器本身可能已經(jīng)崩潰。如果無法ping通名稱服務器且其IP地址與我們的主機處于不同子網(wǎng)下,則直接跳轉(zhuǎn)至"我能路由至遠程主機嗎?"章節(jié),選擇其中與名稱服務器IP故障排查相關(guān)的內(nèi)容加以執(zhí)行。如果通過ping通名稱服務器但對方無響應,則跳轉(zhuǎn)至"遠程端口是否打開?”章節(jié)。

缺少搜索路徑或名稱服務器的問題

在運行nslookup命令后,我們還可能得到以下錯誤信息:

$ nslookup web1
Server: 10.1.1.3
Address: 10.1.1.3#53
** server can't find web1: NXDOMAIN

在這里大家可以看到服務器沒有響應,因為它給出的回應表明:服務器無法找到web1。這可能意味著兩種可能性:第一,這可能代表web1這一域名并不在DNS搜索路徑當中。這部分搜索設置內(nèi)容位于/etc/resolv.conf文件當中。推薦一種比較好的測試方式,即執(zhí)行同樣的nslookup命令,但只使用全稱域名(在本實例中為web1.example.net)。如果能夠被正確解析,則要么在命令中始終使用全稱域名,要么在/etc/resolv.conf中將主機名稱添加到搜索路徑當中(如果大家懶得重復輸入)。

如果連全稱域名也不能奏效,那么問題肯定出在名稱服務器上。這里我們匯總了一些DNS問題的故障排查指南。如果名稱服務器保存有記錄,則需要對其配置進行檢查。如果使用的是遞歸名稱服務器,我們則必須通過查找其它一些域來測試名稱服務器的遞歸機制是否正常。如果其它域都能被正確列出,我們就要看看問題是不是出在包含上述區(qū)域的遠程名稱服務器端。

#p#

我能路由至遠程主機嗎?

在排除了DNS問題并看到web1被正確解析為IP 10.1.2.5之后,大家需要測試自己能否路由至遠程主機。假如我們的網(wǎng)絡啟用了ICMP,那么最快捷的測試辦法是ping web1。如果該主機能被ping通,我們就知道數(shù)據(jù)包已經(jīng)被路由至目的地,這樣的話可以直接跳轉(zhuǎn)至"遠程端口打開了嗎?"章節(jié)。如果無法ping通web1,則嘗試與網(wǎng)絡中的另一臺主機通信看看能否ping通。如果我們無法在遠程網(wǎng)絡中ping通任何主機,就說明數(shù)據(jù)包無法被正確路由。最好的路由問題測試工具這一就是traceroute。一旦與一臺主機建立起路由追蹤,它會測試我們與主機之間的每一次數(shù)據(jù)包跳轉(zhuǎn)。舉例來說,dev1與web1之間的一次成功路由追蹤流程將如下所示:

$ traceroute 10.1.2.5
traceroute to 10.1.2.5 (10.1.2.5), 30 hops max, 40 byte packets
1 10.1.1.1 (10.1.1.1) 5.432 ms 5.206 ms 5.472 ms
2 web1 (10.1.2.5) 8.039 ms 8.348 ms 8.643 ms

這里我們會看到數(shù)據(jù)包從dev1到達其網(wǎng)關(guān)(10.1.1.1),然后再跳轉(zhuǎn)至web1。這代表著起始位置與目標主機可能都采用10.1.1.1網(wǎng)關(guān)。如果大家的操作環(huán)境中存在更多路由中轉(zhuǎn)點,那么顯示的結(jié)果可能與上述內(nèi)容有所不同。如果無法ping通web1,那么輸入結(jié)果將如下所示:

$ traceroute 10.1.2.5
traceroute to 10.1.2.5 (10.1.2.5), 30 hops max, 40 byte packets
1 10.1.1.1 (10.1.1.1) 5.432 ms 5.206 ms 5.472 ms
2 * * *
3 * * *

一旦我們在輸出結(jié)果中看到星號,就說明問題出在網(wǎng)關(guān)方面。大家需要從路由器著手,看看為什么它無法在兩套網(wǎng)絡之間路由數(shù)據(jù)包。通過追蹤,大家會看到如下內(nèi)容:

$ traceroute 10.1.2.5
traceroute to 10.1.2.5 (10.1.2.5), 30 hops max, 40 byte packets
1 10.1.1.1 (10.1.1.1) 5.432 ms 5.206 ms 5.472 ms
1 10.1.1.1 (10.1.1.1) 3006.477 ms !H 3006.779 ms !H 3007.072 ms

在這種情況下,我們發(fā)現(xiàn)ping操作在網(wǎng)關(guān)環(huán)節(jié)出現(xiàn)了超時,這說明該主機可能已經(jīng)崩潰或無法通過同一子網(wǎng)進行訪問。有鑒于此,如果大家還沒有從同一子網(wǎng)下的其它設備訪問過web1,請嘗試ping及其它測試。

注意:如果某套煩人的網(wǎng)絡仍然在阻斷ICMP,不用擔心,我們?nèi)匀挥修k法進行路由排查工作。大家只需要安裝tcptraceroute軟件包(sudo apt-get install tcptraceroute)然后運行相同的路由追蹤命令,惟一的區(qū)別是用tcptraceroute來代替traceroute 。

#p#

遠程端口打開了嗎?

現(xiàn)在我們已經(jīng)能夠路由至目標設備,但仍然無法在端口80上訪問web服務器。接下來的測試意在檢查端口是否打開。要實現(xiàn)這一目的,我們可以選擇的方案很多。選擇其一,我們可以嘗試telnet:

$ telnet 10.1.2.5 80
Trying 10.1.2.5...
telnet: Unable to connect to remote host: Connection refused

如果大家看到連接被拒絕,那么端口很可能處于關(guān)閉狀態(tài)(可能是Apache未能運行在遠程主機上或沒有偵聽該端口),也可能是防火墻阻斷了我們的訪問。如果telnet能夠連接,那么恭喜各位,現(xiàn)在大家已經(jīng)解決了所有網(wǎng)絡問題。但如果web服務的工作狀態(tài)與我們的預期不符,則需要檢查web1上的Apache配置(web服務器的故障排查工作在本文的其它章節(jié)會談到)。

但相對于telnet,我個人更偏向使用nmap來進行端口測試,因為它往往能夠檢測到防火墻的影響。如果大家還沒有安裝nmap,可以使用軟件包管理器快速安裝nmap軟件包。要對web1進行測試,請輸入以下內(nèi)容:

$ nmap -p 80 10.1.2.5
Starting Nmap 4.62 ( http://nmap.org ) at 2009-02-05 18:49 PST
Interesting ports on web1 (10.1.2.5):
PORT STATE SERVICE
80/tcp filtered http

nmap果然不負眾望,它一般都能發(fā)現(xiàn)所謂"關(guān)閉的端口"到底是直接處于關(guān)閉狀態(tài)、還是在防火墻后處于關(guān)閉狀態(tài)。通常情況下,nmap會將真正關(guān)閉的端口報告為"關(guān)閉",而將防火墻后的端口報告為"過濾"。在我們的測試中它報告其狀態(tài)為"過濾",意味著期間有防火墻作梗并忽略掉了我們的數(shù)據(jù)包。如此一來,大家就需要檢查網(wǎng)關(guān)(10.1.1.1)以及web1上的全部防火墻規(guī)則,看看端口80是否處于阻斷狀態(tài)。

#p#

在本地測試遠程主機

到了這里,擺在我們面前的就有兩種可能性:要么將故障范圍縮小為網(wǎng)絡問題,要么認定毛病出在主機自身。如果大家認定毛病出在主機自身,我們可以通過一系列操作檢查端口80是否可用。

偵聽端口測試

我們在web1上要做的第一件事就是測試端口80是否處于偵聽狀態(tài)。大家可以使用netstat -lnp命令來列出所有打開且處于偵聽狀態(tài)的端口。我們當然可以直接運行這條命令并從輸出結(jié)果中篩選出自己想要的結(jié)論,但效率更高的方式則是利用grep指定顯示端口80的偵聽狀態(tài):

$ sudo netstat -lnp | grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 919/apache

第一列內(nèi)容顯示出端口所使用的傳輸協(xié)議。第二及第三列則顯示接收及發(fā)送隊列(這里兩者都被設置為0)。現(xiàn)在我們要注意的是第四列,因為它列出了主機所偵聽的本地地址。此處的0.0.0.0:80告訴我們該主機正偵聽所有端口80流量中與其IP有關(guān)的數(shù)據(jù)。如果Apache只偵聽web1的以太網(wǎng)地址,我們將在輸出結(jié)果中看到10.1.2.5:80。

最后一列顯示的是哪個進程令端口處于開放狀態(tài)。這里我們看到是運行中的Apache正在進行偵聽。如果大家在自己的netstat輸出結(jié)果中沒有看到這部分內(nèi)容,則需要啟動Apache服務器。

防火墻規(guī)則

如果進程正在運行且偵聽端口80,那就說明可能是web1中某種形式的防火墻導致了問題的發(fā)生。利用iptables命令列出全部現(xiàn)有防火墻規(guī)則。如果我們的防火墻已被禁用,那么輸出結(jié)果應如下所示:

$  sudo /sbin/iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

請注意,默認政策被設置為ACCEPT。盡管規(guī)則本身沒有問題,但防火墻仍然有可能默認棄用所有數(shù)據(jù)包。如果屬于這類情況,大家會看到如下所示的輸出內(nèi)容:

$  sudo /sbin/iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
Chain FORWARD (policy DROP)
target     prot opt source               destination
Chain OUTPUT (policy DROP)
target     prot opt source               destination

另一方面,如果某條防火墻規(guī)則阻斷了端口80,那么輸出結(jié)果則應如下所示:

$ sudo /sbin/iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 reject-with(
icmp-port-unreachable
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

在后一種情況下,我們顯然需要修改防火墻規(guī)則,以允許服務器接收來自端口80的主機數(shù)據(jù)流量。

#p#

網(wǎng)絡緩慢狀況的故障排查

從某種角度來說,網(wǎng)絡無法工作的問題更容易解決。當一臺主機無法訪問,我們可以執(zhí)行前面討論過的故障排查步驟直到一切恢復正常。但如果僅僅是網(wǎng)絡緩慢,追查其根本原因往往變得更為棘手。本章節(jié)將討論一些相關(guān)技巧,幫助大家追蹤導致網(wǎng)絡速度緩慢的各種原因。

DNS問題

雖然DNS在網(wǎng)絡出現(xiàn)問題時常常蒙冤受責,但在導致網(wǎng)絡性能不佳方面,DNS倒真該被優(yōu)先檢查一番。舉例來說,如果我們?yōu)槟硞€域名配置了兩臺DNS服務器,那么在第一臺出現(xiàn)問題時,我們發(fā)出的DNS請求會等待30秒之后才傳輸至第二臺DNS服務器。雖然當我們使用像dig或nslookup這樣的工具時此類情況顯得一目了然,但對于日常使用來說,DNS故障往往會以令人意外的方式造成網(wǎng)絡緩慢;這是因為有太多服務需要借助DNS實現(xiàn)將主機名稱解析為IP地址的工作。這些問題甚至有可能影響到我們的網(wǎng)絡故障診斷工具。

Ping、tracerouter、oute、netstat甚至包括iptables在內(nèi)的多款網(wǎng)絡故障排查工具都會受到DNS問題的牽連而導致速度緩慢。在默認情況下,上述所有工具都會盡可能嘗試將IP地址解析為主機名稱。一旦DNS服務器有了毛病,這些命令就會在查找IP地址的過程中停滯不前并最終導致執(zhí)行失效。在ping或traceroute方面,問題表現(xiàn)為整個ping應答周期耗時相當長,但最終的請求往返時間卻比較短。而在netstat與iptables方面,其請求結(jié)果可能會拖延很久才輸出到屏幕上,這是因為系統(tǒng)一直在等待已經(jīng)超時的DNS請求。

在前面提到的各種情況中,我們都能很容易地繞過DNS來保證故障排查結(jié)果的準確性。所有列舉的命令都可以通過添加-n參數(shù)來禁止其將IP地址解析為主機名稱。我也是剛剛養(yǎng)成在所有命令后加-n的好習慣--正如第一章提到的那樣--除非我確定自己想解析IP地址。

注意:DNS解析還可能以其它一些意想不到的方式影響我們的web服務器性能。某些web服務器會根據(jù)配置對訪問的第一個IP地址進行解析,并將得到的主機名稱記錄下來。雖然這會讓記錄信息更具可讀性,但同時也會在出現(xiàn)問題時大大降低web服務器的速度--例如存在大量訪問者時。這時web服務器會忙著解決這些IP地址的解析工作,而選擇將服務流量擱置在一邊。

利用traceroute解決網(wǎng)絡緩慢問題

當處于不同網(wǎng)絡中的服務器與主機間的連接發(fā)生拖慢狀況時,我們可能很難追查到真正的罪魁禍首。尤其是在拖慢以延遲形式(即響應所消耗的時間)出現(xiàn)而不涉及全局帶寬的情況下,真正能力挽狂瀾的就只有traceroute了。正如前文所說,tracerout是一種在遠程網(wǎng)絡中測試客戶機與服務器間全局連接的有效方式,但它同時也能有效診斷出導致網(wǎng)絡緩慢的潛在根源。由于traceroute會輸出當前與目標設備之間每次數(shù)據(jù)轉(zhuǎn)發(fā)所消耗的時間,因此我們可以利用它追蹤由地域相距過大或網(wǎng)關(guān)問題所引發(fā)的過載及網(wǎng)絡緩慢原因。舉例來說,我們利用traceroute檢查美國與中國兩邊的雅虎服務器,輸出結(jié)果如下所示:

$ traceroute yahoo.cn
traceroute to yahoo.cn (202.165.102.205), 30 hops max, 60 byte packets
1 64-142-56-169.static.sonic.net (64.142.56.169) 1.666 ms 2.351 ms 3.038 ms
2 2.ge-1-1-0.gw.sr.sonic.net (209.204.191.36) 1.241 ms 1.243 ms 1.229 ms
3 265.ge-7-1-0.gw.pao1.sonic.net (64.142.0.198) 3.388 ms 3.612 ms 3.592 ms
4 xe-1-0-6.ar1.pao1.us.nlayer.net (69.22.130.85) 6.464 ms 6.607 ms 6.642 ms
5 ae0-80g.cr1.pao1.us.nlayer.net (69.22.153.18) 3.320 ms 3.404 ms 3.496 ms
6 ae1-50g.cr1.sjc1.us.nlayer.net (69.22.143.165) 4.335 ms 3.955 ms 3.957 ms
7 ae1-40g.ar2.sjc1.us.nlayer.net (69.22.143.118) 8.748 ms 5.500 ms 7.657 ms
8 as4837.xe-4-0-2.ar2.sjc1.us.nlayer.net (69.22.153.146) 3.864 ms 3.863 ms 3.865 ms
9 219.158.30.177 (219.158.30.177) 275.648 ms 275.702 ms 275.687 ms
10 219.158.97.117 (219.158.97.117) 284.506 ms 284.552 ms 262.416 ms
11 219.158.97.93 (219.158.97.93) 263.538 ms 270.178 ms 270.121 ms
12 219.158.4.65 (219.158.4.65) 303.441 ms * 303.465 ms
13 202.96.12.190 (202.96.12.190) 306.968 ms 306.971 ms 307.052 ms
14 61.148.143.10 (61.148.143.10) 295.916 ms 295.780 ms 295.860 ms
...

既然不了解有關(guān)網(wǎng)絡的更多細節(jié)信息,我們也能夠單純通過往返時間把握數(shù)據(jù)包的動向。從第九次跳轉(zhuǎn)開始,IP地址變成了219.158.30.177,這意味著數(shù)據(jù)包已經(jīng)離開美國抵達中國,而跳轉(zhuǎn)的往返時間也從3毫秒提高到275毫秒。

#p#

利用iftop找出是誰占用了帶寬

有時候我們的網(wǎng)絡緩慢并不是由遠程服務器或路由器所引起,而只是因為系統(tǒng)中的某些進程占用了太多可用帶寬。雖然從直觀角度我們很難確定哪些進程正在使用帶寬,但也有一些工具能幫大家把這些搗蛋的家伙揪出來。

top就是這樣一款出色的故障排查工具,它的出現(xiàn)還帶來一系列思路相似的衍生品,例如iotop--能夠確定到底是哪些進程占用了大部分磁盤I/O性能。最終名為iftop的工具橫空出世,能夠在網(wǎng)絡連接領(lǐng)域提供同等功能。與top不同,iftop不會親自關(guān)注進程情況,而是列出用戶服務器與遠程IP之間占用帶寬最多的連接對象。舉例來說,我們可以在iftop中快速查看備份服務器IP地址在輸出結(jié)果中的位置來判斷備份工作有沒有大量占用網(wǎng)絡帶寬。

iftop輸出圖示

紅帽與Debian的各個發(fā)行版都能使用iftop這一名稱的軟件包,但在紅帽發(fā)行版方面大家可能需要從第三方資源庫才能獲取。一旦安裝過程完成,我們在命令行中運行iftop命令即可啟用(需要root權(quán)限)。和top命令一樣,我們可以點Q鍵退出。

在iftop界面屏幕的最上方是顯示全局流量的信息欄。信息欄之下則是另外兩列信息,一列為源IP、另一列為目標IP,二者之間以箭頭填充幫助我們了解帶寬被用于從自己的主機向外發(fā)送數(shù)據(jù)還是從遠程主機端接收數(shù)據(jù)。再往下則是另外三個欄位,表示兩臺主機之間在2秒、10秒及40秒中的數(shù)據(jù)傳輸速率。與平均負載相似,大家可以看到目前帶寬使用是否達到峰值,或者在過去的哪個時段達到過峰值。在屏幕的最下方,我們會找到傳輸數(shù)據(jù)(簡稱TX)與接收數(shù)據(jù)(簡稱RX)的總體統(tǒng)計結(jié)果。與top差不多,iftop的界面也會定期更新。

在不添加額外參數(shù)的情況下,iftop命令通常能夠滿足我們故障排查的全部需求;但有的時候,我們可能也希望利用一些選項實現(xiàn)特殊功能。iftop命令在默認情況下會顯示查找到的第一個端口的統(tǒng)計信息,但在某些服務器中大家可能會使用多個端口,所以如果我們希望讓iftop打理第二個以太網(wǎng)端口(即實例中的eth1),那么請輸入iftop -i eth1。

默認情況下,iftop會試圖將所有IP地址通過解析轉(zhuǎn)換為主機名稱。這樣做的缺點在于一旦遠程DNS服務器速度緩慢,報告的生成速度也將隨之慘不忍睹。另外,所有DNS解析活動都會增加額外的網(wǎng)絡流量,而這些都會顯示在iftop的報告界面當中。因此要禁用網(wǎng)絡解析功能,別忘了在iftop命令后面加-n哦。

一般說來,iftop顯示的是主機之間所使用的全局帶寬;但為了幫助大家縮小排查范圍,我們可能希望每臺主機具體使用哪個端口進行通信。畢竟只要找到了主機中占用最大帶寬的網(wǎng)絡端口,我們就可以在判斷是否接入FTP端口之外進行其它排查手段。啟動iftop之后,按P鍵可以切換端口的顯示與隱藏狀態(tài)。不過大家可能會注意到,有時候顯示所有端口狀態(tài)可能導致我們正在關(guān)注的主機被擠出當前顯示屏幕。如果出現(xiàn)這種情況,我們還可以按S或D鍵來僅顯示來自特定源或特定目標的端口。由于服務項目眾多,目標主機可能隨機使用多個端口并發(fā)生帶寬占用峰值,這將導致工具無法識別出正在使用的服務,因此僅顯示源端口還是相當有用的。不過服務器上的端口也可能與當前設備上的服務相對應。在這種情況下,我們可以使用前面提到的netstat -lnp來找出服務所偵聽的端口。

與大多數(shù)Linux命令相似,iftop也擁有多種高級選項。我們在文章中提到的這些已經(jīng)足以涵蓋大多數(shù)故障排查需求,但為了滿足大家進一步了解iftop功能的愿望,我教各位一個小技巧:只要輸入man iftop,就可以閱讀包含在軟件包當中的使用手冊、獲得更多與之相關(guān)的知識。

原文鏈接:http://www.computerworld.com/s/article/9236224/Server_s_down_How_do_I_find_out_what_s_wrong_?taxonomyId=89

責任編輯:路途 來源: 51CTO
相關(guān)推薦

2013-03-25 09:19:10

Linux服務器故障排查

2024-12-04 16:44:51

2013-07-11 09:25:52

2009-08-18 14:57:40

服務器故障排查

2023-11-10 07:23:57

Kubernetes集群網(wǎng)絡

2012-09-21 10:36:54

PHPPHP搭建Web

2010-01-04 15:19:52

2019-06-03 15:02:06

2010-11-22 13:28:28

服務器硬件故障

2025-01-23 08:38:46

2009-12-04 09:47:47

LinuxNFS服務器

2019-12-09 10:40:15

YAMLBashKubernetes

2017-12-04 10:03:45

2017-01-05 13:41:56

2009-06-27 20:20:00

LinuxNFS故障

2009-04-22 17:03:40

Linux服務器七要素

2022-04-18 09:07:54

Linux網(wǎng)絡延遲

2009-09-17 18:09:53

Nis服務器

2009-09-17 16:06:18

2024-03-20 10:48:09

Java 8內(nèi)存管理
點贊
收藏

51CTO技術(shù)棧公眾號