172

我想监视 Linux 上特定进程使用的线程数。有没有一种简单的方法可以在不影响流程性能的情况下获取这些信息?

4

18 回答 18

174

尝试

ps huH p <PID_OF_U_PROCESS> | wc -l

htop

于 2008-11-07T16:56:09.097 回答
113

要获取给定 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 }'
于 2016-06-08T21:28:46.560 回答
67

进程中的每个线程都会在/proc/<pid>/task. 计算目录的数量,你就有了线程的数量。

于 2011-08-27T19:07:03.727 回答
45
cat /proc/<PROCESS_PID>/status | grep Threads
于 2015-04-21T12:51:13.610 回答
21

ps -eLf在 shell 上会给你一个当前在系统上运行的所有线程和进程的列表。或者,您可以运行top命令然后按“H”来切换线程列表。

于 2014-08-23T07:39:05.003 回答
8

如果您使用:

ps uH p <PID_OF_U_PROCESS> | wc -l

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

于 2011-08-27T18:24:15.970 回答
8

$ 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
于 2016-02-16T01:03:49.953 回答
6

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

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

于 2008-11-06T13:36:37.703 回答
6

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

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

与其他ps基于答案的答案不同,这里不需要1从其输出中减去,因为ps由于该-o pid=选项没有标题行。

于 2014-01-20T21:31:41.310 回答
6

我的答案是更多的gui,但仍在终端内。Htop 可以通过一些设置来使用。

  1. 启动 htop。
  2. 按 F2 进入设置菜单。
  3. 从最左边的列中选择“列”
  4. 从最右边的列中选择要添加到主监控输出的列,“NLWP”就是您要查找的内容。
  5. 按 F10。
于 2020-09-12T04:13:35.143 回答
4

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

于 2008-11-06T13:39:56.697 回答
2

jvmtop可以在其他指标旁边显示当前的 jvm 线程数。

于 2013-03-14T10:33:50.450 回答
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”,你会在这里找到它。

于 2017-10-23T08:45:43.853 回答
2

如果您正在寻找多个进程的线程数,那么其他答案对您来说效果不佳,因为您不会看到进程名称或 PID,这使得它们相当无用。改用这个:

ps -o pid,nlwp,args -p <pid_1> <pid_2> ... <pid_N>

为了实时观看更改,只需添加watch

watch ps -o pid,nlwp,args -p <pid_1> <pid_2> ... <pid_N>
于 2021-02-10T09:47:19.720 回答
1

如果你想在 linux 系统中每个用户的线程数,那么你应该使用:

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

在哪里<USER>使用所需的用户名。

于 2020-07-27T15:09:36.050 回答
1

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

top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l
于 2017-02-16T14:49:45.627 回答
0

如果你对那些真正活跃的线程感兴趣——比如在做某事(不阻塞、不定时等待、不报告“线程正在运行”但真正等待流提供数据)而不是闲置但活着 - - 那么你可能对jstack-active感兴趣。

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

于 2015-10-27T13:03:11.137 回答
-1

VisualVM 可以显示给定 JVM 进程的线程的清晰状态

在此处输入图像描述

于 2015-12-22T09:41:45.343 回答