從內存佔用到CPU時間,後端問題排查必備linux命令

前言

對於服務端應用,我們常會遇到機器load過高,服務無響應,磁盤打滿,網絡堵塞等等問題,對於這些問題,我們需要從服務器本身找出根源所在,然後再着手解決,本文主要介紹了用於定位這一系列問題的命令。

內存佔用比例

通過top命令,我們可以查看目前內存使用比例,其中,每一行就是一個進程的狀態,具體字段解釋如下

PID 進程ID
VIRT 申請的虛擬內存總量
RES 使用的物理內存總和
SHR 佔用共享內存大小

關於虛擬內存和物理內存的解釋,可以看這裏

關於top命令的底層實現,可以看這裏

top命令

如上圖所示,通過top命令,我們就能夠看到PID爲1的進程佔用了1.6G的物理內存。在進程多的情況下,如果我們需要進行排序,還可以通過shift + f進行如下選擇頁面,然後選擇指定的項目進行排序展示。
top命令截圖2

此外,我們還可以通過free命令,來查看系統當前空閒和已用內存。另外,可以通過free -mfree -g來控制其展示的單位。

CPU佔用時間查詢

查詢CPU時間的時候,我們主要使用的仍然是top命令。通過top命令,選擇CPU時間排序,就可以得到佔用CPU最長的進程PID。但還有另外一個場景,我們需要查詢進程中的子線程中最耗時的,這個時候就需要加參數適用top命令了。

top -H -p <pid> 通過這個命令,我們可以看到這個進程底下佔用CPU時間最多的線程。

top 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命令。

磁盤佔用

查看磁盤佔用的主要命令則爲lsdu

通過ls -lh -s,我們可以獲取當前文件夾下所有文件的大小,如果遇到文件夾的時候,展示的就是目錄所分配的塊大小。

如果想查看具體目錄佔用情況,我們可以用du --max-depth=1 -h來進行查看。

小結

這裏主要總結了對於linux服務器的四個物理信息的查詢方式,包含內存、CPU、網絡以及磁盤。用到的命令主要有topfreegrepnetstatls,du

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