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


本文並不是介紹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

命令輸出:

robert@robert-ubuntu1410:~$ find . -name VestaServer.java
./working/workspace/vesta-id-generator/vesta-server/src/main/java/com/robert/vesta/server/VestaServer.java


3、uptime

查看機器的啓動時間、登錄用戶、平均負載等情況,通常用在線上應急或者技術攻關的時候來確定操作系統的重啓時間。


使用方式:

uptime

命令輸出:

robert@robert-ubuntu1410:~$ uptime
144230 up  251,  3 users,  load average:0.03, 0.06, 0.06


從上面輸出可以看到如下信息:

  1. 當前時間:14:42:30

  1. 系統已運行的時間:2小時51分

  2. 當前在線用戶:3個用戶

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


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

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

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

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


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


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


4、lsof

列出系統當前打開的文件句柄,在Linux文件系統中,任何資源都是以文件句柄的形式管理的,例如:硬件設備、文件、網絡套接字等,系統內部爲每一種資源分配一個句柄,應用程序只能用操作系統分配的句柄來引用資源,因此,文件句柄爲應用程序與基礎操作系統之間的交互提供了通用的操作接口。

應用程序打開文件的描述符列表包含了大量的關於應用程序本身的運行信息,因此通過lsof工具查看這個文件句柄列表,對系統監控以及應急排錯提供重要的幫助。


查看某一個進程打開的文件句柄:

lsof -p 2862

命令輸出:

robert@robert-ubuntu1410:~$ 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

命令輸出:

robert@robert-ubuntu1410:~$ 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來顯示當前的各種系統對用戶使用資源的限制:

robert@robert-ubuntu1410:~$ 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 robert@192.168.1.1:/home/robert/test.txt .

scp ./test.txt robert@192.168.1.1:/home/robert/


8、vi & vim

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


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

  1. h:左移一個字符

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

  2. k:上移一個字符

  3. j:下移一個字符

  4. set number:顯示行號

  5. shift + g:移動到最後一行

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

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

  8. 0: 移動到行首

  9. $:移動到行尾

  10. /text:查找text,按n健查找下一個,按N健查找前一個

  11. ?text:查找text,反向查找,按n健查找下一個,按N健查找前一個

  12. i:在當前位置生前插入

  13. I:在當前行首插入

  14. a:在當前位置後插入

  15. A:在當前行尾插入

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

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

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

  19. ctrl + f:向下滾動一屏

  20. ctrl + b:向上滾動一屏

  21. u:撤銷

  22. U:撤銷對整行的操作

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

  24. x:刪除當前字符

  25. dd:刪除當前行

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

  27. yy:拷貝當前行

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

  29. :wq:保存並退出

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


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


9、dos2unix&unix2dos

用於轉換windows和unix的換行符,通常在windows上開發的腳本和配置,上傳到unix上都需要轉換。

使用方式:

robert@robert-ubuntu1410:~$ dos2unix test.txt 
dos2unix:converting file test.txt to Unix format ...

robert@robert-ubuntu1410:~$ unix2dos test.txt 
unix2dos:converting file test.txt to DOS format ...


02

查看活動進程的命令

_____


1、ps

顯示系統內所有的進程。


使用方式:

ps -elf

輸出:

