Linux下查看线程数的几种方法汇总
Linux下查看线程数的几种方法汇总
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.Linux下查看某个进程的线程数量
pstree命令以树状图显示进程间的关系(display a tree of processes)。ps命令可以显示当前正在运行的那些进程的信息,但是对于它们之间的关系却显示得不够清晰。在Linux系统中,系统调用fork可以创建子进程,通过子shell也可以创建子进程,Linux系统中进程之间的关系天生就是一棵树,树的根就是进程PID为1的init进程。
1>.安装pstree命令行工具,包名为:“psmisc”
[root@yinzhengjie bin]# yum -y install psmisc Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile Resolving Dependencies --> Running transaction check ---> Package psmisc.x86_64 0:22.20-15.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ==================================================================================================================================================================== Package Arch Version Repository Size ==================================================================================================================================================================== Installing: psmisc x86_64 22.20-15.el7 base 141 k Transaction Summary ==================================================================================================================================================================== Install 1 Package Total download size: 141 k Installed size: 475 k Downloading packages: psmisc-22.20-15.el7.x86_64.rpm | 141 kB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : psmisc-22.20-15.el7.x86_64 1/1 Verifying : psmisc-22.20-15.el7.x86_64 1/1 Installed: psmisc.x86_64 0:22.20-15.el7 Complete! [root@yinzhengjie bin]#
2>.相关参数介绍
Usage: pstree [ -a ] [ -c ] [ -h | -H PID ] [ -l ] [ -n ] [ -p ] [ -g ] [ -u ] [ -A | -G | -U ] [ PID | USER ] pstree -V Display a tree of processes. -a, --arguments 显示命令时候,并显示其参数的完整内容 -A, --ascii 各进程树之间的连接以ASCII码字符来连接 -c, --compact 取消同名兄弟进程的合并(默认会将同名的兄弟进程合并) -h, --highlight-all 突出当前进程及其祖先 -H PID, --highlight-pid=PID 突出这个过程和它的祖先 -g, --show-pgids 显示进程组ID; -G, --vt100 使用VT100线绘制字符 -l, --long 不要截断长线。 -n, --numeric-sort 用PID排序输出 -N type, --ns-sort=type sort by namespace type (ipc, mnt, net, pid, user, uts) -p, --show-pids 同时列出每个进程的PID -s, --show-parents 显示选定过程的父母 -S, --ns-changes 显示命名空间转换
-u, --uid-changes 同时列出每个进程的所属账号名称 -U, --unicode 各进程树之间的连接以utf8字符来连接,某些终端可能会有错误 -V, --version 显示版本信息 -Z, --security-context 显示SELinux的安全上下文 PID 从这个PID开始;默认值是1(init)。 USER 只显示在该用户的进程中的树
3>.案例1-显示进程之间的关系
[root@yinzhengjie bin]# pstree -apnh systemd,1 --switched-root --system --deserialize 22 ├─systemd-journal,730 ├─systemd-udevd,758 ├─lvmetad,761 -f ├─auditd,1006 │ └─{auditd},1007 ├─irqbalance,1040 --foreground ├─systemd-logind,1041 ├─polkitd,1043 --no-debug │ ├─{polkitd},1048 │ ├─{polkitd},1051 │ ├─{polkitd},1053 │ ├─{polkitd},1054 │ └─{polkitd},1055 ├─dbus-daemon,1044 --system --address=systemd: --nofork --nopidfile --systemd-activation ├─NetworkManager,1046 --no-daemon │ ├─{NetworkManager},1072 │ └─{NetworkManager},1074 ├─crond,1047 -n ├─chronyd,1060 ├─agetty,1065 --noclear tty1 linux ├─sshd,1400 -D │ ├─sshd,1985 │ │ └─bash,1987 │ │ └─pstree,1660 -apnh │ └─sshd,2017 │ └─bash,2019 ├─tuned,1401 -Es /usr/sbin/tuned -l -P │ ├─{tuned},1706 │ ├─{tuned},1707 │ ├─{tuned},1708 │ └─{tuned},1779 ├─gmetad,1402 -d 1 │ ├─{gmetad},1403 │ ├─{gmetad},1404 │ ├─{gmetad},1405 │ ├─{gmetad},1406 │ ├─{gmetad},1407 │ ├─{gmetad},1408 │ ├─{gmetad},1409 │ └─{gmetad},1410 ├─httpd,1411 -DFOREGROUND │ ├─httpd,1757 -DFOREGROUND │ ├─httpd,1758 -DFOREGROUND │ ├─httpd,1759 -DFOREGROUND │ ├─httpd,1760 -DFOREGROUND │ └─httpd,1761 -DFOREGROUND ├─rsyslogd,1414 -n │ ├─{rsyslogd},1421 │ └─{rsyslogd},1427 ├─zabbix_agentd,1418 -c /etc/zabbix/zabbix_agentd.conf │ ├─zabbix_agentd,1420 │ ├─zabbix_agentd,1422 │ ├─zabbix_agentd,1423 │ ├─zabbix_agentd,1424 │ └─zabbix_agentd,1425 ├─gmond,1851 │ └─{gmond},1855 └─java,2484 -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp/soft/zk/bin/../build/classes:/soft/zk/bin/../build/lib/*.jar:/soft/zk/bin/../lib/ ├─{java},2487 ├─{java},2488 ├─{java},2489 ├─{java},2490 ├─{java},2491 ├─{java},2492 ├─{java},2493 ├─{java},2494 ├─{java},2495 ├─{java},2496 ├─{java},2497 ├─{java},2498 ├─{java},2499 ├─{java},2500 ├─{java},2501 ├─{java},2502 ├─{java},2503 ├─{java},2504 ├─{java},2505 ├─{java},2506 ├─{java},2507 ├─{java},2508 ├─{java},2509 ├─{java},2510 ├─{java},2511 ├─{java},2512 ├─{java},2513 ├─{java},2514 ├─{java},2515 ├─{java},2516 ├─{java},2517 ├─{java},2518 ├─{java},2519 ├─{java},2520 ├─{java},2521 ├─{java},2522 ├─{java},2523 ├─{java},2524 ├─{java},2525 ├─{java},2526 ├─{java},2527 ├─{java},2528 ├─{java},2529 ├─{java},2530 ├─{java},2531 ├─{java},2532 ├─{java},2534 ├─{java},2535 ├─{java},2536 ├─{java},2537 ├─{java},2538 ├─{java},2539 ├─{java},2540 ├─{java},2541 ├─{java},2542 ├─{java},2543 ├─{java},2544 ├─{java},2545 ├─{java},2546 ├─{java},2547 ├─{java},2548 └─{java},2549 [root@yinzhengjie bin]#
4>.案例2-以树状图显示进程,还显示进程PID
[root@yinzhengjie bin]# pstree -p systemd(1)─┬─NetworkManager(1046)─┬─{NetworkManager}(1072) │ └─{NetworkManager}(1074) ├─agetty(1065) ├─auditd(1006)───{auditd}(1007) ├─chronyd(1060) ├─crond(1047) ├─dbus-daemon(1044) ├─gmetad(1402)─┬─{gmetad}(1403) │ ├─{gmetad}(1404) │ ├─{gmetad}(1405) │ ├─{gmetad}(1406) │ ├─{gmetad}(1407) │ ├─{gmetad}(1408) │ ├─{gmetad}(1409) │ └─{gmetad}(1410) ├─gmond(1851)───{gmond}(1855) ├─httpd(1411)─┬─httpd(1757) │ ├─httpd(1758) │ ├─httpd(1759) │ ├─httpd(1760) │ └─httpd(1761) ├─irqbalance(1040) ├─java(2484)─┬─{java}(2487) │ ├─{java}(2488) │ ├─{java}(2489) │ ├─{java}(2490) │ ├─{java}(2491) │ ├─{java}(2492) │ ├─{java}(2493) │ ├─{java}(2494) │ ├─{java}(2495) │ ├─{java}(2496) │ ├─{java}(2497) │ ├─{java}(2498) │ ├─{java}(2499) │ ├─{java}(2500) │ ├─{java}(2501) │ ├─{java}(2502) │ ├─{java}(2503) │ ├─{java}(2504) │ ├─{java}(2505) │ ├─{java}(2506) │ ├─{java}(2507) │ ├─{java}(2508) │ ├─{java}(2509) │ ├─{java}(2510) │ ├─{java}(2511) │ ├─{java}(2512) │ ├─{java}(2513) │ ├─{java}(2514) │ ├─{java}(2515) │ ├─{java}(2516) │ ├─{java}(2517) │ ├─{java}(2518) │ ├─{java}(2519) │ ├─{java}(2520) │ ├─{java}(2521) │ ├─{java}(2522) │ ├─{java}(2523) │ ├─{java}(2524) │ ├─{java}(2525) │ ├─{java}(2526) │ ├─{java}(2527) │ ├─{java}(2528) │ ├─{java}(2529) │ ├─{java}(2530) │ ├─{java}(2531) │ ├─{java}(2532) │ ├─{java}(2534) │ ├─{java}(2535) │ ├─{java}(2536) │ ├─{java}(2537) │ ├─{java}(2538) │ ├─{java}(2539) │ ├─{java}(2540) │ ├─{java}(2541) │ ├─{java}(2542) │ ├─{java}(2543) │ ├─{java}(2544) │ ├─{java}(2545) │ ├─{java}(2546) │ ├─{java}(2547) │ ├─{java}(2548) │ └─{java}(2549) ├─lvmetad(761) ├─polkitd(1043)─┬─{polkitd}(1048) │ ├─{polkitd}(1051) │ ├─{polkitd}(1053) │ ├─{polkitd}(1054) │ └─{polkitd}(1055) ├─rsyslogd(1414)─┬─{rsyslogd}(1421) │ └─{rsyslogd}(1427) ├─sshd(1400)─┬─sshd(1985)───bash(1987)───pstree(2403) │ └─sshd(2017)───bash(2019) ├─systemd-journal(730) ├─systemd-logind(1041) ├─systemd-udevd(758) ├─tuned(1401)─┬─{tuned}(1706) │ ├─{tuned}(1707) │ ├─{tuned}(1708) │ └─{tuned}(1779) └─zabbix_agentd(1418)─┬─zabbix_agentd(1420) ├─zabbix_agentd(1422) ├─zabbix_agentd(1423) ├─zabbix_agentd(1424) └─zabbix_agentd(1425) [root@yinzhengjie bin]#
5>.案例3-显示命令和其完整参数
[root@yinzhengjie bin]# pstree -a systemd --switched-root --system --deserialize 22 ├─NetworkManager --no-daemon │ └─2*[{NetworkManager}] ├─agetty --noclear tty1 linux ├─auditd │ └─{auditd} ├─chronyd ├─crond -n ├─dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation ├─gmetad -d 1 │ └─8*[{gmetad}] ├─gmond │ └─{gmond} ├─httpd -DFOREGROUND │ ├─httpd -DFOREGROUND │ ├─httpd -DFOREGROUND │ ├─httpd -DFOREGROUND │ ├─httpd -DFOREGROUND │ └─httpd -DFOREGROUND ├─irqbalance --foreground ├─java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp/soft/zk/bin/../build/classes:/soft/zk/bin/../build/lib/*.jar:/soft/zk/bin/../lib/ │ └─62*[{java}] ├─lvmetad -f ├─polkitd --no-debug │ └─5*[{polkitd}] ├─rsyslogd -n │ └─2*[{rsyslogd}] ├─sshd -D │ ├─sshd │ │ └─bash │ │ └─pstree -a │ └─sshd │ └─bash ├─systemd-journal ├─systemd-logind ├─systemd-udevd ├─tuned -Es /usr/sbin/tuned -l -P │ └─4*[{tuned}] └─zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf ├─zabbix_agentd ├─zabbix_agentd ├─zabbix_agentd ├─zabbix_agentd └─zabbix_agentd [root@yinzhengjie bin]#
6>.案例4-取消合并,默认会将同名的兄弟进程合并,-c取消合并,分开显示
[root@yinzhengjie bin]# pstree -c systemd─┬─NetworkManager─┬─{NetworkManager} │ └─{NetworkManager} ├─agetty ├─auditd───{auditd} ├─chronyd ├─crond ├─dbus-daemon ├─gmetad─┬─{gmetad} │ ├─{gmetad} │ ├─{gmetad} │ ├─{gmetad} │ ├─{gmetad} │ ├─{gmetad} │ ├─{gmetad} │ └─{gmetad} ├─gmond───{gmond} ├─httpd─┬─httpd │ ├─httpd │ ├─httpd │ ├─httpd │ └─httpd ├─irqbalance ├─java─┬─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ ├─{java} │ └─{java} ├─lvmetad ├─polkitd─┬─{polkitd} │ ├─{polkitd} │ ├─{polkitd} │ ├─{polkitd} │ └─{polkitd} ├─rsyslogd─┬─{rsyslogd} │ └─{rsyslogd} ├─sshd─┬─sshd───bash───pstree │ └─sshd───bash ├─systemd-journal ├─systemd-logind ├─systemd-udevd ├─tuned─┬─{tuned} │ ├─{tuned} │ ├─{tuned} │ └─{tuned} └─zabbix_agentd─┬─zabbix_agentd ├─zabbix_agentd ├─zabbix_agentd ├─zabbix_agentd └─zabbix_agentd [root@yinzhengjie bin]#
7>.案例5-查询zookeeper进程打开的线程数
[root@yinzhengjie bin]# jps 2484 QuorumPeerMain 5127 Jps [root@yinzhengjie bin]# [root@yinzhengjie bin]# [root@yinzhengjie bin]# pstree -p `jps | grep QuorumPeerMain | awk '{print $1}'` | wc -l 62 [root@yinzhengjie bin]# [root@yinzhengjie bin]# [root@yinzhengjie bin]# pstree -p 2484 | wc -l 62 [root@yinzhengjie bin]#
总结:
通过pstree清晰的看到进程的父子关系,但是进程状态查看,还是需要ps、top等命令。pstree命令是用于查看进程树之间的关系,即哪个进程是父进程,哪个是子进程,可以清楚的看出来是谁创建了谁。
推荐学习的博客:http://www.runoob.com/linux/linux-command-manual.html
二.使用top命令查看
1>.使用pstree命令查看"ResourceManager"进程打开的线程数
[root@yinzhengjie ~]# jps 6178 Jps 10339 ResourceManager 10309 JobTracker 9462 NameNode 9464 Bootstrap 9466 DFSZKFailoverController 11052 HistoryServer 11054 HistoryServer 10367 JobHistoryServer [root@yinzhengjie ~]# [root@yinzhengjie ~]# [root@yinzhengjie ~]# pstree -p 10339 | wc -l 248 [root@yinzhengjie ~]#
2>.使用top命令查看“ResourceManager”打开的进程数
[root@yinzhengjie ~]# top -H -p 10339 top - 01:38:45 up 7 days, 1:33, 3 users, load average: 0.02, 0.06, 0.05 Threads: 247 total, 0 running, 247 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.1 us, 0.0 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 18328176 total, 11610648 free, 5253524 used, 1464004 buff/cache KiB Swap: 9306108 total, 9306108 free, 0 used. 12658008 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10791 yarn 20 0 3131380 622256 23808 S 0.3 3.4 0:15.83 java 10339 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:00.25 java 10608 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:03.12 java 10609 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:01.65 java 10610 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:01.65 java 10611 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:01.69 java 10612 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:01.66 java 10613 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:01.70 java 10614 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:01.69 java 10615 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:01.67 java 10616 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:01.68 java 10617 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:01.68 java 10618 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:01.67 java 10619 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:01.70 java 10620 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:01.68 java 10621 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:01.66 java 10622 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:01.67 java 10623 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:01.69 java 10624 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:00.00 java 10625 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:00.00 java 10626 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:00.00 java 10627 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:00.00 java 10628 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:15.73 java 10645 yarn 20 0 3131380 622256 23808 S 0.0 3.4 1:59.54 java 10651 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:00.06 java 10652 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:00.04 java 10656 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:00.00 java 10657 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:00.00 java 10658 yarn 20 0 3131380 622256 23808 S 0.0 3.4 0:08.24 java [root@yinzhengjie ~]#
三.直接去“/proc”对应PID的status目录查看
由于在Linux操作系统中,正在运行的程序都会在/proc这个目录下存放运行时文件的状态信息,因此我们在这个目录下,找到对应的进程ID就可以查看到该进程打开的线程数。当然还有一些其他的详细信息都在这个目录下存放着。
[root@yinzhengjie ~]# cat /proc/10339/status Name: java Umask: 0022 State: S (sleeping) Tgid: 10339 Ngid: 0 Pid: 10339 PPid: 8410 TracerPid: 0 Uid: 988 988 988 988 Gid: 985 985 985 985 FDSize: 512 Groups: 985 994 VmPeak: 3131384 kB VmSize: 3131380 kB VmLck: 0 kB VmPin: 0 kB VmHWM: 622300 kB VmRSS: 622256 kB RssAnon: 598448 kB RssFile: 23808 kB RssShmem: 0 kB VmData: 2962116 kB VmStk: 144 kB VmExe: 4 kB VmLib: 17152 kB VmPTE: 1808 kB VmSwap: 0 kB Threads: 248 SigQ: 0/71498 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000000000000 SigCgt: 2000000181005ccf CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 CapBnd: 0000001fffffffff CapAmb: 0000000000000000 Seccomp: 0 Cpus_allowed: fffff Cpus_allowed_list: 0-19 Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000003 Mems_allowed_list: 0-1 voluntary_ctxt_switches: 67 nonvoluntary_ctxt_switches: 19 [root@yinzhengjie ~]#
四.直接去“/proc”对应PID的task目录查看
[root@yinzhengjie ~]# jps 8704 Jps 10339 ResourceManager 10309 JobTracker 9462 NameNode 9464 Bootstrap 9466 DFSZKFailoverController 11052 HistoryServer 11054 HistoryServer 10367 JobHistoryServer [root@yinzhengjie ~]# [root@yinzhengjie ~]# [root@yinzhengjie ~]# pstree -p 10339 | wc -l 248 [root@yinzhengjie ~]# [root@yinzhengjie ~]# [root@yinzhengjie ~]# ll /proc/10339/task/ | wc -l 248 [root@yinzhengjie ~]# [root@yinzhengjie ~]#