1. 程式人生 > >史上最全的高可用服務系統線上問題排查工具單(一)

史上最全的高可用服務系統線上問題排查工具單(一)

上一篇文章保證高可用Java服務化系統高效執行的必備工具箱介紹了筆者在網際網路公司裡線上應急和技術攻關過程中積累的應用層指令碼和Java虛擬機器命令,這些指令碼和命令在發現問題和定位問題的過程中起到關鍵作用,然而,經常會遇到一些深層次的問題,僅僅通過應用層和JVM虛擬機器層的資訊無法定位問題和解決問題,這時需要深入研究系統級的各種引數和資訊,才能確定問題的根源原因,例如:網路超時、機器負載過高、JVM OOM、JVM和核心Bug等,這篇文章介紹那些重要的Linux基礎和監控相關的命令。

本文並不是介紹Linux命令的手冊,而是側重於命令在特定場景下如何幫助應急人員和攻關人員定位問題並解決問題,因此,對於每個命令的介紹將直切主題,直接介紹命令使用的具體場景,而不是介紹命令的詳細使用格式。

01

必不可少的基礎命令和工具
_

1、grep
grep是Linux下通用的文字內容查詢命令。

也可以利用它列印匹配的上下幾行,線上查詢問題的時候,可以使用下列命令,查詢關鍵字,顯示關鍵字出現行的後5行,並且給關鍵字著色。
使用方式:

grep -5 'parttern' INPUT_FILE #列印匹配行的前後5行

grep -C 5 'parttern' INPUT_FILE #列印匹配行的前後5行

grep -A 5 'parttern' INPUT_FILE #列印匹配行的後5行

$grep -B 5 'parttern' INPUT_FILE #列印匹配行的前5行

grep -A -15  --color 1010061938 * #查詢後著色

2、find
通過檔名稱查詢檔案的存在位置,名稱查詢支援模糊匹配。

使用方式:

find . -name FILE_NAME

命令輸出:

[email protected]:~$ find . -name VestaServer.java
./working/workspace/vesta-id-generator/vesta-server/src/main/java/com/robert/vesta/server/VestaServer.java

3、uptime
檢視機器的啟動時間、登入使用者、平均負載等情況,通常用在線上應急或者技術攻關的時候來確定作業系統的重啟時間。

使用方式:

uptime

命令輸出:

[email protected]:~$ uptime
14:42:30 up  2:51,  3 users,  load average:0.03, 0.06, 0.06

從上面輸出可以看到如下資訊:

當前時間:14:42:30

系統已執行的時間:2小時51分

當前線上使用者:3個使用者

系統平均負載:0.03, 0.06, 0.06,最近1分鐘、5分鐘、15分鐘系統的負載情況

系統平均負載指在特定時間間隔內佇列中執行的平均程序數。如果一個程序滿足以下條件,它其就會位於執行佇列中:

它沒有在等待IO操作的結果

它沒有主動進入等待狀態(也就是沒有呼叫'wait'相關的系統API)

沒有被停止(例如:等待終止)

一般來說,每個CPU核心對應活動程序數不大於3,則系統執行良好,換句話說,也就是活動程序數小於CPU核數的3倍。

舉例說明,如果你的伺服器的cpu有3個核心,那麼只要uptime最後輸出的一串字元數值小於9,即表示系統負載正常。但是,如果系統負載超過10,那就表示當前系統負載過重,需要定位系統執行任務負載超標的原因。

4、lsof
列出系統當前開啟的檔案控制代碼,在Linux檔案系統中,任何資源都是以檔案控制代碼的形式管理的,例如:硬體裝置、檔案、網路套接字等,系統內部為每一種資源分配一個控制代碼,應用程式只能用作業系統分配的控制代碼來引用資源,因此,檔案控制代碼為應用程式與基礎作業系統之間的互動提供了通用的操作介面。

應用程式開啟檔案的描述符列表包含了大量的關於應用程式本身的執行資訊,因此通過lsof工具檢視這個檔案控制代碼列表,對系統監控以及應急排錯提供重要的幫助。

檢視某一個程序開啟的檔案控制代碼:

lsof -p 2862

命令輸出:

[email protected]:~$ lsof -p 2862 | less
COMMAND  PID   USER   FD   TYPE             DEVICE SIZE/OFF    NODE NAME
java    2862 robert  cwd    DIR                8,1     4096  537041 /home/robert/working/workspace/vesta-id-generator/releases/vesta-id-generator-0.0.1-release/bin/vesta-rest-0.0.1
java    2862 robert  rtd    DIR                8,1     4096       2 /
java    2862 robert  txt    REG                8,1     5730 1064639 /home/robert/working/softwares/jdk1.8.0_20/bin/java
java    2862 robert  mem    REG                8,1  7216688 1318996 /usr/lib/locale/locale-archive
java    2862 robert  mem    REG                8,1 65525265 1189622 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/rt.jar
java    2862 robert  mem    REG                8,1    80460 1189581 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/i386/libnio.so
java    2862 robert  mem    REG                8,1   103299 1189580 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/i386/libnet.so
java    2862 robert  mem    REG                8,1    81884 1583248 /usr/share/locale-langpack/zh_CN/LC_MESSAGES/libc.mo
java    2862 robert  mem    REG                8,1  3131363 1189479 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/charsets.jar
java    2862 robert  mem    REG                8,1  3500527 1189621 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/resources.jar
java    2862 robert  mem    REG                8,1  1179307 1330505 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/ext/localedata.jar
java    2862 robert  mem    REG                8,1   615948 1189601 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/jsse.jar
java    2862 robert  mem    REG                8,1  3860522 1330502 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/ext/cldrdata.jar
java    2862 robert  mem    REG                8,1  1065895 1330501 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/ext/bcprov-jdk15-132.jar
......