robert@robert-ubuntu1410:~$ 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 ?        000001 /sbin/init
1 S root         2     0  0  80   0 -     0 kthrea 09:56 ?        000000 [kthreadd]
1 S root         3     2  0  80   0 -     0 smpboo 09:56 ?        000000 [ksoftirqd/0]
1 S root         4     2  0  80   0 -     0 worker 09:56 ?        000000 [kworker/00]
1 S root         5     2  0  60 -20 -     0 worker 09:56 ?        000000 [kworker/0:0H]
1 S root         7     2  0  80   0 -     0 rcu_gp 09:56 ?        000000 [rcu_sched]
1 S root         8     2  0  80   0 -     0 rcu_no 09:56 ?        000000 [rcuos/0]
1 R root         9     2  0  80   0 -     0 ?      09:56 ?        000000 [rcuos/1]
1 S root        10     2  0  80   0 -     0 rcu_no 09:56 ?        000000 [rcuos/2]
1 S root        11     2  0  80   0 -     0 rcu_no 09:56 ?        000000 [rcuos/3]
1 S root        12     2  0  80   0 -     0 rcu_gp 09:56 ?        000000 [rcu_bh]
1 S root        13     2  0  80   0 -     0 rcu_no 09:56 ?        000000 [rcuob/0]
1 S root        14     2  0  80   0 -     0 rcu_no 09:56 ?        000000 [rcuob/1]
1 S root        15     2  0  80   0 -     0 rcu_no 09:56 ?        000000 [rcuob/2]
1 S root        16     2  0  80   0 -     0 rcu_no 09:56 ?        000000 [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命令的快捷鍵轉換輸出的顯示信息:

  1. t:切換顯示進程和 CPU 狀態信息

  1. m:切換顯示進程和 CPU 狀態信息

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

  3. o:改變顯示項目的順序

  4. r:重新設置進程的優先級別(系統提示用戶輸入需要改變的進程PID以及需要設置
    的優先級值)

  5. k:終止一個進程(系統將提示用戶輸入需要終止的進程PID)

  6. s:改變刷新的時間間隔

  7. u:查看指定用戶的進程


03

窺探內存的命令

_____

1、free

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


使用方式:

free

命令輸出:

robert@robert-ubuntu1410:~$ 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

命令輸出:

robert@robert-ubuntu1410:~$ 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

命令輸出:

robert@robert-ubuntu1410:~$ 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


這裏面需要注意的是:

  1. buff是IO系統用來做存儲磁盤塊文件元數據的信息

  1. cache是操作系統用來緩存磁盤數據的緩衝區,操作系統會自動調節這個參數,在內存緊張的時候操作系統會減少cache的佔用空間來保證其他進程可用

  2. cs參數表達線程切換次數,此數據太大表明線程同步機制有問題

  3. si和so如果較大說明系統頻繁使用交換區,應該查看操作系統內存是否夠用

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


2、mpstat

實時監控系統CPU的一些統計信息,這些信息存放在/proc/stat文件中,在多核CPU系統裏,其不但能查看所有CPU的平均使用信息,而且能夠查看某一個特定CPU的信息。


使用方式:

mpstat -P ALL

命令輸出:

robert@robert-ubuntu1410:~$ mpstat -P ALL
Linux 3.16.0-30-generic (robert-ubuntu1410)     20170423日     _x86_64_    (4 CPU)

111238秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
111238秒  all    0.54    0.55    0.23    0.57    0.00    0.04    0.00    0.00    0.00   98.07
111238秒    0    0.75    1.41    0.35    1.06    0.00    0.11    0.00    0.00    0.00   96.32
111238秒    1    0.51    0.22    0.22    0.48    0.00    0.01    0.00    0.00    0.00   98.57
111238秒    2    0.52    0.58    0.18    0.29    0.00    0.02    0.00    0.00    0.00   98.41
111238秒    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

命令輸出:

robert@robert-ubuntu1410:~$ iostat -x
Linux 3.16.0-30-generic (robert-ubuntu1410)     20170423日     _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

從命令輸出可以看出:

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

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

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


2、swapon

查看交換分區的使用情況。


使用方式:

/sbin/swapon -s

命令輸出:

robert@robert-Latitude-E6440:~/tmp$ /sbin/swapon -s
Filename                Type        Size    Used    Priority
/dev/sda6              partition   4094972 708384   -1

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


3、df

查看文件系統的硬盤掛載點和空間使用情況。


使用方式:

df

命令輸出:

robert@robert-Latitude-E6440:~/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

命令輸出:

robert@robert-ubuntu1410:~$ ifconfig -a
eth0      Link encap:以太網  硬件地址 0800272f70: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

命令輸出:

robert@robert-ubuntu1410:~$ 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服務提供的所有參數,然後一一檢查參數,找到問題。


當然,也可用於傳輸二進制或者文本文件。


傳輸文件端:

robert@robert-ubuntu1410:~$ nc localhost 8888 < test.txt

接受文件端:

robert@robert-ubuntu1410:~$ nc -l 8888
12345678


5、mtr

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


使用方式:

mtr -r sina.com

命令輸出:

robert@robert-ubuntu1410:~$ mtr -r sina.com
Start:Sun Apr 23 164027 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

命令輸出:

robert@robert-ubuntu1410:~$ 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

命令輸出:

robert@robert-ubuntu1410:~$ 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

命令輸出:

robert@robert-ubuntu1410:~$ sar -n DEV 1 1
Linux 3.16.0-30-generic (robert-ubuntu1410)     20170423日     _x86_64_    (4 CPU)

110243秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
110244秒      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
110244秒        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可以用來收集更多的服務的狀態信息:

  1. -A:所有報告的總和

  1. -u:CPU利用率

  2. -v:進程、I節點、文件和鎖表狀態

  3. -d:硬盤使用報告

  4. -r:沒有使用的內存頁面和硬盤塊

  5. -g:串口 I/O的情況

  6. -b:緩衝區使用情況

  7. -a:文件讀寫情況

  8. -c:系統調用情況

  9. -R:進程的活動情況

  10. -y:終端設備活動情況

  11. -w:系統交換活動


9、netstat(ss)

此命令顯示網絡連接、端口信息等,另外一個命令ss與netstat命令類似,就不單獨介紹。


1根據進程查找端口

1).根據進程名字查找進程ID:

