Linux 排查进程和线程

2021/09/28 Linux 共 2720 字,约 8 分钟
Bob.Zhu

服务器运行过程中,可能有些程序运行异常,就需要通过排查手段找到运行异常的应用,分析异常原因, 来解决相关问题。

top

直接使用 top 命令显示系统和内存信息,Q 或者 ctrl + C 退出。

$ top
top - 10:06:14 up 123 days, 20:13,  2 users,  load average: 0.04, 0.08, 0.13
Tasks: 112 total,   1 running, 109 sleeping,   0 stopped,   2 zombie
%Cpu(s):  0.7 us,  0.5 sy,  0.0 ni, 98.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8009180 total,   555876 free,  1975280 used,  5478024 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  5303448 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
13099 root      10 -10  139532  24036  10076 S   1.3  0.3 877:07.80 AliYunDun
19343 jyapp     20   0 3515812   1.1g  16824 S   1.0 15.0   2480:11 java
32577 jyapp     20   0 3411248 184464  12488 S   0.3  2.3 141:00.46 java
    1 root      20   0   49732   3876   2492 S   0.0  0.0  68:37.47 systemd
    2 root      20   0       0      0      0 S   0.0  0.0   0:02.02 kthreadd
    3 root      20   0       0      0      0 S   0.0  0.0   1:35.58 ksoftirqd/0
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
    7 root      rt   0       0      0      0 S   0.0  0.0   0:11.75 migration/0

top -Hp pid

直接使用 top 查看的是进程信息,可以使用 -H -p 参数查看进程里的线程信息:

  • -H:开启查看线程信息
  • -p:指定线程的PID
top -Hp 19343
top - 10:08:12 up 123 days, 20:15,  2 users,  load average: 0.07, 0.08, 0.13
Threads: 124 total,   0 running, 124 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.2 us,  1.2 sy,  0.0 ni, 96.5 id,  0.2 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8009180 total,   555568 free,  1975112 used,  5478500 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  5303632 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
19366 jyapp     20   0 3515812   1.1g  16824 S  0.3 15.0  53:38.62 java
19397 jyapp     20   0 3515812   1.1g  16824 S  0.3 15.0  52:18.84 java
19517 jyapp     20   0 3515812   1.1g  16824 S  0.3 15.0   4:16.15 java
16965 jyapp     20   0 3515812   1.1g  16824 S  0.3 15.0 112:02.65 java
19343 jyapp     20   0 3515812   1.1g  16824 S  0.0 15.0   0:00.00 java
19344 jyapp     20   0 3515812   1.1g  16824 S  0.0 15.0   0:03.59 java
19345 jyapp     20   0 3515812   1.1g  16824 S  0.0 15.0   2:03.50 java

PID对应项目

通过ps及top命令查看进程信息时,只能查到相对路径,查不到的进程的详细信息,如绝对路径等。 有时候只根据进程信息和启动的应用名称无法区分到底是哪一个应用,比如启动了多个tomcat或者 spring boot 项目的时候,显示的名称都一样,那么需要通过以下的方法来查看进程的详细信息:

Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的文件夹,在该文件夹下会有我们的进程的信息, 其中包括一个名为exe的文件即记录了绝对路径,通过ll或ls –l命令即可查看:

ll /proc/19343
lrwxrwxrwx   1 jyapp jyapp 0 Sep 24 00:32 cwd -> /home/jyapp/app/apache-tomcat-rms/bin
lrwxrwxrwx   1 jyapp jyapp 0 Sep 23 23:55 exe -> /home/jyapp/app/jdk1.7.0_76/bin/java
-r--r--r--   1 jyapp jyapp 0 Sep 23 23:55 cmdline
-r--------   1 jyapp jyapp 0 Sep 24 00:32 environ
dr-x------   2 jyapp jyapp 0 Sep  7 11:27 fd
……
  • cwd:符号链接的是进程运行目录;
  • exe:符号连接就是执行程序的绝对路径;
  • cmdline:就是程序运行时输入的命令行命令;
  • environ:记录了进程运行时的环境变量;
  • fd:目录下是进程打开或使用的文件的符号连接。

java应用

如果是Java应用,那么可以使用JDK自带的命令行工具来查找相应的PID:

  • jps
  • jcmd:从1.7开始

两个命令显示的内容稍有不同:

pidjps 指令内容jcmd 指令内容
23106Jpssun.tools.jcmd.JCmd
19343Bootstraporg.apache.catalina.startup.Bootstrap start
32577Bootstraporg.apache.catalina.startup.Bootstrap start
14029Bootstraporg.apache.catalina.startup.Bootstrap start

在获取PID之后,同样,使用 ll /proc/PID 查看项目信息,以及后续使用 jstack 等指令 分析应用相关线程运行情况。

更新: jps 增加 -lm 参数之后,等价于 jcmd

jps -lm
29587 sun.tools.jps.Jps -lm
19343 org.apache.catalina.startup.Bootstrap start
32577 org.apache.catalina.startup.Bootstrap start
14029 org.apache.catalina.startup.Bootstrap start

参考资料

文档信息

Search

    Table of Contents