檢視某一個埠的使用方式:

lsof -i :8080

命令輸出:

[email protected]:~$ lsof -i :8080
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    2862 robert   19u  IPv6  21370      0t0  TCP *:http-alt (LISTEN)

5、ulimit
Linux系統對每個登入使用者,都限制其最大程序數和開啟的最大檔案控制代碼數。為提高效能,可以根據硬體資源的具體情況,設定各個使用者的最大程序數和開啟的最大檔案控制代碼數。

可以用ulimit -a來顯示當前的各種系統對使用者使用資源的限制:

[email protected]:~$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7921
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7921
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

設定使用者的最大程序數:

ulimit -u 10240

設定使用者可以開啟的最大檔案控制代碼數:

ulimit -n xx

6、curl
程式開發後,會使用junit, testng以及jmock, mockito進行單元測試,單元測試後需要進行整合測試,由於當前的線上服務較多使用restful風格,那麼整合測試的時候就需要進行HTTP呼叫,檢視返回的結果是否符合預期,curl命令當然是首選測試的方法。

使用方式:

curl -i  “http://www.sina.com” #列印請求響應頭資訊

curl -v  “http://www.sina.com” #使用post方法
curl -verbose  “http://www.sina.com” #使用post方法

curl -d ‘abc=def’ “http://www.sina.com” #使用head方法

curl -I "http://www.sina.com" #列印HTTP響應碼

curl -sw '%{http_code}'  "http://www.sina.com" #列印HTTP響應碼

7、scp
scp命令是Linux系統中功能強大的檔案傳輸命令,可以實現從本地到遠端以及遠端到本地的雙向檔案傳輸,用起來非常的方便。常用來在線上定位問題時,將線上的一些檔案下載到本地進行詳查,或者將本地的修改上傳到伺服器上。

使用方式:

scp [email protected]:/home/robert/test.txt .

scp ./test.txt [email protected]:/home/robert/

8、vi & vim
vi和vim是Linux中最常用的命令列文字編輯工具,vim是vi的升級版本,在某些Linux版本下,vi實際上通過軟連線指向vim。

筆者常用的vi/vim命令如下:

h:左移一個字元

l:右移一個字元,這個命令很少用,一般用w代替

k:上移一個字元

j:下移一個字元

set number:顯示行號

shift + g:移動到最後一行

1 + shift + g:移動到第一行

n + shift + g:移動到第n行

0: 移動到行首

$:移動到行尾

/text:查詢text,按n健查詢下一個,按N健查詢前一個

?text:查詢text,反向查詢,按n健查詢下一個,按N健查詢前一個

i:在當前位置生前插入

I:在當前行首插入

a:在當前位置後插入

A:在當前行尾插入

o:在當前行之後插入一行

O:在當前行之前插入一行

%s/old/new/g:用old替換new,替換當前行的所有匹配

ctrl + f:向下滾動一屏

ctrl + b:向上滾動一屏

u:撤銷

U:撤銷對整行的操作

Ctrl + r:重做,即撤銷的撤銷

x:刪除當前字元

dd:刪除當前行

10d:刪除當前行開始的10行

yy:拷貝當前行

p:在當前游標後貼上,如果之前使用了yy命令來複制一行,那麼就在當前行的下一行貼上

:wq:儲存並退出

:q!:強制退出並忽略所有更改

有了這些命令,基本可以在Linux系統命令列下做開發了,無論是開發指令碼,還是線上應急或者技術攻關過程中在Linux系統中做編輯,都沒有問題,建議大家把上面這個命令列表打印出來,貼在辦公桌上,需要的時候可以看一眼,久而久之就記住了。

9、dos2unix&unix2dos
用於轉換windows和unix的換行符,通常在windows上開發的指令碼和配置,上傳到unix上都需要轉換。

使用方式:

[email protected]:~$ dos2unix test.txt 
dos2unix:converting file test.txt to Unix format ...

[email protected]:~$ unix2dos test.txt 
unix2dos:converting file test.txt to DOS format ...

02

檢視活動程序的命令
_

1、ps
顯示系統內所有的程序。

使用方式:

ps -elf

輸出:

