一、背景
在日常系统运维工作中,遇到某个进程导致的系统运行异常,负载异常,或者想弄清某进程下有多少线程时,这时就需要查看当前的线程运行情况了,那如何查看系统的线程呢?本文将对此展开。
二、线程
1、查看指定进程的线程:
ps -T -p+进程ID
ps -Lf 进程ID
2、查看对应进程的那个线程占用CPU过高
top -H -p $PID
附:top快捷键
通过快捷键依次b ,x可高亮显示top的列找出需要的线程,默认CPU排序,Shift+< ,Shift+>可以左右移动高亮排序的列;
3、pstree工具查看
pstree命令以树状图显示进程间的关系(display a tree of processes)。ps命令可以显示当前正在运行的那些进程的信息,但是对于它们之间的关系却显示得不够清晰。在Linux系统中,系统调用fork可以创建子进程,通过子shell也可以创建子进程,Linux系统中进程之间的关系天生就是一棵树,树的根就是进程PID为1的init进程。
通过pstree清晰的看到进程的父子关系,但是进程状态查看,还是需要ps、top等命令。pstree命令是用于查看进程树之间的关系,即哪个进程是父进程,哪个是子进程,可以清楚的看出来是谁创建了谁。
如果系统没有这个命令,需要安装,执行: yum -y install psmisc //包名为:“psmisc”
eg1:显示进程之间的关系 :pstree -apnh
eg2:以树状图显示进程,还显示进程PID:pstree -p
eg3:显示命令和其完整参数 :pstree -a
eg4:取消合并,默认会将同名的兄弟进程合并,-c取消合并,分开显示: pstree -c
eg5:查看某进程打开的线程数:
pstree -p `jps | grep jar | awk '{print $1}'` | wc -l
4、直接去“/proc”对应PID的status目录查看
在Linux操作系统中,正在运行的程序都会在/proc这个目录下存放运行时文件的状态信息,因此我们在这个目录下,找到对应的进程ID就可以查看到该进程打开的线程数。当
或者按如下方法:
5、htop工具:它是top的增强版
安装:yum install -y ncurses-devel gcc //编译htop需要安装一个编译Linux内核的库
wget http://sourceforge.net/projects/htop/files/latest/download/htop-1.0.2.tar.gz
tar -zxf htop-1.0.2.tar.gz
cd htop-1.0.2
./configure && make && make install
或者通过yum来安装;
yum install epel-release -y //使用epel源
yum install htop
其中有2个快捷键:
K 显示/隐藏内核线程
H 显示/隐藏用户线程
6、pgrep:
pgrep来获得正在被调度的进程的相关信息。pgrep通过匹配其程序名,找到匹配的进程。
【常用参数】:
-l 同时显示进程名和PID
-o 当匹配多个进程时,显示进程号最小的那个
-n 当匹配多个进程时,显示进程号最大的那个
7、pstack
pstack显示每个进程的栈跟踪。
安装:yum install gdb -y
可以看出pstack实际上只是一个指向了gstack的符号链接。
8、java线程分析查看
linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找:
1)通过【 top -p 12377 -H】 查看java进程的有哪些线程的运行情况;再通过【jstack 12377 > stack.log】生成Java线程的dump详细信息;查看日志,找到到底是哪段具体的代码占用了如此多的资源
2)使用’jtgrep’脚本把异常线程的进程号(pid)为’num_n’的java线程在stack.log中抓出来;脚本内容如下:
#!/bin/sh
nid=`python -c "print hex($1)" ` ##将线程对应的pid转换为16进制
grep -i $nid $2
3)或通过 Java visualMv结合 jconsole.exe 工具即可查看:
下载:https://java.net/projects/tda/downloads/directory/visualvm
4)或直接通过tda-bin-2.2\bin\tda.sh 来分析导出ThreadDump文件:
下载地址:https://java.net/projects/tda/downloads/directory/visualvm
三、附录:linux其他管理工具
1、dstat 工具
它是一个可以取代vmstat,iostat,netstat和ifstat这些命令的多功能产品;可以实时的监控cpu、磁盘、网络、IO、内存等使用情况。
官网下载地址:http://dag.wieers.com/rpm/packages/dstat
wget http://dag.wieers.com/rpm/packages/dstat/dstat-0.6.7-1.rh7.rf.noarch.rpm
rpm -ivh dstat-0.6.7-1.rh7.rf.noarch.rpm
安装完成后,就可以直接使用dstat,默认使用的是-cdngy参数,分别显示cpu、disk、net、page、system信息,默认是1s显示一条信息。可以在最后指定显示一条信息的时间间隔,如:
dstat 5 //每5s显示一条
dstat 5 10 //表每5s显示一条,一共显示10条
2、perf
perf是一款Linux性能分析工具。Linux性能计数器是一个新的基于内核的子系统,它提供一个性能分析框架,比如硬件(CPU、PMU(Performance Monitoring Unit))功能和软件(软件计数器、tracepoint)功能。=》性能剖析(performance profiling)和代码优化
默认情况下perf top是无法显示信息的,需要sudo perf top或者echo -1 > /proc/sys/kernel/perf_event_paranoid(在Ubuntu16.04,还需要echo 0 > /proc/sys/kernel/kptr_restrict)。
3、其他工具: