ps进程检查工具¶
ps
输出字段¶
Linux/Unix 通常采用 System V ( ps -elf
) 或 BSD ( ps alx
) 风格 ps
检查进程启动时间
lstart
:
ps -eo pid,ppid,lstart,cmd | grep qemu-system-x86_64
输出显示案例类似如下:
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 -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
:
# 这里 918667 是一个 qemu-system-x86_64 的pid
cat /proc/918667/cmdline | sed -e "s/\x00/ /g"; echo
此时就能看到正确的输出格式:
/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-x86
的 pid
是 7354
,当前 top
可以看到使用的CPU百分比大约是 10+% :
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
现在来解析这个进程的线程:
ps -T -o pid,tid,c,pcpu,comm -p 7354
输出信息:
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资源