ฉันต้องการตรวจสอบจำนวนเธรดที่ใช้โดยกระบวนการเฉพาะบน Linux มีวิธีง่ายๆในการรับข้อมูลนี้โดยไม่ส่งผลกระทบต่อประสิทธิภาพของกระบวนการหรือไม่?
ฉันต้องการตรวจสอบจำนวนเธรดที่ใช้โดยกระบวนการเฉพาะบน Linux มีวิธีง่ายๆในการรับข้อมูลนี้โดยไม่ส่งผลกระทบต่อประสิทธิภาพของกระบวนการหรือไม่?
คำตอบ:
1
เพราะมันพิมพ์บรรทัดเหมือนUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
สำหรับส่วนหัวตาราง
หากต้องการรับจำนวนเธรดสำหรับ 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 }'
watch
คำสั่ง. อย่างไรก็ตามโปรดทราบว่าการใช้thcount
อาจล้มเหลวสำหรับบางคน (Red Hat ... ) แม้ว่าจะnlwp
ใช้ได้ผลสำหรับฉัน
/proc/<pid>/task
ด้ายในกระบวนการที่แต่ละคนสร้างไดเรกทอรีภายใต้ นับจำนวนไดเร็กทอรีและคุณมีจำนวนเธรด
find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l
คุณสามารถใช้คำสั่งนี้เพื่อหาจำนวนกระทู้: เพียงแค่แทนที่<PID>ด้วย ID กระบวนการของคุณที่คุณจะได้รับจากtop
หรือใช้ps
cat /proc/<PROCESS_PID>/status | grep Threads
ps -eLf
บนเชลล์จะให้รายการเธรดและกระบวนการทั้งหมดที่กำลังทำงานอยู่บนระบบ หรือคุณสามารถเรียกใช้top
คำสั่งจากนั้นกด 'H' เพื่อสลับรายการเธรด
-p
ลงในสิ่งนี้ได้ง่ายหากจำเป็นหรืออย่างอื่น นี่คือขั้นต่ำที่คุณต้องเห็นรายการเธรด
หากคุณใช้:
ps uH p <PID_OF_U_PROCESS> | wc -l
คุณต้องลบ 1 ออกจากผลลัพธ์เนื่องจากหนึ่งในบรรทัด "wc" กำลังนับคือส่วนหัวของคำสั่ง "ps"
ps
เป็นหนึ่งในเธรด
JStack มีราคาไม่แพงนักทางเลือกหนึ่งคือการไพพ์เอาต์พุตผ่าน grep เพื่อค้นหาเธรดที่ใช้งานอยู่จากนั้นไปป์ผ่าน wc -l
กราฟิกมากขึ้นคือ JConsole ซึ่งแสดงจำนวนเธรดสำหรับกระบวนการที่กำหนด
นี่คือหนึ่งคำสั่งที่แสดงจำนวนเธรดของกระบวนการที่กำหนด:
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 คือรหัสกระบวนการ
เช่น .. (ตัดทอนเอาต์พุตด้านล่าง)
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" (เวอร์ชันที่ยอดเยี่ยมกว่า) ซึ่งจะแสดงการใช้งานคอร์กระบวนการและหน่วยความจำทั้งหมดของคุณ
กด "Shift + H" เพื่อแสดงกระบวนการทั้งหมดหรือกดอีกครั้งเพื่อซ่อน กดแป้น "F4" เพื่อค้นหาชื่อกระบวนการของคุณ
การติดตั้งบน Ubuntu หรือ Debian:
sudo apt-get install htop
การติดตั้งบน Redhat หรือ CentOS:
yum install htop
dnf install htop [On Fedora 22+ releases]
หากคุณต้องการที่จะรวบรวม "htop" จากรหัสที่มาคุณจะพบว่าที่นี่
หากคุณกำลังพยายามค้นหาจำนวนเธรดที่ใช้ cpu สำหรับ pid ที่กำหนดฉันจะใช้:
top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l
คำตอบของฉันคือ gui มากกว่า แต่ยังอยู่ในเทอร์มินัล อาจใช้ Htop ร่วมกับการตั้งค่าเล็กน้อย
หากคุณสนใจเธรดเหล่านั้นที่มีการใช้งานจริงเช่นเดียวกับการทำบางสิ่งบางอย่าง (ไม่ถูกบล็อกไม่ใช่ timed_waiting ไม่รายงานว่า "เธรดกำลังทำงาน" แต่กำลังรอให้สตรีมให้ข้อมูล) ซึ่งต่างจากการนั่งเฉยๆ แต่ใช้งานอยู่ - - แล้วคุณอาจจะสนใจในjstack ใช้งาน
สคริปต์ทุบตีอย่างง่ายนี้จะรันjstack
จากนั้นกรองเธรดทั้งหมดซึ่งโดยการวิเคราะห์ฮิวริสติกดูเหมือนจะไม่ทำงานโดยแสดงให้คุณเห็นสแต็กเทรซสำหรับเธรดเหล่านั้นซึ่งใช้รอบ CPU จริงๆ
หากคุณต้องการจำนวนเธรดต่อผู้ใช้ในระบบ linux คุณควรใช้:
ps -eLf | grep <USER> | awk '{ num += $6 } END { print num }'
ในขณะที่<USER>
ใช้ชื่อผู้ใช้ที่ต้องการ