前言
對於服務端應用,我們常會遇到機器load過高,服務無響應,磁盤打滿,網絡堵塞等等問題,對於這些問題,我們需要從服務器本身找出根源所在,然後再着手解決,本文主要介紹了用於定位這一系列問題的命令。
內存佔用比例
通過top
命令,我們可以查看目前內存使用比例,其中,每一行就是一個進程的狀態,具體字段解釋如下
PID | 進程ID |
---|---|
VIRT | 申請的虛擬內存總量 |
RES | 使用的物理內存總和 |
SHR | 佔用共享內存大小 |
關於虛擬內存和物理內存的解釋,可以看這裏。
關於top命令的底層實現,可以看這裏
如上圖所示,通過top命令,我們就能夠看到PID爲1的進程佔用了1.6G的物理內存。在進程多的情況下,如果我們需要進行排序,還可以通過shift + f
進行如下選擇頁面,然後選擇指定的項目進行排序展示。
此外,我們還可以通過free
命令,來查看系統當前空閒和已用內存。另外,可以通過free -m
,free -g
來控制其展示的單位。
CPU佔用時間查詢
查詢CPU時間的時候,我們主要使用的仍然是top
命令。通過top命令,選擇CPU時間排序,就可以得到佔用CPU最長的進程PID。但還有另外一個場景,我們需要查詢進程中的子線程中最耗時的,這個時候就需要加參數適用top
命令了。
top -H -p <pid>
通過這個命令,我們可以看到這個進程底下佔用CPU時間最多的線程。
展示的pid就是線程id,如果是java程序應用中需要進行排查的話,我們還需要通過printf '%x\n' <tid>
來將其轉換爲16進制。轉換成16進制後,我們只需要 通過jstack <pid> | grep nid=0x<16進制的tid> -A 50
就能夠查看到具體佔用cpu的堆棧信息。
網絡查詢
對於微服務應用,偶爾會出現不可達(健康檢查失敗)的情況,這有兩種可能,第一種可能就是應用已經崩潰了,第二種情況則是流量過大導致應用線程耗盡,無法處理新的http請求,針對第二種情況,我們就需要對應用的網絡狀態進行排查。
常用的命令爲netstat
,關於其參數的描述,可以參見這篇博客。
通過netstat -nat|grep 8080 -c
我們可以查看有多少個連接是建立在8080端口上的(包含inbound和outbound),如果想要進一步查看有多少inbound請求,我們可以通過netstat -nat|tr -s ' '|cut -f4 -d ' '|grep 8080 -c
來進行查詢。其實就是對netstat的結果進行了處理(將多個空格合併爲一個,然後取第n列數據,再進行計數),如果想要查詢有多少個ip在對服務進行訪問,則可以使用uniq
命令。
磁盤佔用
查看磁盤佔用的主要命令則爲ls
和du
通過ls -lh -s
,我們可以獲取當前文件夾下所有文件的大小,如果遇到文件夾的時候,展示的就是目錄所分配的塊大小。
如果想查看具體目錄佔用情況,我們可以用du --max-depth=1 -h
來進行查看。
小結
這裏主要總結了對於linux服務器的四個物理信息的查詢方式,包含內存、CPU、網絡以及磁盤。用到的命令主要有top
, free
,grep
,netstat
,ls
,du
。