一、proc查看進程和線程
該方法是個人最為推薦,也最喜歡的一種方法。進程文件下,有幾種方式可以獲取目前進程開啟的進程數。
查看status文件:
# cat /proc/5877/status Name: mysqld State: S (sleeping) Tgid: 5877 Pid: 5877 PPid: 1 ……………………省略 Threads: 107 ……………………省略
上面的threads 就是mysqld進程(這里pid是5877)開啟的線程數,為107個。
查看sched文件:
# cat /proc/5877/sched mysqld (5877, #threads: 107) --------------------------------------------------------- se.exec_start : 3493311530.012024 se.vruntime : 11069857.718492 se.sum_exec_runtime : 193606.973849 se.statistics.wait_start : 0.000000 ………………省略
第一行就指出了mysqld的pid和總線程數。
查看線程的具體情況:
# ls /proc/5877/task 12134 17039 22613 22619 22626 22631 22636 22641 22646 22653 22661 22671 22681 22690 22699 22725 22741 29749 5891 5896 5920 9441 12142 17161 22614 22621 22627 22632 22637 22642 22648 22654 22663 22673 22683 22692 22701 22727 22743 30458 5892 5897 5921 9764 12290 17163 22615 22622 22628 22633 22638 22643 22649 22655 22665 22675 22684 22693 22703 22735 22745 5877 5893 5898 5930 12352 17253 22616 22624 22629 22634 22639 22644 22650 22656 22667 22676 22687 22695 22705 22738 22747 5889 5894 5918 644 12874 22612 22617 22625 22630 22635 22640 22645 22652 22658 22669 22679 22689 22697 22723 22740 2708 5890 5895 5919 9318
task下是以線程id 值命名的目錄,可以使用ls |wc 統計出的值和上面兩種方式查出的結果一樣。進入各線程id的目錄,可以查看具體線程的資源信息。
二、Jvm棧線程ID對應
查看負載高的線程id,以 26092 為例,轉換成16進制
[bppf_b@CSHJ_QZJK2 ~]$ echo 'obase=16;26092' | bc 65EC
3.通過jstack 命令查看棧信息
"pool-1-thread-1" daemon prio=10 tid=0x00007fdd94037800 nid=0x65ec waiting on condition [0x00007fddf04be000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000000c8025c40> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:662)
總結:java棧中, 第一行里,"
pool-1-thread-1"是 Thread Name
tid指Java Thread id。
nid指native線程的id。
prio是線程優先級。
指線程在0x00000000c8025c40 這個地址上等待。
waiting on condition [0x00007fddf04be000] 線程棧起始地址
參考:http://www.361way.com/linux-process-threads/3664.html