Bagaimana saya bisa memonitor jumlah utas proses di linux?

135

Saya ingin memantau jumlah utas yang digunakan oleh proses tertentu di Linux. Apakah ada cara mudah untuk mendapatkan informasi ini tanpa memengaruhi kinerja proses?

Mengalir
sumber
Bagaimana jika proses aplikasi hanya berjalan untuk waktu yang singkat? (Katakan 2 detik.)
user2023370

Jawaban:

152

mencoba

ps huH p <PID_OF_U_PROCESS> | wc -l

atau htop

slav0nic
sumber
3
Saya percaya Anda harus mengurangi 1karena mencetak garis seperti USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDuntuk header tabel.
AhmetB - Google
2
Tanda 'h' menyembunyikan tajuk.
Thinkmassive
11
-1 Mengapa pipa output wcketika Anda bisa saja ps -o thcount <pid>? Lihat jawaban ini .
Aliran
73

Untuk mendapatkan jumlah utas untuk pid yang diberikan:

$ ps -o nlwp <pid>

Di mana nlwpsingkatan Jumlah Proses Ringan (utas) . Dengan demikian psalias nlwpuntuk thcount, yang berarti bahwa

$ ps -o thcount <pid>

tidak bekerja.

Jika Anda ingin memantau jumlah utas, cukup gunakan watch:

$ watch ps -o thcount <pid>

Untuk mendapatkan jumlah semua utas yang berjalan di sistem:

$ ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'
Thejaswi R
sumber
2
Jawaban paling berguna di sini. Terutama watchperintahnya. Namun, perhatikan bahwa menggunakan thcountdapat gagal untuk beberapa (Red Hat ...), meskipun nlwpbekerja untuk saya.
Joshua Detwiler
50

Setiap utas dalam suatu proses membuat direktori di bawah /proc/<pid>/task. Hitung jumlah direktori, dan Anda memiliki jumlah utas.

omong kosong
sumber
1
Untuk menambahkan komentar di atas. Anda dapat menggunakan perintah ini untuk menemukan jumlah thread: find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l. Cukup ganti <PID> dengan ID proses yang dapat Anda peroleh topatau gunakanps
Navigatron
33
cat /proc/<PROCESS_PID>/status | grep Threads
PbxMan
sumber
21

ps -eLfpada shell akan memberi Anda daftar semua utas dan proses yang saat ini berjalan pada sistem. Atau, Anda dapat menjalankan topperintah lalu tekan 'H' untuk beralih daftar utas.


sumber
Ini saus untukku. Saya tidak ingin membatasi hanya pada satu proses. Sangat mudah untuk menambahkan -pini jika perlu, atau apa pun. Ini adalah minimum yang Anda butuhkan untuk melihat daftar utas.
Erick Robertson
6

JStack cukup murah - salah satu opsi adalah menyalurkan output melalui grep untuk menemukan utas aktif dan kemudian menyalurkan melalui wc -l.

Lebih grafis adalah JConsole, yang menampilkan jumlah utas untuk proses yang diberikan.

rhys keepence
sumber
6

Jika Anda menggunakan:

ps uH p <PID_OF_U_PROCESS> | wc -l

Anda harus mengurangi 1 pada hasilnya, karena salah satu baris "wc" sedang menghitung adalah header dari perintah "ps".

flexo
sumber
Selamat datang di StackOverflow. Bisa dibilang, ini harus menjadi komentar untuk jawaban oleh slav0nic. Namun, seperti yang saya pahami, ketika Anda pertama kali bergabung dengan SO, Anda (masih) tidak dapat mengomentari jawaban sampai Anda mendapatkan reputasi, sehingga menambahkan jawaban adalah tentang semua yang dapat Anda lakukan. Anda benar; Anda seharusnya tidak menghitung baris header dari pssebagai salah satu utas.
Jonathan Leffler
6

Berikut adalah satu perintah yang menampilkan jumlah utas proses yang diberikan:

ps -L -o pid= -p <pid> | wc -l

Tidak seperti psjawaban berbasis lainnya , di sini tidak perlu mengurangi 1dari outputnya karena tidak ada psbaris header berkat -o pid=opsi.

Jlliagre
sumber
5

$ ps H p pid-id

H - Daftar semua utas secara individu dalam suatu proses

atau

$cat /proc/pid-id/status

pid-id adalah ID Proses

mis .. (Terpotong output di bawah ini)

root@abc:~# cat /proc/8443/status
Name:   abcdd
State:  S (sleeping)
Tgid:   8443
VmSwap:        0 kB
Threads:    4
SigQ:   0/256556
SigPnd: 0000000000000000
Avinash Reddy
sumber
4

Distribusi JDK yang lebih baru dikirimkan bersama JConsole dan VisualVM. Keduanya adalah alat yang fantastis untuk mendapatkan detail kotor dari proses Java yang sedang berjalan. Jika Anda harus melakukan ini secara terprogram, selidiki JMX.

basszero
sumber
2

jvmtop dapat menampilkan jumlah utas jvm saat ini di samping metrik lainnya.

MRalwasser
sumber
2

Cara termudah adalah menggunakan "htop". Anda dapat menginstal "htop" (versi teratas yang lebih bagus) yang akan menunjukkan semua inti, proses, dan penggunaan memori Anda.

Tekan "Shift + H" untuk menampilkan semua proses atau tekan lagi untuk menyembunyikannya. Tekan tombol "F4" untuk mencari nama proses Anda.

Menginstal di Ubuntu atau Debian:

sudo apt-get install htop

Menginstal di Redhat atau CentOS:

yum install htop
dnf install htop      [On Fedora 22+ releases]

Jika Anda ingin mengompilasi "htop" dari kode sumber, Anda akan menemukannya di sini .

Saeed Zahedian Abroodi
sumber
1

Jika Anda mencoba mencari tahu jumlah utas menggunakan cpu untuk pid yang diberikan, saya akan menggunakan:

top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l
Manuel Mndza Bañs
sumber
0

Jika Anda tertarik pada utas yang benar-benar aktif - seperti dalam melakukan sesuatu (tidak diblokir, tidak timed_waiting, tidak melaporkan "utas berjalan" tetapi benar-benar menunggu aliran untuk memberikan data) sebagai lawan dari duduk diam tetapi hidup - - maka Anda mungkin tertarik pada jstack-aktif .

Skrip bash sederhana ini berjalan jstackkemudian memfilter semua utas yang menurut heuristik tampaknya idle, menunjukkan kepada Anda tumpukan jejak untuk utas tersebut yang sebenarnya menghabiskan siklus CPU.

Berawan
sumber
0

VisualVM dapat menunjukkan status yang jelas dari utas proses JVM yang diberikan

masukkan deskripsi gambar di sini

Menyelam
sumber
1
thrashing yang disebabkan diri? sial!
Andrew Scott Evans
0

Jika Anda ingin jumlah utas per pengguna dalam sistem linux maka Anda harus menggunakan:

ps -eLf | grep <USER> | awk '{ num += $6 } END { print num }'

dimana gunakan nama pengguna yang diinginkan.

Andreas Foteas
sumber