[email protected]:~$ ps -elf
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root         1     0  0  80   0 -  8477 poll_s 09:56 ?        00:00:01 /sbin/init
1 S root         2     0  0  80   0 -     0 kthrea 09:56 ?        00:00:00 [kthreadd]
1 S root         3     2  0  80   0 -     0 smpboo 09:56 ?        00:00:00 [ksoftirqd/0]
1 S root         4     2  0  80   0 -     0 worker 09:56 ?        00:00:00 [kworker/0:0]
1 S root         5     2  0  60 -20 -     0 worker 09:56 ?        00:00:00 [kworker/0:0H]
1 S root         7     2  0  80   0 -     0 rcu_gp 09:56 ?        00:00:00 [rcu_sched]
1 S root         8     2  0  80   0 -     0 rcu_no 09:56 ?        00:00:00 [rcuos/0]
1 R root         9     2  0  80   0 -     0 ?      09:56 ?        00:00:00 [rcuos/1]
1 S root        10     2  0  80   0 -     0 rcu_no 09:56 ?        00:00:00 [rcuos/2]
1 S root        11     2  0  80   0 -     0 rcu_no 09:56 ?        00:00:00 [rcuos/3]
1 S root        12     2  0  80   0 -     0 rcu_gp 09:56 ?        00:00:00 [rcu_bh]
1 S root        13     2  0  80   0 -     0 rcu_no 09:56 ?        00:00:00 [rcuob/0]
1 S root        14     2  0  80   0 -     0 rcu_no 09:56 ?        00:00:00 [rcuob/1]
1 S root        15     2  0  80   0 -     0 rcu_no 09:56 ?        00:00:00 [rcuob/2]
1 S root        16     2  0  80   0 -     0 rcu_no 09:56 ?        00:00:00 [rcuob/3]
......

根據程序的名字或者其他資訊,通過grep命令找到目標程序,也可以列印程序啟動指令碼的全路徑。

2、top
檢視活動程序的CPU和記憶體資訊的工具命令,能夠實時顯示系統中各個程序的資源佔用情況。可以按CPU和記憶體的使用情況和執行時間對程序進行排序。

使用方式:

top

命令輸出:

top - 10:18:49 up 22 min,  2 users,  load average:0.10, 0.31, 0.22
   Tasks:195 total,   2 running, 193 sleeping,   0 stopped,   0 zombie
   %Cpu(s): 1.8 us,  0.2 sy,  0.0 ni, 98.0 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
   KiB Mem:  2049416 total,  1636620 used,   412796 free,   117652 buffers
   KiB Swap: 2095100 total,     1480 used,  2093620 free.   643848 cached Mem
   
     PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                           
    1608 root      20   0  475836  74616  30232 S   4.0  3.6   0:12.21 Xorg                                                              
    2363 robert    20   0 1380660 103000  63884 S   2.7  5.0   0:12.15 compiz                                                            
    2157 robert    20   0  589920  30748  24412 S   1.3  1.5   0:00.98 unity-panel-ser                                                   
    2769 robert    20   0  597884  35820  28008 S   0.7  1.7   0:04.95 gnome-terminal                                                    
    ...

從輸出中可以看到整體的cpu佔用率、cpu負載的情況、程序佔用CPU和記憶體等資源的情況。另外top命令的輸出把cache放在了swap一行,這並不重要,實際上它和swap沒有太大的關係。

我們可以用top命令的快捷鍵轉換輸出的顯示資訊:

t:切換顯示程序和 CPU 狀態資訊

m:切換顯示程序和 CPU 狀態資訊

A:分類顯示各種系統資源的消耗情況。可用於快速識別系統的效能要求極高的任務

o:改變顯示專案的順序

r:重新設定程序的優先級別(系統提示使用者輸入需要改變的程序PID以及需要設定
的優先順序值)

k:終止一個程序(系統將提示使用者輸入需要終止的程序PID)

s:改變重新整理的時間間隔

u:檢視指定使用者的程序

03

窺探記憶體的命令
_

1、free
此命令顯示系統記憶體的使用情況,包括總體記憶體、已經使用的記憶體、以及系統核心使用的緩衝區,包括快取(buffer)和緩衝(cache)等。

使用方式:

free

命令輸出:

[email protected]:~$ free
            total       used       free     shared    buffers     cached
Mem:      2049416    1646480     402936      13280     118596     646288
-/+ buffers/cache:    881596    1167820
Swap:     2095100       1480    2093620

記憶體使用並不只有簡單的佔用和空閒兩個狀態,從上面的輸出發現裡面有buffer和cache的資料,從字面意義上來講,都是快取,那麼弄清楚快取什麼資料才能有效的區分這兩種快取。

從上面命令的輸出,我們可以看到,Buffer 118M, Cache 646M。其實,這兩個記憶體區域都是用來快取磁碟資料的,只不過快取的資料是不同的:

buffers一般都不太大,在一個通用的Linux系統中,一般都是在幾十到幾百M位元組,用於儲存磁碟塊裝置的元資料,比如哪些塊屬於哪些檔案,檔案的許可權,目錄等資訊。

cached一般會很大, 一般都是G位元組以上, 用於儲存讀寫檔案的頁, 當對一個檔案進行讀的時候, 會取磁碟檔案頁到此記憶體區域,然後從記憶體進行讀取,當寫入一個檔案,會先寫到此快取,並將相關的頁面標記為”dirty”。

buffers用於儲存元資料,一般佔用的空間不大,對它的關注也不多,cached一般會很大,隨著讀寫磁碟的多少而自動的增加而減少,這也取決於實體記憶體是否夠用,如果應用使用實體記憶體較多,作業系統會適當的縮小cached來保證使用者程序對記憶體的需要。

2、pmap
此命令用來報告程序佔用記憶體的詳細情況,可以用來查出某些記憶體瓶頸問題的根源原因。

