赞
踩
linux 在分析问题时,经常要查看进程的相关信息,但要进一步深入剖析时,就需要查看进程下的各线程的情况。先说下,如何了解一个进程到底开启了多少线程?
一、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的目录,可以查看具体线程的资源信息。
注:上面查看文件的方法,主要是对单进程的线程统计。如像统计apache、nginx、zabbix这类程序会同时开启N个进程。如果要统计这类程序的线程数,就是所有进程下的线程数的之和。
二、pstree查看法
该方法也属于相对比较简单的方法,如下:
# pstree
init─┬─acpid
├─apache2───15*[apache2]
├─atd
├─cf-execd
├─cf-serverd
├─cron
├─dbus-daemon
├─dhclient3
├─6*[getty]
├─java───13*[{java}]
├─mysqld───106*[{mysqld}]
├─nrpe
├─ntpd
├─rsyslogd───3*[{rsyslogd}]
├─snmpd
├─snmptt───snmptt
├─sshd───sshd───sshd───bash───sudo───su───bash───pstree
├─udevd───2*[udevd]
├─upstart-socket-
├─upstart-udev-br
├─vsftpd
├─whoopsie───{whoopsie}
├─zabbix_agentd───4*[zabbix_agentd]
└─zabbix_server─┬─105*[zabbix_server]
└─zabbix_server───sh───fping
如上面,apache共有16个线程(15+1),mysqld有107个线程(106+1)。如果想查看某个进程的详细线程情况,可以使用pstree -p 的方法:
# pstree -p 5877
mysqld(5877)─┬─{mysqld}(5889)
├─{mysqld}(5890)
├─{mysqld}(5891)
├─{mysqld}(5892)
├─{mysqld}(5893)
……………………省略
# pstree -p 5877 |wc -l
106
三、ps命令查看法
ps命令中与线程相关的参数比较多,具体可以使用man ps|grep threads 查看
H Show threads as if they were processes.
-L Show threads, possibly with LWP and NLWP columns.
m Show threads after processes.
-m Show threads after processes.
-T Show threads, possibly with SPID column.
这里主要以-L参数为例:
# ps -eLf | grep mysql
mysql 5877 1 5877 0 107 Jun13 ? 00:03:13 /usr/sbin/mysqld
mysql 5877 1 5889 0 107 Jun13 ? 00:00:00 /usr/sbin/mysqld
mysql 5877 1 5890 0 107 Jun13 ? 00:00:39 /usr/sbin/mysqld
mysql 5877 1 5891 0 107 Jun13 ? 00:01:07 /usr/sbin/mysqld
mysql 5877 1 5892 0 107 Jun13 ? 00:01:24 /usr/sbin/mysqld
mysql 5877 1 5893 0 107 Jun13 ? 00:01:24 /usr/sbin/mysqld
mysql 5877 1 5894 0 107 Jun13 ? 00:01:22 /usr/sbin/mysqld
mysql 5877 1 5895 0 107 Jun13 ? 00:21:38 /usr/sbin/mysqld
………………省略
-L参数显示进程,并尽量显示其LWP(线程ID)和NLWP(线程的个数)。上面命令查询结果的第二列为PID,第三列为PPID,第四列为LWP,第六列为NLWP。
ps 属于linux下相对比较全能且强大的命令,其还可以查看具体某个线程运行在哪个CPU上,如下:
# ps -eo ruser,pid,ppid,lwp,psr,args -L | grep mysql
mysql 5877 1 5877 0 /usr/sbin/mysqld
mysql 5877 1 5889 1 /usr/sbin/mysqld
mysql 5877 1 5890 1 /usr/sbin/mysqld
mysql 5877 1 5891 0 /usr/sbin/mysqld
mysql 5877 1 5892 0 /usr/sbin/mysqld
mysql 5877 1 5893 0 /usr/sbin/mysqld
mysql 5877 1 5894 0 /usr/sbin/mysqld
mysql 5877 1 5895 2 /usr/sbin/mysqld
mysql 5877 1 5896 3 /usr/sbin/mysqld
mysql 5877 1 5897 0 /usr/sbin/mysqld
mysql 5877 1 5898 3 /usr/sbin/mysqld
其中,每一列依次为:用户ID,进程ID,父进程ID,线程ID,运行该线程的CPU的序号,命令行参数(包括命令本身)。
四、top命令查看
同样top也属于全能型命令(也是相对的),在top命令后,按H键;或者top -H 可以显示各个线程的情况。在top中也可以查看进程(或线程)在哪个CPU上执行的,执行top后,按f,按j(选中* J: P = Last used cpu (SMP)),然后按空格或回车退出设置,在top的显示中会多出P这一列是最近一次运行该线程(或进程)的CPU。
五、pstack查看
pstack命令一般情况下用不到,其是一个栈跟踪的命令 。一般和 core dump和程序分析相关,也可以获取线程的详细信息。如:
# pstack 2178
Thread 4 (Thread 0xb7fd7b90 (LWP 2179)):
#0 0x00110402 in __kernel_vsyscall ()
#1 0x009418d5 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/i686/nosegneg/libpthread.so.0
#2 0x00163f4f in ?? () from /usr/lib/libisc.so.15
#3 0x0093d5e2 in start_thread () from /lib/i686/nosegneg/libpthread.so.0
#4 0x005d4d7e in clone () from /lib/i686/nosegneg/libc.so.6
Thread 3 (Thread 0xb75d6b90 (LWP 2180)):
#0 0x00110402 in __kernel_vsyscall ()
#1 0x00941c02 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib/i686/nosegneg/libpthread.so.0
#2 0x0017a4d2 in isc_condition_waituntil () from /usr/lib/libisc.so.15
#3 0x00166890 in ?? () from /usr/lib/libisc.so.15
#4 0x0093d5e2 in start_thread () from /lib/i686/nosegneg/libpthread.so.0
#5 0x005d4d7e in clone () from /lib/i686/nosegneg/libc.so.6
Thread 2 (Thread 0xb6bd5b90 (LWP 2181)):
#0 0x00110402 in __kernel_vsyscall ()
#1 0x005d5496 in epoll_wait () from /lib/i686/nosegneg/libc.so.6
#2 0x001759c1 in ?? () from /usr/lib/libisc.so.15
#3 0x0093d5e2 in start_thread () from /lib/i686/nosegneg/libpthread.so.0
#4 0x005d4d7e in clone () from /lib/i686/nosegneg/libc.so.6
Thread 1 (Thread 0xb7fd86d0 (LWP 2178)):
#0 0x00110402 in __kernel_vsyscall ()
#1 0x0052a5c7 in sigsuspend () from /lib/i686/nosegneg/libc.so.6
#2 0x00168262 in isc_app_run () from /usr/lib/libisc.so.15
#3 0x002e9623 in main ()
以上是对named进程进行的一个分析。可以看出一分有四个线程,对每个线程的程序调用程序print 出来了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。