Linux中檢視程式的多執行緒

發表於2013-09-10

在SMP系統中,我們的應用程式經常使用多執行緒的技術,那麼在Linux中如何檢視某個程式的多個執行緒呢?

本文介紹3種命令來檢視Linux系統中的執行緒(LWP)的情況:

在我的系統中,用qemu-system-x86_64命令啟動了一個SMP的Guest,所以有幾個qemu的執行緒,以此為例來說明。

1. pstree 命令

檢視程式和執行緒的樹形結構關係

[root@jay-linux ~]# pstree | grep qemu
	 |-terminal-+-bash---qemu-sys---2*[{qemu-system-x8}]
[root@jay-linux ~]# pstree -p | grep qemu
		|-terminal(194)-+-bash(196)---qemu-sys(657)-+-{qemu}(660)
		|			   |			                 `-{qemu}(661)

2. ps 命令

-L引數顯示程式,並儘量顯示其LWP(執行緒ID)和NLWP(執行緒的個數)。

[root@jay-linux ~]# ps -eLf | grep qemu
root	 657 196 657  0	3 13:48 pts/1	00:00:00 qemu-sys -m 1024 -smp 2
root	 657 196 660  3	3 13:48 pts/1	00:00:26 qemu-sys -m 1024 -smp 2
root	 657 196 661  2	3 13:48 pts/1	00:00:19 qemu-sys -m 1024 -smp 2
root	 789  9799 10789  0	1 14:02 pts/0	00:00:00 grep --color=auto qemu

上面命令查詢結果的第二列為PID,第三列為PPID,第四列為LWP,第六列為NLWP。

另外,ps命令還可以檢視執行緒在哪個CPU上執行,命令如下:

[root@jay-linux ~]# ps -eo ruser,pid,ppid,lwp,psr,args -L | grep qemu
root	 657 196 657   1 qemu-sys -hda smep-temp.qcow -m 1024 -smp 2
root	 657 196 660   1 qemu-sys -hda smep-temp.qcow -m 1024 -smp 2
root	 657 196 661   2 qemu-sys -hda smep-temp.qcow -m 1024 -smp 2
root	 834  9799 10834   1 grep --color=auto qemu

其中,每一列依次為:使用者ID,程式ID,父程式ID,執行緒ID,執行該執行緒的CPU的序號,命令列引數(包括命令本身)。

3. top 命令

其中H命令可以顯示各個執行緒的情況。(在top命令後,按H鍵;或者top -H)

[root@jay-linux ~]# top -H
top - 14:18:20 up 22:32,  4 users,  load average: 2.00, 1.99, 1.90
Tasks: 286 total,   1 running, 285 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3943892k total,  1541540k used,  2402352k free,   164404k buffers
Swap:  4194300k total,		0k used,  4194300k free,   787768k cached
 
  PID USER	  PR  NI  VIRT  RES  SHR S %CPU %MEM	TIME+  COMMAND
660 root	  20   0 1313m 188m 2752 S  2.3  4.9   0:46.78 qemu-sys
661 root	  20   0 1313m 188m 2752 S  2.0  4.9   0:39.44 qemu-sys
867 root	  20   0 15260 1312  960 R  0.3  0.0   0:00.07 top
	1 root	  20   0 19444 1560 1252 S  0.0  0.0   0:00.34 init
	2 root	  20   0	 0	0	0 S  0.0  0.0   0:00.02 kthreadd
....

在top中也可以檢視程式(程式)在哪個CPU上執行的。

執行top後,按f,按j(選中* J: P = Last used cpu (SMP)),然後按空格或回車退出設定,在top的顯示中會多出P這一列是最近一次執行該執行緒(程式)的CPU.

PID USER	  PR  NI  VIRT  RES  SHR S %CPU %MEM	TIME+  P COMMAND
661 root	  20   0 1313m 188m 2752 S  2.3  4.9   0:44.24 3 qemu-sys
660 root	  20   0 1313m 188m 2752 S  2.0  4.9   0:51.74 0 qemu-sys
874 root	  20   0 15260 1284  860 R  0.7  0.0   0:00.32 2 top
	1 root	  20   0 19444 1560 1252 S  0.0  0.0   0:00.34 0 init
	2 root	  20   0	 0	0	0 S  0.0  0.0   0:00.02 1 kthreadd

更多資訊,請 man pstree, man top, man ps 檢視幫助文件。

注: LWP為輕量級程式(即:執行緒),(light weight process, or thread) 。

via http://smilejay.com/2012/06/linux_view_threads/ 


相關文章