使用方式:

pmap -d 2862

命令輸出:

[email protected]:~$ pmap -d 2862
2862:  java -server -Xms512m -Xmx512m -Xmn128m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60 -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -Xloggc:./logs/gc.log -cp /home/robert/working/workspace/vesta-id-generator/releases/vesta-id-generator-0.0.1-release/bin/vesta-rest-0.0.1/extlib -jar ./lib/vesta-rest-0.0.
Address           Kbytes Mode  Offset           Device    Mapping
0000000008048000       4 r-x-- 0000000000000000 008:00001 java
0000000008049000       4 rw--- 0000000000000000 008:00001 java
000000000a017000     872 rw--- 0000000000000000 000:00000   [ anon ]
00000000be800000     896 rw--- 0000000000000000 000:00000   [ anon ]
00000000be8e0000     128 ----- 0000000000000000 000:00000   [ anon ]
00000000be900000    1920 rw--- 0000000000000000 000:00000   [ anon ]
00000000beae0000     128 ----- 0000000000000000 000:00000   [ anon ]
00000000beb00000     284 rw--- 0000000000000000 000:00000   [ anon ]
......

這個命令顯示比較底層的程序模組佔用記憶體的資訊,並且可以列印記憶體的起止地址等,用於定位深層次JVM或者作業系統的記憶體問題。

04

CPU使用情況監控命令
_

1、vmstat
此命令顯示關於核心執行緒、虛擬記憶體、磁碟IO、陷阱和CPU佔用率的統計資訊。

使用方式:

vmstat

命令輸出:

[email protected]:~$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2  0   1480 404300 118252 646216    0    0    78    31   63  145  2  0 97  1  0

這裡面需要注意的是:

buff是IO系統用來做儲存磁碟塊檔案元資料的資訊

cache是作業系統用來快取磁碟資料的緩衝區,作業系統會自動調節這個引數,在記憶體緊張的時候作業系統會減少cache的佔用空間來保證其他程序可用

cs引數表達執行緒切換次數,此資料太大表明執行緒同步機制有問題

si和so如果較大說明系統頻繁使用交換區,應該檢視作業系統記憶體是否夠用

bi和bo代表IO活動,根據大小可以知道磁碟的負載

2、mpstat
實時監控系統CPU的一些統計資訊,這些資訊存放在/proc/stat檔案中,在多核CPU系統裡,其不但能檢視所有CPU的平均使用資訊,而且能夠檢視某一個特定CPU的資訊。

使用方式:

mpstat -P ALL

命令輸出:

[email protected]:~$ mpstat -P ALL
Linux 3.16.0-30-generic (robert-ubuntu1410)     2017年04月23日     _x86_64_    (4 CPU)

11時12分38秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11時12分38秒  all    0.54    0.55    0.23    0.57    0.00    0.04    0.00    0.00    0.00   98.07
11時12分38秒    0    0.75    1.41    0.35    1.06    0.00    0.11    0.00    0.00    0.00   96.32
11時12分38秒    1    0.51    0.22    0.22    0.48    0.00    0.01    0.00    0.00    0.00   98.57
11時12分38秒    2    0.52    0.58    0.18    0.29    0.00    0.02    0.00    0.00    0.00   98.41
11時12分38秒    3    0.40    0.01    0.15    0.45    0.00    0.01    0.00    0.00    0.00   98.98

我們可以看到每個CPU核心的佔用率、IO等待、軟中斷、硬中斷等。

05

磁碟IO監控命令
_

1、iostat
監視CPU佔用率和平均負載值,以及IO讀寫速度等。

這個命令的輸出的每個欄位都非常有用,r/s和w/s指的是IOPS,rkB/s和wkB/s指的是每秒的存取速度,await是平均等待時間,一般都在10ms左右。

另外,iotop、ioprofiler、blktrace可以監控更多底層的IO活動資訊,本文就不展開介紹,vmstat、mpstat也有一些IO相關的資訊輸出。

使用方式:

iostat -x

命令輸出:

[email protected]:~$ iostat -x
Linux 3.16.0-30-generic (robert-ubuntu1410)     2017年04月23日     _x86_64_    (4 CPU)

avg-cpu: %user   %nice %system %iowait  %steal   %idle
          0.61    0.68    0.31    0.70    0.00   97.72

Device:        rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               2.69     3.43   11.92    1.56   217.23   118.91    49.87     0.21   15.45    9.39   61.69   2.18   2.94

從命令輸出可以看出:

iowait較大說明IO負載大,IO等待比較嚴重,磁碟讀寫遇到瓶頸。

可以直接看到每秒讀寫速度的最大峰值。

也可以看到CPU的佔用率情況。

2、swapon
檢視交換分割槽的使用情況。

使用方式:

/sbin/swapon -s

命令輸出:

[email protected]:~/tmp$ /sbin/swapon -s
Filename                Type        Size    Used    Priority
/dev/sda6              partition   4094972 708384   -1

由輸出可見交換分割槽共4G,已使用大約708M。

3、df
檢視檔案系統的硬碟掛載點和空間使用情況。

使用方式:

df

命令輸出:

