【发布时间】:2010-09-21 02:04:36
【问题描述】:
我想监控 Linux 上特定进程使用的线程数。 有没有一种简单的方法可以在不影响流程性能的情况下获取这些信息?
【问题讨论】:
-
如果一个应用程序的进程只运行很短的时间呢? (说 2 秒。)
标签: linux multithreading monitor
我想监控 Linux 上特定进程使用的线程数。 有没有一种简单的方法可以在不影响流程性能的情况下获取这些信息?
【问题讨论】:
标签: linux multithreading monitor
如果您正在寻找多个进程的线程数,那么其他答案对您来说效果不佳,因为您不会看到进程名称或 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>
【讨论】:
我的答案是更多 gui,但仍在终端内。 Htop 可以通过一些设置来使用。
【讨论】:
如果你想在 linux 系统中每个用户的线程数,那么你应该使用:
ps -eLf | grep <USER> | awk '{ num += $6 } END { print num }'
<USER> 使用所需的用户名。
【讨论】:
获取给定 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 }'
【讨论】:
watch 命令。但是,请注意,虽然 nlwp 对我有用,但使用 thcount 对某些人(Red Hat...)来说可能会失败。
pidof 或 pgrep。例如,ps -o nlwp $(pidof chrome) 或 ps -o nlwp $(pgrep chrome)。
最简单的方法是使用“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”,你会发现它here。
【讨论】:
如果您试图找出给定 pid 使用 cpu 的线程数,我会使用:
top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l
【讨论】:
$ 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
【讨论】:
cat /proc/<PROCESS_PID>/status | grep Threads
【讨论】:
如果您对那些真正活跃的线程感兴趣——比如在做某事(未阻塞、未定时等待、未报告“线程正在运行”但真正等待流提供数据) ) 而不是闲着但活着——那么你可能会对jstack-active 感兴趣。
这个简单的 bash 脚本运行 jstack,然后过滤掉所有通过启发式方法似乎处于空闲状态的线程,向您显示那些实际消耗 CPU 周期的线程的堆栈跟踪。
【讨论】:
shell 上的ps -eLf 将为您提供当前在系统上运行的所有线程和进程的列表。
或者,您可以运行top 命令然后点击“H”来切换线程列表。
【讨论】:
-p 或其他任何内容。这是您查看线程列表所需的最低要求。
这是一个显示给定进程的线程数的命令:
ps -L -o pid= -p <pid> | wc -l
与其他基于ps 的答案不同,这里无需从其输出中减去1,因为-o pid= 选项没有ps 标题行。
【讨论】:
【讨论】:
1,因为它会为表头打印一行USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND。
ps -o thcount <pid> 将输出传输到wc?见this answer。
jvmtop 可以在其他指标旁边显示当前 jvm 线程数。
【讨论】:
进程中的每个线程在/proc/<pid>/task 下创建一个目录。数一下目录数,就知道线程数了。
【讨论】:
find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l。只需将 top 或使用 ps 获得的进程 ID
ls /proc/<PID>/task | wc 就可以了。
如果你使用:
ps uH p <PID_OF_U_PROCESS> | wc -l
您必须将结果减去 1,因为“wc”正在计数的行之一是“ps”命令的标题。
【讨论】:
ps 的标题行视为线程之一。
较新的 JDK 发行版附带 JConsole 和 VisualVM。两者都是从正在运行的 Java 进程中获取脏细节的绝佳工具。如果您必须以编程方式执行此操作,请研究 JMX。
【讨论】:
JStack 相当便宜 - 一种选择是通过 grep 管道输出以查找活动线程,然后通过 wc -l 管道。
更图形化的是 JConsole,它显示给定进程的线程数。
【讨论】: