Linux系統監控命令及如何定位到Java線程

>>PID、TID的區分

uid是user id,即用戶id,root用戶的uid是0,0爲最高權限,
gid是group id,用戶組id,使用 id 命令可以很簡單的通過用戶名查看UID、GID:
~$ id bingyue
uid=1000(bingyue) gid=1000(bingyue) groups=1000(bingyue)
~$ id root
uid=0(root) gid=0(root) groups=0(root)

pid是process id,即進程id,可以通過pid找到這個進程的uid,
tid是thead id,可以理解爲線程的id。

>>常用的系統監控命令

top查看活動進程信息
top 命令顯示當前的活動進程,默認它是按佔用CPU 的多少進行排序,每5秒鐘刷新一次列表,
你也可以選擇不同的排序方式,例如 m 是按內存佔用方式進行排序的快捷鍵。

iostat命令查看磁盤讀取情況
iostat 命令用來顯示存儲子系統的詳細信息,通常用它來監控磁盤 I/O 的情況。
要特別注意 iostat 統計結果中的 %iowait 值,太大了表明你的系統存儲子系統性能低下。

使用meminfo查看內存信息
meminfo 包含了內存的詳細信息,可以使用 cat 和 grep 命令來顯示 meminfo 信息:
cat /proc/meminfo

使用free命令動態查看內存信息
可以使用 free 命令來顯示動態的內存使用信息,free 查看大概的內存信息,而 meminfo 提供的信息更加詳細。

lsof命令查看打開文件和端口等的列表
lsof 命令對於很多 Linux/Unix 系統都可以使用,主要以列表的形式顯示打開的文件和進程。
打開的文件主要包括磁盤文件、網絡套接字、管道、設備和進程。
使用這個命令的主要原因是一個一個盤不能卸載並且顯示文件正在使用或者打開的錯誤信息。這個命令很容易看出哪些文件正在使用。

使用mpstat查看cpu信息
mpstat mpstat是MultiProcessor Statistics的縮寫,是實時系統監控工具。其報告與CPU的一些統計信息,這些信息存放在/proc/stat文件中。
默認可能沒有安裝,需要安裝後使用。

在多CPUs系統裏,其不但能查看所有CPU的平均狀況信息,而且能夠查看特定CPU的信息。

使用pmap查看某進程的內存使用情況
pmap 命令用來報告每個進程佔用內存的詳細情況,可用來看是否有進程超支了,該命令需要進程 id 作爲參數。
pmap pid

使用ps 和 pstree查看進程列表
ps 和 pstree 命令都可以用來列表展示正在運行的所有進程。ps 告訴你每個進程佔用的內存和 CPU 處理時間,而 pstree 顯示的信息沒那麼詳細,但它以樹形結構顯示進程之間的依賴關係,包括子進程信息。一旦發現某個進程有問題,你可以使用 kill 來殺掉它。


netstat網絡信息
Netstat 和 ps 命令類似,顯示了大量跟網絡相關的信息,例如 socket 的使用、路由、接口、協議、網絡等等。

strace
strace 可以記錄進程進行系統調用的詳情,因此它也是一個非常好的診斷工具,例如你可以使用它來找出某個程序正在打開某個配置文件。
Strace 在跟蹤某個進程時會讓該進程的性能變得非常差,因此請謹慎使用。

vmstat
你可以使用 vmstat 來監控虛擬內存,一般 Linux 上的開發者喜歡使用虛擬內存來獲得最佳的存儲性能。該命令報告關於內核線程、虛擬內存、磁盤、陷阱和 CPU 活動的統計信息。由 vmstat 命令生成的報告可以用於平衡系統負載活動。系統範圍內的這些統計信息(所有的處理器中)都計算出以百分比表示的平均值,或者計算其總和。


uptime
uptime 命令告訴你這臺服務器從開機啓動到現在已經運行了多長時間了。同時也包含了從啓動到現在服務器的平均負載情況

>>常用的監控工具

htop — 進程監控
htop 是一個更加先進的交互式的實時監控工具。htop 與 top 命令非常相似,但是他有一些非常豐富的功能,如用戶友好界面管理進程、快捷鍵、橫向和縱向進程等更多的。htop 是一個第三方工具並不包括在 Linux 系統中,你需要使用包管理工具進行安裝。

iotop — 監控 Linux 磁盤 I/O
iotop 也是和 top 和 htop 命令相似,但是它會有一個報告功能去監控和顯示實時的磁盤 I/O 輸入和輸出和程序進程。這個工具對於查找精確的高的磁盤讀/寫過程是非常有用的。

nmon即奈吉爾性能監視器 
Nmon是 Nigel's Monitor 的縮寫,是一個使用很普遍的開源工具,用來監視 Linux 系統的所有資源包括:CPU、內存、磁盤使用率、網絡上的進程、NFS、內核等等,並且提供了一個圖形化的工具。

tcpdump — 網絡數據包分析器

Tcpdump 是一個簡單、可靠的網絡監控工具,用來做基本的協議分析,看看那些進程在使用網絡以及如何使用網絡。
如果需要獲取詳細的信息,可以使用 Wireshark 。

>>Linux監控常用的操作

netstat -natp : 查看對應的網絡鏈接
lsof -p pid : 查找對應pid的文件句柄
lsof -i : 80 : 查找對應端口被哪個進程佔用
lsof /tmp/1.txt :查找對應文件被哪個進程佔用

查看所有存在的線程:
ps xH
手冊中說:H Show threads as if they were processes

查看一個進程起的線程數:
ps -mp <PID>
手冊中說:m Show threads after processes

>>找到最耗CPU的Java線程

首先使用top等命令找到jvm進程的pid,
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3853 weblogic 18 0 9268m 4.1g 10m S 34.4 6.5 1301:04 java

當前jvm進程的pid是3853,通過jstack命令dump出當前的jvm進程的堆棧信息:
jstack 3853 >> /tmp/jstack0330.txt

然後使用下面的命令:
ps -mp pid -o THREAD,tid,time
或者
ps -Lfp pid
這個命令的作用,主要是可以獲取到對應一個進程下的線程的一些信息:
$ ps -mp 3853 -o THREAD,tid,time
USER %CPU PRI SCNT WCHAN USER SYSTEM TID TIME
weblogic 29.3 - - - - - - 21:40:17
weblogic 10.7 24 - 184467 - - 13979 07:39:06

通過 printf "%x\n" 13979 可以將線程id轉化成16進製表示, 
繼續通過grep命令即可以查到對應16進制的線程id信息:
grep 369b /tmp/jstack0330.txt

堆棧信息中的nid對應的linux操作系統下的tid,就是線程id對應的16進制數字,
tid則是jvm的jmm內存規範中的唯一地址定位。

使用grep -A ,可以顯示匹配行和之後的幾行,
繼續查看線程所在堆棧信息中前後的部分:
grep 369b /tmp/jstack0330.txt -A 10
就可以定位到相關的代碼位置

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