[email protected]:~/tmp$ df -h
檔案系統        容量  已用  可用 已用% 掛載點
/dev/sda5       220G   84G  125G   40% /
none            4.0K     0  4.0K    0% /sys/fs/cgroup
udev            2.0G  4.0K  2.0G    1% /dev
tmpfs           395M  1.3M  393M    1% /run
none            5.0M     0  5.0M    0% /run/lock
none            2.0G   52M  1.9G    3% /run/shm
none            100M   60K  100M    1% /run/user

06

檢視網路資訊和網路監控命令
_

1、ifconfig
ifconfig可以檢視機器掛載的網絡卡情況。

使用方式:

ifconfig -a

命令輸出:

[email protected]:~$ ifconfig -a
eth0      Link encap:乙太網  硬體地址 08:00:27:2f:70:b6  
         inet 地址:192.168.1.102  廣播:192.168.1.255  掩碼:255.255.255.0
         inet6 地址:fe80::a00:27ff:fe2f:70b6/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  躍點數:1
         接收資料包:14392 錯誤:0 丟棄:0 過載:0 幀數:0
         傳送資料包:8665 錯誤:0 丟棄:0 過載:0 載波:0
         碰撞:0 傳送佇列長度:1000 
         接收位元組:15021524 (15.0 MB)  傳送位元組:858553 (858.5 KB)

lo        Link encap:本地環回  
         inet 地址:127.0.0.1  掩碼:255.0.0.0
         inet6 地址:::1/128 Scope:Host
         UP LOOPBACK RUNNING  MTU:65536  躍點數:1
         接收資料包:4161 錯誤:0 丟棄:0 過載:0 幀數:0
         傳送資料包:4161 錯誤:0 丟棄:0 過載:0 載波:0
         碰撞:0 傳送佇列長度:0 
         接收位元組:331544 (331.5 KB)  傳送位元組:331544 (331.5 KB)

可見機器有兩個網絡卡,一個是eth0,一個是本地迴環虛擬網絡卡。

2、ping
ping命令是檢測網路故障常用的命令,可以用來測試一臺主機到另外一臺主機的網路是否聯通。

使用方式:

ping www.baidu.com

命令輸出:

[email protected]:~$ ping www.baidu.com
PING www.a.shifen.com (111.13.100.92) 56(84) bytes of data.
64 bytes from localhost (111.13.100.92):icmp_seq=1 ttl=54 time=4.91 ms
64 bytes from localhost (111.13.100.92):icmp_seq=2 ttl=54 time=8.76 ms
^C
--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 4.917/6.838/8.760/1.923 ms

3、telnet
telnet是TCP/IP協議族的一員,是網路遠端登陸服務的標準協議,它為使用者提供了在本地計算機上連線遠端主機的能力和主要方式。

使用方式:

telnet IP PORT

命令輸出:

robert at robert in ~/working/softwares/redis-3.0.5/src $ telnet localhost 6379Trying ::1...
Connected to localhost.
Escape character is '^]'.
get hello
$3
world

從上面輸出可以看到,使用telnet協議可以直接連線redis埠,併發送redis命令。

4、nc
nc是NetCat的簡稱,在網路除錯工具享有“瑞士軍刀”的美譽,此命令功能豐富、短小精悍、簡單實用,被設計成為一個易用的網路工具,可通過TCP/UDP協議傳輸資料。同時,它也是一個網路應用除錯分析器,因為它可以根據需要建立各種不同型別的網路服務和連線,在除錯Restful服務的時候,經常會發生不可預期的結果,這種情況下可以使用nc模擬啟動伺服器,把HTTP客戶端連線到nc上,nc上會打印出Restful服務提供的所有引數,然後一一檢查引數,找到問題。

當然,也可用於傳輸二進位制或者文字檔案。

傳輸檔案端:

[email protected]:~$ nc localhost 8888 < test.txt

接受檔案端:

[email protected]:~$ nc -l 8888
12345678

5、mtr
Linux系統中的網路連通性測試工具,也可以用來檢測丟包率。

使用方式:

mtr -r sina.com

命令輸出:

[email protected]:~$ mtr -r sina.com
Start:Sun Apr 23 16:40:27 2017
HOST:robert-ubuntu1410           Loss%   Snt   Last   Avg  Best  Wrst StDev
 1.|-- 192.168.1.1                0.0%    10    2.0   2.5   0.9  10.4   2.7
 2.|-- 172.30.44.1                0.0%    10    6.4   7.5   5.8  13.8   2.3
 3.|-- 10.1.10.201                0.0%    10    3.0   3.4   3.0   4.2   0.0
 4.|-- 111.63.14.97               0.0%    10    5.5   6.6   5.1  16.4   3.4
 5.|-- 111.11.74.9               90.0%    10   10.8  10.8  10.8  10.8   0.0
 6.|-- 111.11.65.117             90.0%    10    7.9   7.9   7.9   7.9   0.0
 7.|-- 221.183.26.205            80.0%    10    8.0   9.1   8.0  10.1   1.4
 8.|-- 221.176.16.250            80.0%    10   11.9  12.8  11.9  13.8   1.0
 9.|-- 221.176.21.194            90.0%    10   11.6  11.6  11.6  11.6   0.0
