linux下巧用ps得到运行线程个数和线程启动时间
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下巧用ps得到运行线程个数和线程启动时间相关的知识,希望对你有一定的参考价值。
参考技术A linux进程运行了很久,怎么能够得到某一进程所有的线程个数并且得到它们的启动时间,除了读取/proc信息之外,我们可以使用ps简单的达到目的。ps
max
-o
lstart,lwp,pid,nlwp,cmd
lstart
STARTED
time
the
command
started.
nlwp
NLWP
number
of
lwps
(threads)
in
the
process.
(alias
thcount).
lwp
LWP
lwp
(light
weight
process,
or
thread)
ID
of
the
lwp
being
reported.
(alias
spid,
tid).
BONO11-0-0-1:/root-#
ps
max
-o
%mem,lstart,lwp,pid,nlwp,cmd
%MEM
STARTED
LWP
PID
NLWP
CMD
-
Fri
Nov
11
13:25:29
2011
1
-
-
-
0.0
Fri
Nov
11
13:25:29
2011
-
2
1
[migration/0]
-
Fri
Nov
11
13:25:29
2011
2
-
-
-
0.0
Fri
Nov
11
13:25:29
2011
-
3
1
[ksoftirqd/0]
-
Fri
Nov
11
13:25:29
2011
3
-
-
-
...
0.0
Fri
Nov
11
13:50:46
2011
-
31012
8
/opt/proxy/bin/http_stack
Http
Stack
benchHttp__asr_1_h
-
Fri
Nov
11
13:50:46
2011
31012
-
-
-
-
Fri
Nov
11
13:50:46
2011
31016
-
-
-
-
Fri
Nov
11
13:50:46
2011
31018
-
-
-
-
Fri
Nov
11
13:50:46
2011
31019
-
-
-
-
Fri
Nov
11
13:50:47
2011
31855
-
-
-
-
Fri
Nov
11
13:50:47
2011
31856
-
-
-
-
Fri
Nov
11
13:50:47
2011
31857
-
-
-
-
Fri
Nov
11
13:50:47
2011
31926
-
-
-
0.0
Fri
Nov
11
17:14:19
2011
-
31272
1
sshd:
root@notty
-
Fri
Nov
11
17:14:19
2011
31272
-
-
-
我们可以验证正好有8个task.
BONO11-0-0-1:/root-#
ls
/proc/31012/task/
31012
31016
31018
31019
31855
31856
31857
31926
摘自
licanhua的专栏
Linux中查看进程的多线程pstree, ps -L
Linux中查看进程的多线程
在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢?
本文介绍3种命令来查看Linux系统中的线程(LWP)的情况:
在我的系统中,用qemu-system-x86_64命令启动了一个SMP的Guest,所以有几个qemu的线程,以此为例来说明。
1. pstree 命令,查看进程和线程的树形结构关系。
1 2 3 4 5 |
[root@jay-linux ~]# pstree | grep qemu |-gnome-terminal-+-bash---qemu-system-x86---2*[{qemu-system-x8}] [root@jay-linux ~]# pstree -p | grep qemu |-gnome-terminal(10194)-+-bash(10196)---qemu-system-x86(10657)-+-{qemu-system-x8}(10660) | | `-{qemu-system-x8}(10661) |
2. ps 命令,-L参数显示进程,并尽量显示其LWP(线程ID)和NLWP(线程的个数)。
1 2 3 4 5 |
[root@jay-linux ~]# ps -eLf | grep qemu root 10657 10196 10657 0 3 13:48 pts/1 00:00:00 qemu-system-x86_64 -hda smep-temp.qcow -m 1024 -smp 2 root 10657 10196 10660 3 3 13:48 pts/1 00:00:26 qemu-system-x86_64 -hda smep-temp.qcow -m 1024 -smp 2 root 10657 10196 10661 2 3 13:48 pts/1 00:00:19 qemu-system-x86_64 -hda smep-temp.qcow -m 1024 -smp 2 root 10789 9799 10789 0 1 14:02 pts/0 00:00:00 grep --color=auto qemu |
上面命令查询结果的第二列为PID,第三列为PPID,第四列为LWP,第六列为NLWP。
另外,ps命令还可以查看线程在哪个CPU上运行,命令如下:
1 2 3 4 5 |
[root@jay-linux ~]# ps -eo ruser,pid,ppid,lwp,psr,args -L | grep qemu root 10657 10196 10657 1 qemu-system-x86_64 -hda smep-temp.qcow -m 1024 -smp 2 root 10657 10196 10660 1 qemu-system-x86_64 -hda smep-temp.qcow -m 1024 -smp 2 root 10657 10196 10661 2 qemu-system-x86_64 -hda smep-temp.qcow -m 1024 -smp 2 root 10834 9799 10834 1 grep --color=auto qemu |
其中,每一列依次为:用户ID,进程ID,父进程ID,线程ID,运行该线程的CPU的序号,命令行参数(包括命令本身)。
3. top 命令,其中H命令可以显示各个线程的情况。(在top命令后,按H键;或者top -H)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[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 10660 root 20 0 1313m 188m 2752 S 2.3 4.9 0:46.78 qemu-system-x86 10661 root 20 0 1313m 188m 2752 S 2.0 4.9 0:39.44 qemu-system-x86 10867 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.
1 2 3 4 5 6 |
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ P COMMAND 10661 root 20 0 1313m 188m 2752 S 2.3 4.9 0:44.24 3 qemu-system-x86 10660 root 20 0 1313m 188m 2752 S 2.0 4.9 0:51.74 0 qemu-system-x86 10874 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) 。
另外的几个命令:
strace -f;
lsof
查看所有子进程:pstree -p pid
查看/proc/pid/status可以看到一些进程的当前状态
得到进程的pid:
ps -ef | grep process_name | grep -v "grep" | awk ‘{print $2}‘
以上是关于linux下巧用ps得到运行线程个数和线程启动时间的主要内容,如果未能解决你的问题,请参考以下文章