ps进程检查工具

ps 输出字段

Linux/Unix 通常采用 System V ( ps -elf ) 或 BSD ( ps alx ) 风格 ps

备注

Ubuntu Linux 使用 ps -elfps alx 都可以工作,但是输出字段有细微差异

似乎 ps -elf 更为适合(输出字段中有 C 表明CPU使用率)

  • 检查进程启动时间 lstart :

检查进程启动时间,例如 qemu-system-x86
ps -eo pid,ppid,lstart,cmd | grep qemu-system-x86_64

输出显示案例类似如下:

检查进程启动时间,例如 qemu-system-x86 可以看到详细的启动时间
   7300 Sun Aug  6 11:10:56 2023 /usr/bin/qemu-system-x86_64 -name guest=z-b-data-3,...
   7354 Sun Aug  6 11:11:03 2023 /usr/bin/qemu-system-x86_64 -name guest=z-b-data-1,...
   7405 Sun Aug  6 11:11:09 2023 /usr/bin/qemu-system-x86_64 -name guest=z-b-data-2,...

备注

ps 检查进程启动时间的 field 格式参数可以有3种:

  • start 启动时间类似 09:46:10 ,但是超过24小时的进程会显示为日期,类似 Aug 31

  • stime 启动时间类似 09:10 ,但是超过24小时的进程也是显示为日期,类似 Aug31

  • lstart 启动时间最详尽和标准化,非常方便对比检查,类似 Thu Aug 31 23:58:01 2023 强烈推荐

ps 获取完整命令参数

ps 命令参数 -o args 可以指定输出完整格式命令:

ps 输出完成的进程命令参数
# 指定输出进程的完整命令参数
ps -eo args

# 可以指定PID (-p)
ps -p [PID] -o args

# 结合 pidof 可以方便获取指定进程名(但是对同名进程名无效,需要脚本处理)
ps -p $(pidof dhcpcd) -o args

# 对于多个同名进程,改为如下方法
 ps -eo args | grep qemu-system-x86_64 | head -n -1

完整命令也可以从 PID 的对应 cmdline 获取,但是需要注意到系统将命令中的空格( spces )替换成了 NULL 字符( x00 ),所以看到的命令糊成一片:

/usr/bin/qemu-system-x86_64-nameguest=y-k8s-m-3,debug-threads=on-S-object{"qom-type":"secret"...

解决方法是将 NULL 再次替换为 space :

/proc/<PID>/cmdline 获取进程命令
# 这里 918667 是一个 qemu-system-x86_64 的pid
cat /proc/918667/cmdline | sed -e "s/\x00/ /g"; echo

此时就能看到正确的输出格式:

/proc/<PID>/cmdline 获取进程命令,转换 NULLspace
/usr/bin/qemu-system-x86_64 -name guest=y-k8s-m-3,debug-threads=on -S -object {"qom-type":"secret"...

ps 检查线程

ps 命令的 -T 参数表示输出线程, -p 可以指定进程,结合上文的输出字段,我们可以构建一个检查某个进程所有线程的CPU使用率以及运行在哪些cpu core上,以便进一步排查进程异常。

举例,进程 qemu-system-x86pid7354 ,当前 top 可以看到使用的CPU百分比大约是 10+% :

检查 qemu-system-x86 进程的线程负载
top - 16:30:30 up 4 days,  5:28, 11 users,  load average: 0.72, 0.55, 0.40
Tasks: 630 total,   1 running, 629 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.6 us,  0.3 sy,  0.0 ni, 99.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem : 386813.0 total, 327264.1 free,  51822.8 used,   7726.1 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used. 332638.5 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
   7354 libvirt+  20   0   16.8g  16.0g  19768 S  10.2   4.2 635:51.79 qemu-system-x86
   7300 libvirt+  20   0   16.7g  16.0g  19668 S   6.6   4.2 459:39.34 qemu-system-x86
   7405 libvirt+  20   0   16.8g  16.0g  19732 S   6.6   4.2 442:22.15 qemu-system-x86
   2014 prometh+  20   0  726984  19972  12036 S   4.3   0.0  50:29.36 node_exporter
  • 现在来解析这个进程的线程:

检查进程的所有线程使用的cpu资源以及调度的cpu core
ps -T -o pid,tid,c,pcpu,comm -p 7354

输出信息:

检查进程的所有线程使用的cpu资源以及调度的cpu core
    PID     TID  C %CPU COMMAND
   7354    7354  0  0.2 qemu-system-x86
   7354    7358  0  0.0 qemu-system-x86
   7354    7361  0  0.0 IO mon_iothread
   7354    7363  2  2.1 CPU 0/KVM
   7354    7364  2  2.6 CPU 1/KVM
   7354    7365  2  2.5 CPU 2/KVM
   7354    7366  2  2.7 CPU 3/KVM
   7354    7470  0  0.0 worker
   7354  210749  0  0.0 worker

这里可以看到4个kvm线程分别消耗了大约 2.5% 的CPU资源

参考