如何在Linux上监视进程的线程数?


135

我想监视Linux上特定进程使用的线程数。是否有一种简单的方法来获取此信息而不影响过程的性能?


如果应用程序的进程只运行很短时间,那又如何呢?(说2秒。)
user2023370

Answers:


152

尝试

ps huH p <PID_OF_U_PROCESS> | wc -l

htop


3
我相信您应该1从中减去,因为它会打印一行USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND表格标题。
AhmetB-Google

2
'h'隐藏标题。
thinkmassive

11
-1为什么wc在可能的时候将输出传递到ps -o thcount <pid>?看到这个答案
流量

73

要获取给定pid的线程数:

$ ps -o nlwp <pid>

其中nlwp代表轻量进程数(线程)。因此ps别名nlwpthcount,这意味着

$ ps -o thcount <pid>

确实也可以。

如果要监视线程数,只需使用watch

$ watch ps -o thcount <pid>

要获取系统中运行的所有线程的总和:

$ ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'

2
这里最有用的答案。特别是watch命令。但是,请注意thcount,尽管nlwp对我有用,但使用某些功能(Red Hat ...)可能会失败。
Joshua Detwiler

50

进程中的每个线程都会在下创建一个目录/proc/<pid>/task。计算目录数,然后得到线程数。


1
要添加到上面的评论中。您可以使用此命令查找线程数:find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l。只需将<PID>替换为您可以从中获得top或使用的过程IDps
Navigatron,2016年


21

ps -eLf外壳程序上的“线程”将为您提供系统上当前正在运行的所有线程和进程的列表。或者,您可以运行top命令,然后单击“ H”以切换线程列表。


这是我的调味料。我不想将其仅限于一个过程。-p如有必要,可以很容易地添加一个或其他任何东西。这是您需要查看线程列表的最低要求。
埃里克·罗伯逊

6

JStack相当便宜-一种选择是通过grep传递输出以找到活动线程,然后通过wc -l传递。

JConsole更加图形化,它显示给定进程的线程数。


6

如果您使用:

ps uH p <PID_OF_U_PROCESS> | wc -l

您必须在结果中减去1,因为“ wc”行之一正在计数的是“ ps”命令的标题。


欢迎使用StackOverflow。可以说,这应该是对slav0nic答案的评论。但是,据我了解,当您第一次加入SO时,您(仍然)无法对答案发表评论,除非您赢得了一定声誉,所以添加答案就是您所能做的。你是对的; 您不应该将标头行计ps为线程之一。
乔纳森·勒夫勒

6

这是一个显示给定进程的线程数的命令:

ps -L -o pid= -p <pid> | wc -l

与其他ps基于答案的答案不同,由于该选项1不存在ps标题行,因此此处无需减去其输出-o pid=


5

$ ps H p pid-id

H-列出进程中的所有单个线程

要么

$cat /proc/pid-id/status

pid-id是进程ID

例如..(截断了以下输出)

root@abc:~# cat /proc/8443/status
Name:   abcdd
State:  S (sleeping)
Tgid:   8443
VmSwap:        0 kB
Threads:    4
SigQ:   0/256556
SigPnd: 0000000000000000

4

较新的JDK发行版随附JConsole和VisualVM。两者都是从运行中的Java进程中获取肮脏细节的绝佳工具。如果您必须以编程方式执行此操作,请研究JMX。



2

最简单的方法是使用“ htop”。您可以安装“ htop”(top的高级版本),它将显示所有内核,进程和内存使用情况。

按“ Shift + H”显示所有过程,或再次按将其隐藏。按“ F4”键搜索您的进程名称。

在Ubuntu或Debian上安装:

sudo apt-get install htop

在Redhat或CentOS上安装:

yum install htop
dnf install htop      [On Fedora 22+ releases]

如果要从源代码编译“ htop”,请在此处找到它。


1

如果您尝试使用给定pid的cpu找出线程数,我将使用:

top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l

0

如果您对真正活动的那些线程感兴趣-就像在做某事(未阻塞,未timed_waiting,未报告“线程正在运行”,而是真正在等待流提供数据)而不是闲置但处于活动状态- -那么您可能对jstack-active感兴趣。

这个简单的bash脚本运行,jstack然后过滤掉所有启发式的似乎空闲的线程,向您显示实际上消耗CPU周期的那些线程的堆栈跟踪。



0

如果要在Linux系统中每个用户的线程数,则应使用:

ps -eLf | grep <USER> | awk '{ num += $6 } END { print num }'

使用所需的用户名。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.