Linux上の特定のプロセスで使用されるスレッドの数を監視したいと思います。プロセスのパフォーマンスに影響を与えずにこの情報を取得する簡単な方法はありますか?
特定の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
は、システムで現在実行されているすべてのスレッドとプロセスのリストを提供します。または、top
コマンドを実行し、「H」を押してスレッドリストを切り替えることができます。
使用する場合:
ps uH p <PID_OF_U_PROCESS> | wc -l
「wc」がカウントしている行の1つが「ps」コマンドのヘッダーであるため、結果から1を減算する必要があります。
JStackは非常に安価です。1つのオプションは、出力をgrepにパイプしてアクティブなスレッドを見つけ、wc -lにパイプすることです。
よりグラフィカルなJConsoleは、特定のプロセスのスレッド数を表示します。
特定のプロセスのスレッド数を表示する1つのコマンドを次に示します。
ps -L -o pid= -p <pid> | wc -l
他のps
ベースの回答とは異なり、1
オプションのおかげでps
ヘッダー行がないので、出力から-o pid=
を減算する必要はありません。
$ 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
新しい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」をコンパイルする場合は、 here にあります。
特定のpidに対してcpuを使用しているスレッドの数を調べようとしている場合は、次を使用します。
top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l
本当にactiveであるスレッドに興味がある場合-何かをするときのように(ブロックされず、timed_waitingではなく、「スレッド実行中」を報告しないが、ストリームがデータを提供するのを実際に待っています)アイドル状態ではあるがライブに座っているのではなく、 jstack-active に興味があるかもしれません。
この単純なbashスクリプトはjstack
を実行し、その後、ヒューリスティックによりアイドル状態になっていると思われるすべてのスレッドを除外し、実際にCPUサイクルを消費しているスレッドのスタックトレースを表示します。