10.|-- 202.97.15.177             90.0%    10   25.1  25.1  25.1  25.1   0.0
11.|-- 202.97.88.237             90.0%    10   14.1  14.1  14.1  14.1   0.0
12.|-- 202.97.53.110              0.0%    10   20.4  16.0  13.7  20.4   2.1
13.|-- 202.97.58.114              0.0%    10   14.4  17.9  14.4  21.4   2.4
14.|-- 202.97.51.86              40.0%    10  211.2 207.4 204.9 211.2   2.5
15.|-- 203.14.186.34              0.0%    10  224.7 201.3 194.9 224.7  10.3
16.|-- 218.30.41.234              0.0%     9  218.1 219.6 215.3 238.7   7.3
17.|-- ???                       100.0     9    0.0   0.0   0.0   0.0   0.0

其中第二列為丟包率,可以用來判斷網路中兩臺機器連通性的質量。

6、nslookup
是一款檢測網路中DNS伺服器的是否能夠正確解析域名的工具命令,並且可以輸出。

使用方式:

nslookup sina.com

命令輸出:

[email protected]:~$ nslookup sina.com
Server:     127.0.1.1
Address:    127.0.1.1#53Non-authoritative answer:
Name:   sina.com
Address:66.102.251.33

從輸出可以看到,sina.com域名被正確解析到IP地址66.102.251.33。

7、traceroute
traceroute可以提供從你的主機到網際網路另一端的主機走的什麼路徑,然而,每次資料包由某一同樣的出發點到達某一同樣的目的地走的路徑可能會不一樣,但通常來說大部分時候所走的路徑是相同的。

使用方式:

traceroute sina.com

命令輸出:

[email protected]:~$ traceroute sina.com 
traceroute to sina.com (66.102.251.33), 30 hops max, 60 byte packets
1  192.168.1.1 (192.168.1.1)  4.373 ms  4.351 ms  4.337 ms
2  172.30.44.1 (172.30.44.1)  9.573 ms  10.107 ms  10.422 ms
3  10.1.1.2 (10.1.1.2)  4.696 ms  4.473 ms  4.637 ms
4  111.63.14.97 (111.63.14.97)  6.118 ms  6.929 ms  6.904 ms
5  * * *
6  * * *
7  * * *
8  * * *
9  * * *
10  * * 221.176.23.54 (221.176.23.54)  22.312 ms
11  * * *
12  202.97.53.86 (202.97.53.86)  17.421 ms 202.97.53.34 (202.97.53.34)  29.006 ms 202.97.53.114 (202.97.53.114)  15.464 ms
13  202.97.58.114 (202.97.58.114)  17.840 ms 202.97.58.122 (202.97.58.122)  16.655 ms  20.011 ms
14  202.97.51.86 (202.97.51.86)  207.216 ms  207.157 ms  211.004 ms
15  203.14.186.34 (203.14.186.34)  199.606 ms  196.477 ms  195.614 ms
16  218.30.41.234 (218.30.41.234)  215.134 ms  214.705 ms  220.728 ms
17  66.102.251.33 (66.102.251.33)  209.436 ms  210.263 ms  208.335 ms

上面輸出中記錄按序列號從1開始,每個紀錄就是網路一跳,每跳一次表示經過一個閘道器或者路由,我們看到每行有三個時間,單位是毫秒,指的是這一跳每次需要的時間。

8、sar
sar是一個多功能的監控工具,使用簡單方便,不需要管理員許可權,可以輸出每秒的磁碟存取速度,適合線上排查問題時使用,命令小巧實用。

使用方式:

sar -n DEV 1 1

命令輸出:

[email protected]:~$ sar -n DEV 1 1
Linux 3.16.0-30-generic (robert-ubuntu1410)     2017年04月23日     _x86_64_    (4 CPU)

11時02分43秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
11時02分44秒      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
11時02分44秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

平均時間:    IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
平均時間:     eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
平均時間:       lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

從上面的用法可以看到網絡卡的讀寫速度和流量,在現實的應急過程中,可以用來判斷伺服器是否上量。

此命令除了可以檢視網絡卡的資訊以外,sar可以用來收集更多的服務的狀態資訊:

-A:所有報告的總和

-u:CPU利用率

-v:程序、I節點、檔案和鎖表狀態

-d:硬碟使用報告

-r:沒有使用的記憶體頁面和硬碟塊

-g:串列埠 I/O的情況

-b:緩衝區使用情況

-a:檔案讀寫情況

-c:系統呼叫情況

-R:程序的活動情況

-y:終端裝置活動情況

-w:系統交換活動

9、netstat(ss)
此命令顯示網路連線、埠資訊等,另外一個命令ss與netstat命令類似,就不單獨介紹。

1根據程序查詢埠
1).根據程序名字查詢程序ID:

ps -elf | grep 程序

輸出為:

[email protected]:~$ ps -elf | grep vesta
0 S robert    2862  1988 10  80   0 - 233215 futex_ 10:00 pts/0   00:00:22 java -server -Xms512m -Xmx512m -Xmn128m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60 -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -Xloggc:./logs/gc.log -cp /home/robert/working/workspace/vesta-id-generator/releases/vesta-id-generator-0.0.1-release/bin/vesta-rest-0.0.1/extlib -jar ./lib/vesta-rest-0.0.1.jar
0 R robert    2963  2778  0  80   0 -  3993 -      10:04 pts/0    00:00:00 grep --color=auto vesta
  獲得程序ID為2862。

