我想监视Linux上特定进程使用的线程数。 是否有一种简单的方法可以在不影响流程性能的情况下获取此信息?
答案 0 :(得分:134)
答案 1 :(得分:42)
进程中的每个线程都在/proc/<pid>/task
下创建一个目录。计算目录数,并获得线程数。
答案 2 :(得分:40)
获取给定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 }'
答案 3 :(得分:28)
cat /proc/<PROCESS_PID>/status | grep Threads
答案 4 :(得分:20)
ps -eLf
将为您提供当前在系统上运行的所有线程和进程的列表。
或者,您可以运行top
命令然后点击&#39; H&#39;切换线程列表。
答案 5 :(得分:6)
如果您使用:
ps uH p <PID_OF_U_PROCESS> | wc -l
你必须在结果中减去1,因为“wc”计算的行之一是“ps”命令的标题。
答案 6 :(得分:6)
JStack非常便宜 - 一种选择是通过grep管道输出来查找活动线程然后通过wc -l管道。
更多图形化的是JConsole,它显示给定进程的线程数。
答案 7 :(得分:5)
这是一个显示给定进程的线程数的命令:
ps -L -o pid= -p <pid> | wc -l
与其他基于ps
的答案不同,由于1
选项,因此没有必要从其输出中减去ps
,因为没有-o pid=
标题行。
答案 8 :(得分:5)
curl -XPUT localhost:9200/**myindex**/person/_meta -d '{
"type": "mongodb",
"mongodb": {
"servers": [
{ "host": "localhost", "port": 27017 }
],
"db": "newPerson",
"collection": "Person",
"options": { "secondary_read_preference": true },
"gridfs": false
},
"index": {
"name": "mongoindex",
"type": "person"
}
H - 列出流程中的所有单个线程
或
$ ps H p pid-id
pid-id是进程ID
例如......(截断以下输出)
$cat /proc/pid-id/status
答案 9 :(得分:4)
较新的JDK发行版附带JConsole和VisualVM。两者都是从正在运行的Java进程中获取脏信息的绝佳工具。如果必须以编程方式执行此操作,请调查JMX。
答案 10 :(得分:3)
jvmtop可以在其他指标旁边显示当前的jvm线程数。
答案 11 :(得分:1)
我的答案是更多gui,但仍在终端机内。 Htop可能需要进行一些设置。
答案 12 :(得分:1)
如果您尝试使用cpu查找给定pid的线程数,我会使用:
top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l
答案 13 :(得分:1)
最简单的方法是使用“htop”。您可以安装“htop”(顶级版的更高版本),它将显示您的所有内核,进程和内存使用情况。
按“Shift + H”显示所有进程或再按一次将其隐藏。 按“F4”键搜索您的进程名称。
在Ubuntu或Debian上安装:
sudo apt-get install htop
在Redhat或CentOS上安装:
yum install htop
dnf install htop [On Fedora 22+ releases]
如果你想从源代码编译“htop”,你会发现它here。
答案 14 :(得分:0)
如果您正在寻找多个进程的线程数,其他答案对您不起作用,因为您看不到进程名称或 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>
答案 15 :(得分:0)
如果要在Linux系统中每个用户的线程数,则应使用:
ps -eLf | grep <USER> | awk '{ num += $6 } END { print num }'
其中<USER>
使用所需的用户名。
答案 16 :(得分:0)
答案 17 :(得分:0)
如果您对那些真正活跃的线程感兴趣 - 就像做某事一样(没有阻止,没有timed_waiting,没有报告&#34;线程运行&#34;但是真的等待流提供数据)而不是闲着但活着 - 那么你可能对jstack-active感兴趣。
这个简单的bash脚本运行jstack
,然后过滤掉所有通过启发式方法似乎空闲的线程,显示那些实际消耗CPU周期的线程的堆栈跟踪。