Làm thế nào tôi có thể theo dõi số lượng luồng của một quá trình trên linux?


135

Tôi muốn theo dõi số lượng luồng được sử dụng bởi một quy trình cụ thể trên Linux. Có một cách dễ dàng để có được thông tin này mà không ảnh hưởng đến hiệu suất của quá trình?


Sẽ thế nào nếu quá trình của một ứng dụng chỉ chạy trong một thời gian ngắn? (Nói 2 giây.)
2023370

Câu trả lời:



73

Để có được số lượng chủ đề cho một pid nhất định:

$ ps -o nlwp <pid>

Trường hợp nlwpviết tắt của Số lượng quá trình trọng lượng nhẹ (chủ đề) . Như vậy psbí danh nlwpđể thcount, có nghĩa là

$ ps -o thcount <pid>

cũng làm việc

Nếu bạn muốn theo dõi số lượng luồng, chỉ cần sử dụng watch:

$ watch ps -o thcount <pid>

Để lấy tổng của tất cả các luồng đang chạy trong hệ thống:

$ ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'

2
Câu trả lời hữu ích nhất ở đây. Đặc biệt là watchchỉ huy. Tuy nhiên, lưu ý rằng việc sử dụng thcountcó thể thất bại đối với một số người (Red Hat ...), mặc dù có nlwphiệu quả với tôi.
Joshua Detwiler

50

Mỗi luồng trong một quy trình tạo ra một thư mục theo /proc/<pid>/task. Đếm số lượng thư mục và bạn có số lượng chủ đề.


1
Để thêm vào nhận xét trên. Bạn có thể sử dụng lệnh này để tìm số lượng chủ đề : find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l. Chỉ cần thay thế <PID> bằng ID tiến trình mà bạn có thể nhận được tophoặc sử dụngps
Navigatron


21

ps -eLftrên shell sẽ cung cấp cho bạn một danh sách tất cả các luồng và tiến trình hiện đang chạy trên hệ thống. Hoặc, bạn có thể chạy toplệnh sau đó nhấn 'H' để chuyển danh sách chủ đề.


Đây là nước sốt cho tôi. Tôi không muốn giới hạn nó chỉ trong một quy trình. Thật dễ dàng để thêm -pvào điều này nếu cần thiết, hoặc bất cứ điều gì khác. Đây là mức tối thiểu bạn cần để xem danh sách chủ đề.
Erick Robertson

6

JStack khá rẻ - một tùy chọn sẽ là dẫn đầu ra qua grep để tìm các luồng hoạt động và sau đó chuyển qua wc -l.

Đồ họa nhiều hơn là JConsole, hiển thị số lượng luồng cho một quy trình nhất định.


6

Nếu bạn dùng:

ps uH p <PID_OF_U_PROCESS> | wc -l

Bạn phải trừ 1 cho kết quả, vì một trong những dòng "wc" đang đếm là các tiêu đề của lệnh "ps".


Chào mừng bạn đến với StackOverflow. Có thể cho rằng, đây nên là một nhận xét cho câu trả lời của slav0nic. Tuy nhiên, theo tôi hiểu, khi bạn tham gia SO lần đầu tiên, bạn (vẫn) không thể nhận xét về câu trả lời cho đến khi bạn đạt được danh tiếng, vì vậy, thêm câu trả lời là tất cả những gì bạn có thể làm. Bạn nói đúng; bạn không nên đếm dòng tiêu đề từ psmột trong các chủ đề.
Jonathan Leffler

6

Đây là một lệnh hiển thị số lượng luồng của một quy trình nhất định:

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

Không giống như các pscâu trả lời dựa trên khác , ở đây không cần phải trừ 1từ đầu ra của nó vì không có psdòng tiêu đề nhờ vào -o pid=tùy chọn.


5

$ ps H p pid-id

H - Liệt kê tất cả các luồng riêng lẻ trong một quy trình

hoặc là

$cat /proc/pid-id/status

pid-id là ID tiến trình

ví dụ .. (Cắt bớt đầu ra bên dưới)

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

4

Các bản phân phối JDK mới hơn xuất xưởng với JConsole và VisualVM. Cả hai đều là những công cụ tuyệt vời để có được các chi tiết bẩn từ một quy trình Java đang chạy. Nếu bạn phải làm điều này theo chương trình, hãy điều tra JMX.



2

Cách dễ nhất là sử dụng "htop". Bạn có thể cài đặt "htop" (phiên bản hàng đầu của fancier) sẽ hiển thị cho bạn tất cả các lõi, quy trình và sử dụng bộ nhớ của bạn.

Nhấn "Shift + H" để hiển thị tất cả quá trình hoặc nhấn lại để ẩn nó. Nhấn phím "F4" để tìm kiếm tên quy trình của bạn.

Cài đặt trên Ubuntu hoặc Debian:

sudo apt-get install htop

Cài đặt trên Redhat hoặc CentOS:

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

Nếu bạn muốn biên dịch "htop" từ mã nguồn, bạn sẽ tìm thấy nó ở đây .


1

Nếu bạn đang cố gắng tìm ra số lượng chủ đề bằng cách sử dụng cpu cho một pid cụ thể, tôi sẽ sử dụng:

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

0

Nếu bạn quan tâm đến các luồng thực sự hoạt động - như khi thực hiện một thao tác nào đó (không bị chặn, không bị hẹn giờ, không báo cáo "luồng đang chạy" nhưng thực sự chờ đợi một luồng phát dữ liệu), trái ngược với việc ngồi không hoạt động nhưng trực tiếp - - sau đó bạn có thể quan tâm đến hoạt động jstack .

Tập lệnh bash đơn giản này chạy jstacksau đó lọc ra tất cả các luồng mà theo heuristic dường như không hoạt động, hiển thị cho bạn các dấu vết ngăn xếp cho các luồng thực sự tiêu thụ chu kỳ CPU.


0

VisualVM có thể hiển thị trạng thái rõ ràng của các luồng của một quy trình JVM cụ thể

nhập mô tả hình ảnh ở đây


1
tự gây ra đập? dang!
Andrew Scott Evans

0

Nếu bạn muốn số lượng luồng trên mỗi người dùng trong một hệ thống linux thì bạn nên sử dụng:

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

trong khi sử dụng tên người dùng mong muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.