2).根據程序ID查詢程序開啟的埠:

netstat -nap | grep 6588

輸出為:

[email protected]:~$ netstat -nap | grep 2862
tcp6       0      0 :::8080                 :::*                    LISTEN      2862/java       
unix  2      [ ]         流        已連線     21371    2862/java

獲得監聽埠為8080。

2 根據埠查詢程序
1)查詢使用埠的程序號:

netstat -nap | grep 8080

輸出為:

[email protected]:~$ netstat -nap | grep 8080

tcp6 0 0 :::8080 :::* LISTEN 2862/java

獲得程序ID為2862。

2)根據程序ID查詢程序的詳細資訊。

ps -elf | grep 2862

輸出為:

[email protected]:~$ ps -elf | grep 2862
0 S robert    2862  1988  3  80   0 - 233215 futex_ 10:00 pts/0   00:00:23 java -server -Xms512m -Xmx512m -Xmn128m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60 -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -Xloggc:./logs/gc.log -cp /home/robert/working/workspace/vesta-id-generator/releases/vesta-id-generator-0.0.1-release/bin/vesta-rest-0.0.1/extlib -jar ./lib/vesta-rest-0.0.1.jar

10、iptraf
iptraf是一個實時檢視網路流量的互動式的彩色的文字螢幕介面的監控工具。監控的資料比較全面,可輸出TCP連線、網路介面、協議、埠、包大小等資訊,但是耗費系統資源比較多,需要管理員許可權。

使用方式:

sudo iptraf

命令輸出:
image
在進入主介面之前可以選擇不同的選項,在不同的選項下,可以檢視不同維度的網路資訊。

11、tcpdump
網路狀況分析跟蹤工具,可以用來抓包的一個實用的命令。要使用該工具,需要對TCP/IP協議有所熟悉,因為過濾使用的資訊都來自TCP/IP協議的格式。

顯示來源IP或者目的IP為192.168.1.102的網路通訊:

sudo tcpdump  -i eth0 host 192.168.1.102

顯示去往102.168.1.102的所有ftp會話資訊:

tcpdump -i eth1 'dst 192.168.1.102 and (port 21 or 20)'

顯示去往102.168.1.102的所有HTTP會話資訊:

tcpdump -ni eth0 'dst 192.168.1.102 and tcp and port 8080'

12、nmap
掃描某一主機開啟的埠以及埠提供的服務資訊,通常用於檢視本機哪些埠對外提供服務,或者確定伺服器哪些埠對外開放。

使用方式:

nmap -v -A localhost

命令輸出:

[email protected]:~$ nmap -v -A localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2017-04-23 12:11 CST
NSE:Loaded 110 scripts for scanning.
NSE:Script Pre-scanning.
Initiating Ping Scan at 12:11
Scanning localhost (127.0.0.1) [2 ports]
Completed Ping Scan at 12:11, 0.00s elapsed (1 total hosts)
Initiating Connect Scan at 12:11
Scanning localhost (127.0.0.1) [1000 ports]
Discovered open port 22/tcp on 127.0.0.1
Discovered open port 8080/tcp on 127.0.0.1
Discovered open port 25/tcp on 127.0.0.1
Discovered open port 3306/tcp on 127.0.0.1
Discovered open port 631/tcp on 127.0.0.1
Completed Connect Scan at 12:11, 0.01s elapsed (1000 total ports)
Initiating Service scan at 12:11
Scanning 5 services on localhost (127.0.0.1)
Completed Service scan at 12:11, 6.04s elapsed (5 services on 1 host)
NSE:Script scanning 127.0.0.1.
Initiating NSE at 12:11
Completed NSE at 12:11, 0.22s elapsed
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00025s latency).
Not shown:995 closed ports
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     (protocol 2.0)
| ssh-hostkey:1024 95:41:c2:46:25:8d:bc:2d:d1:15:c6:90:ca:a7:8b:bc (DSA)
| 2048 47:32:93:bf:49:df:9c:e7:d7:c5:f8:ef:92:e3:28:c2 (RSA)
|_256 bd:ef:f2:21:01:b1:cb:78:c7:42:a8:f3:5f:40:e3:37 (ECDSA)
25/tcp   open  smtp    Postfix smtpd
|_smtp-commands:robert-ubuntu1410, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, 
| ssl-cert:Subject:commonName=ubuntu-kylin
| Issuer:commonName=ubuntu-kylin
| Public Key type:rsa
| Public Key bits:2048
| Not valid before:2015-10-24T08:56:26+00:00
| Not valid after: 2025-10-21T08:56:26+00:00
| MD5:  2458 afb6 3955 335a b4ad 171e 3917 b222
|_SHA-1:eb49 e335 4352 ccd7 4582 aa2d 1002 7eb3 725e 9045
|_ssl-date:2103-09-27T17:18:12+00:00; +86y157d13h06m52s from local time.
631/tcp  open  ipp     CUPS 1.7
| http-methods:GET HEAD OPTIONS POST PUT
| Potentially risky methods:PUT
|_See http://nmap.org/nsedoc/scripts/http-methods.html
| http-robots.txt:1 disallowed entry 
|_/
|_http-title:Home - CUPS 1.7.2
3306/tcp open  mysql   MySQL 5.5.54-0ubuntu0.14.04.1
| mysql-info:Protocol:10
| Version:5.5.54-0ubuntu0.14.04.1
| Thread ID:38
| Some Capabilities:Long Passwords, Connect with DB, Compress, ODBC, Transactions, Secure Connection
| Status:Autocommit
|_Salt:yB|ixB~v
8080/tcp open  http    Apache Tomcat/Coyote JSP engine 1.1
|_http-favicon:Unknown favicon MD5:0488FACA4C19046B94D07C3EE83CF9D6
| http-methods:GET HEAD POST PUT DELETE TRACE OPTIONS PATCH
| Potentially risky methods:PUT DELETE TRACE PATCH
|_See http://nmap.org/nsedoc/scripts/http-methods.html
|_http-title:Site doesn't have a title (application/json;charset=UTF-8).
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at http://www.insecure.org/cgi-bin/servicefp-submit.cgi :
SF-Port22-TCP:V=6.40%I=7%D=4/23%Time=58FC2968%P=x86_64-pc-linux-gnu%r(NULL
SF:,2B,"SSH-2\.0-OpenSSH_6\.6\.1p1\x20Ubuntu-2ubuntu2\.8\r\n");
Service Info:Host: robert-ubuntu1410

