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 命令,查看进程和线程的树形结构关系。

View Code BASH
 
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(线程的个数)。

View Code BASH
 
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上运行,命令如下:

View Code BASH
 
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)

View Code BASH
 
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.

View Code BASH
 
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得到运行线程个数和线程启动时间的主要内容,如果未能解决你的问题,请参考以下文章

Linux下巧用转义符来完成多阶攻击

如何查看linux线程 运行在哪个cpu核上

linux 查看进程有多少线程

linux下查看一个进程有多少个线程

巧用线程池

Linux中查看进程的多线程pstree, ps -L