我想监视 Linux 上特定进程使用的线程数。有没有一种简单的方法可以在不影响流程性能的情况下获取这些信息?
18 回答
要获取给定 pid 的线程数:
$ ps -o nlwp <pid>
其中nlwp
代表轻量级进程(线程)的数量。因此ps
别名nlwp
为thcount
,这意味着
$ ps -o thcount <pid>
也可以。
如果要监视线程数,只需使用watch
:
$ watch ps -o thcount <pid>
要获取系统中运行的所有线程的总和:
$ ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'
进程中的每个线程都会在/proc/<pid>/task
. 计算目录的数量,你就有了线程的数量。
cat /proc/<PROCESS_PID>/status | grep Threads
ps -eLf
在 shell 上会给你一个当前在系统上运行的所有线程和进程的列表。或者,您可以运行top
命令然后按“H”来切换线程列表。
如果您使用:
ps uH p <PID_OF_U_PROCESS> | wc -l
您必须将结果减去 1,因为“wc”正在计数的行之一是“ps”命令的标题。
$ 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
JStack 相当便宜——一种选择是通过 grep 管道输出以查找活动线程,然后通过 wc -l 管道。
JConsole 更加图形化,它显示给定进程的线程数。
这是一个显示给定进程的线程数的命令:
ps -L -o pid= -p <pid> | wc -l
与其他ps
基于答案的答案不同,这里不需要1
从其输出中减去,因为ps
由于该-o pid=
选项没有标题行。
我的答案是更多的gui,但仍在终端内。Htop 可以通过一些设置来使用。
- 启动 htop。
- 按 F2 进入设置菜单。
- 从最左边的列中选择“列”
- 从最右边的列中选择要添加到主监控输出的列,“NLWP”就是您要查找的内容。
- 按 F10。
较新的 JDK 发行版附带 JConsole 和 VisualVM。两者都是从正在运行的 Java 进程中获取脏细节的绝佳工具。如果您必须以编程方式执行此操作,请研究 JMX。
jvmtop可以在其他指标旁边显示当前的 jvm 线程数。
最简单的方法是使用“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”,你会在这里找到它。
如果您正在寻找多个进程的线程数,那么其他答案对您来说效果不佳,因为您不会看到进程名称或 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>
如果你想在 linux 系统中每个用户的线程数,那么你应该使用:
ps -eLf | grep <USER> | awk '{ num += $6 } END { print num }'
在哪里<USER>
使用所需的用户名。
如果您试图找出给定 pid 使用 cpu 的线程数,我会使用:
top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l
如果你对那些真正活跃的线程感兴趣——比如在做某事(不阻塞、不定时等待、不报告“线程正在运行”但真正等待流提供数据)而不是闲置但活着 - - 那么你可能对jstack-active感兴趣。
这个简单的 bash 脚本运行jstack
然后过滤掉所有通过启发式方法似乎处于空闲状态的线程,向您显示那些实际消耗 CPU 周期的线程的堆栈跟踪。