NSE:Script Post-scanning.
Initiating NSE at 12:11
Completed NSE at 12:11, 0.00s elapsed
Read data files from:/usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done:1 IP address (1 host up) scanned in 6.49 seconds

從上面的輸出可以看到,多個埠對外提供服務:

Discovered open port 22/tcp on 127.0.0.1

Discovered open port 8080/tcp on 127.0.0.1

Discovered open port 25/tcp on 127.0.0.1

Discovered open port 3306/tcp on 127.0.0.1

Discovered open port 631/tcp on 127.0.0.1

其中,8080是Vesta發號器對外提供的服務,3306是mysql對外提供的服務。

07

Linux系統高階工具
_

1、pstack
pstack命令用來顯示每個程序的呼叫棧。可以使用pstack來檢視程序正在掛起的執行方法,也可以用來檢視程序的本地執行緒堆疊,與JVM的jstack配合可以看到JVM執行緒執行的全景。

使用方式:

pstack 2862

命令輸出:

pstack 9040 >> /tmp/pstack.log

Thread 289 (Thread 0x7f8928bdb700 (LWP 9041)):
#0  0x00000032a480ea5d in accept () from /lib64/libpthread.so.0
#1  0x00007f88735eaad7 in NET_Accept () from /apps/product/jdk1.6.0_19/jre/lib/amd64/libnet.so
#2  0x00007f88735e6ad0 in Java_java_net_PlainSocketImpl_socketAccept () from /apps/product/jdk1.6.0_19/jre/lib/amd64/libnet.so
#3  0x00007f8921010c48 in ?? ()
#4  0x00007f88fca90bd8 in ?? ()
#5  0x00007f88fca90c20 in ?? ()
#6  0x0000000000000001 in ?? ()
#7  0x00007f8928bd9c28 in ?? ()
#8  0x0000000000000000 in ?? ()

Thread 288 (Thread 0x7f88809fe700 (LWP 9042)):
#0  0x00000032a480b5bc in [email protected]@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1  0x00007f89291b6757 in os::PlatformEvent::park() () from /apps/product/jdk1.6.0_19/jre/lib/amd64/server/libjvm.so
#2  0x00007f892918fc45 in Monitor::IWait(Thread*, long) () from /apps/product/jdk1.6.0_19/jre/lib/amd64/server/libjvm.so
#3  0x00007f892919040e in Monitor::wait(bool, long, bool) () from /apps/product/jdk1.6.0_19/jre/lib/amd64/server/libjvm.so
#4  0x00007f8928f413b5 in GCTaskManager::get_task(unsigned int) () from /apps/product/jdk1.6.0_19/jre/lib/amd64/server/libjvm.so
#5  0x00007f8928f42663 in GCTaskThread::run() () from /apps/product/jdk1.6.0_19/jre/lib/amd64/server/libjvm.so
#6  0x00007f89291b702f in java_start(Thread*) () from /apps/product/jdk1.6.0_19/jre/lib/amd64/server/libjvm.so
#7  0x00000032a48079d1 in start_thread () from /lib64/libpthread.so.0
#8  0x00000032a40e886d in clone () from /lib64/libc.so.6
......

2、strace
系統呼叫工具,是Linux系統下的一款程式除錯工具,用來監控一個應用程式所使用的

系統呼叫,通過它可以跟蹤系統呼叫,讓你熟悉一個Linux程式在背後是怎麼工作的。

適用於想研究Linux底層的工作機制,或者JVM和Linux系統本身的bug導致的技術攻關的場景。

由於虛擬機器有問題,沒有收集到這部分的輸出資訊 :(
原文釋出時間為:2018-12-19
本文作者:雲時代架構
本文來自雲棲社群合作伙伴“ [雲時代架構](https://mp.weixin.qq.com/s/d_Tl6eiTmpde6eGT5pTaCg
)”,瞭解相關資訊可以關注“cloudate”微信公眾號