我想监视 Linux 上特定进程使用的线程数。 有没有一种简单的方法可以在不影响流程性能的情况下获得这些信息?
JStack 相当便宜-一种选择是通过 grep 管道输出以查找活动线程,然后通过 wc-l 管道输出。
更图形化的是 JConsole,它显示给定进程的线程数。
更新的 JDK 发行版附带 JConsole 和 VisualVM。两者都是从正在运行的 Java 进程中获取详细信息的极好工具。如果必须以编程方式执行此操作,请调查 JMX。
试试看
ps huH p <PID_OF_U_PROCESS> | wc -l
或 打住
如果你使用:
ps uH p <PID_OF_U_PROCESS> | wc -l
您必须将1减去结果,因为“ wc”计数的行之一是“ ps”命令的头部。
进程中的每个线程在 /proc/<pid>/task下创建一个目录。计算目录的数量,就得到了线程的数量。
/proc/<pid>/task
Jvmtop 可以显示当前的 jvm 线程数以及其他指标。
下面是一个显示给定进程的线程数的命令:
ps -L -o pid= -p <pid> | wc -l
与其他基于 ps的答案不同,这里不需要从其输出中减去 1,因为由于 -o pid=选项,没有 ps标题行。
ps
1
-o pid=
Shell 上的 ps -eLf将为您提供系统上当前运行的所有线程和进程的列表。 或者,您可以运行 top命令,然后点击‘ H’来切换线程清单。
ps -eLf
top
cat /proc/<PROCESS_PID>/status | grep Threads
如果你对那些实际上是 激活的线程感兴趣——比如做一些事情(不阻塞,不 Timed _ waiting,不报告“线程运行”,而是真正地等待流给出数据) ,而不是闲置而活动——那么你可能对 Jstack 激活感兴趣。
这个简单的 bash 脚本运行 jstack,然后过滤掉所有通过试探法似乎空闲的线程,向您显示那些实际上正在消耗 CPU 周期的线程的堆栈跟踪。
jstack
VisualVM 可以清楚地显示给定 JVM 进程的线程状态
$ ps H p pid-id
列出进程中的所有单个线程
或者
$cat /proc/pid-id/status
Pid 是进程 ID
(截断以下输出)
root@abc:~# cat /proc/8443/status Name: abcdd State: S (sleeping) Tgid: 8443 VmSwap: 0 kB Threads: 4 SigQ: 0/256556 SigPnd: 0000000000000000
获取给定 pid 的线程数:
$ ps -o nlwp <pid>
其中 nlwp代表 轻量级进程数(线程)。因此,ps别名 nlwp到 thcount,这意味着什么
nlwp
thcount
$ ps -o thcount <pid>
也有用。
如果您想要监视线程计数,只需使用 watch:
watch
$ watch ps -o thcount <pid>
要获取系统中运行的所有线程的总和:
$ ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'
如果您试图找出在给定 PID 中使用 CPU 的线程数,我将使用:
top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l
最简单的方法是使用“ 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”,你会发现它是 给你。
如果你想要一个 linux 系统中每个用户的线程数,那么你应该使用:
ps -eLf | grep <USER> | awk '{ num += $6 } END { print num }'
其中 <USER>使用所需的用户名。
<USER>
我的答案是更多的 gui,但仍然在终端。 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>
首先执行以下命令获取进程 ID (pid) :
Ps-ef | grep (用于 ps-ef | grep java)
现在替换下面命令中的 pid 并执行以获取进程的总线程数。
快点,快点,快点,快点