ps -elf | grep 進程

 輸出爲:

robert@robert-ubuntu1410:~$ ps -elf | grep vesta
0 S robert    2862  1988 10  80   0 - 233215 futex_ 1000 pts/0   000022 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 -      1004 pts/0    000000 grep --color=auto vesta

  獲得進程ID爲2862。


2).根據進程ID查找進程開啓的端口:

netstat -nap | grep 6588

輸出爲:

robert@robert-ubuntu1410:~$ netstat -nap | grep 2862
tcp6       0      0 :::8080                 :::*                    LISTEN      2862/java       
unix  2      [ ]         流        已連接     21371    2862/java

獲得監聽端口爲8080。


2 根據端口查找進程

1)查找使用端口的進程號:

netstat -nap | grep 8080

輸出爲:

robert@robert-ubuntu1410:~$ netstat -nap | grep 8080


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

```

獲得進程ID爲2862。


2)根據進程ID查找進程的詳細信息。

ps -elf | grep 2862

輸出爲:

robert@robert-ubuntu1410:~$ ps -elf | grep 2862
0 S robert    2862  1988  3  80   0 - 233215 futex_ 1000 pts/0   000023 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

命令輸出:

在進入主界面之前可以選擇不同的選項,在不同的選項下,可以查看不同維度的網絡信息。


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

命令輸出:

robert@robert-ubuntu1410:~$ 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 1211
Scanning localhost (127.0.0.1) [2 ports]
Completed Ping Scan at 1211, 0.00s elapsed (1 total hosts)
Initiating Connect Scan at 1211
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 1211, 0.01s elapsed (1000 total ports)
Initiating Service scan at 1211
Scanning 5 services on localhost (127.0.0.1)
Completed Service scan at 1211, 6.04s elapsed (5 services on 1 host)
NSE:Script scanning 127.0.0.1.
Initiating NSE at 1211
Completed NSE at 1211, 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 9541:c2:46258d:bc:2d:d1:15:c6:90:ca:a7:8b:bc (DSA)
| 2048 473293:bf:49:df:9c:e7:d7:c5:f8:ef:92:e3:28:c2 (RSA)
|_256 bd:ef:f2:2101:b1:cb:78:c7:42:a8:f3:5f40: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:5626+0000
| Not valid after: 2025-10-21T08:5626+0000
| 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:1812+0000; +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


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

  1. Discovered open port 22/tcp on 127.0.0.1

  1. Discovered open port 8080/tcp on 127.0.0.1

  2. Discovered open port 25/tcp on 127.0.0.1

  3. Discovered open port 3306/tcp on 127.0.0.1

  4. 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 pthread_cond_wait@@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導致的技術攻關的場景。

由於虛擬機有問題,沒有收集到這部分的輸出信息 :(



- End -

本文分享自微信公衆號 - IT一刻鐘(it_info)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章