pidin
https://www.qnx.com/developers/docs/7.0.0/index.html#com.qnx.doc.neutrino.utilities/topic/p/pidin.html
pidin是一个非常强大的工具,它可以查看进程的详细信息,包括进程的状态,进程的线程,进程的内存映射,进程的文件描述符,运行进程的环境变量等。下面显示了一个没有带任何参数的pidin命令的输出结果。
# pidin
pid tid name prio STATE Blocked
1 1 /procnto-smp-instr 0f RUNNING
1 2 /procnto-smp-instr 0f READY
1 3 /procnto-smp-instr 0f RUNNING
1 4 /procnto-smp-instr 0f RUNNING
1 5 /procnto-smp-instr 10r RECEIVE 1
1 6 /procnto-smp-instr 1r RECEIVE 2
1 7 /procnto-smp-instr 10r CONDVAR (0xffff8000000cf320)
1 8 /procnto-smp-instr 10r CONDVAR (0xffff8000000cf328)
1 9 /procnto-smp-instr 255r RECEIVE 4
1 10 /procnto-smp-instr 255r RECEIVE 1
1 11 /procnto-smp-instr 255r RECEIVE 1
1 12 /procnto-smp-instr 255r RECEIVE 1
1 13 /procnto-smp-instr 10r RUNNING
1 14 /procnto-smp-instr 10r RECEIVE 1
1 15 /procnto-smp-instr 10r RECEIVE 1
1 16 /procnto-smp-instr 10r RECEIVE 1
1 17 /procnto-smp-instr 10r RECEIVE 1
1 18 /procnto-smp-instr 10r RECEIVE 1
2 1 proc/boot/slogger2 10r RECEIVE 1
3 1 proc/boot/random 10r SIGWAITINFO
3 2 proc/boot/random 10r NANOSLEEP
3 3 proc/boot/random 21r RECEIVE 1
4 1 proc/boot/dumper 10r RECEIVE 1
5 1 proc/boot/pipe 10r SIGWAITINFO
5 2 proc/boot/pipe 10r RECEIVE 1
5 3 proc/boot/pipe 10r RECEIVE 1
6 1 proc/boot/devc-pty 10r RECEIVE 1
7 1 oc/boot/pci-server 21r RECEIVE 2
7 2 oc/boot/pci-server 10r RECEIVE 2
7 3 oc/boot/pci-server 10r RECEIVE 2
8 1 roc/boot/devb-eide 10r SIGWAITINFO
8 2 roc/boot/devb-eide 21r RECEIVE 1
8 3 roc/boot/devb-eide 21r RECEIVE 3
8 4 roc/boot/devb-eide 10r RECEIVE 7
8 5 roc/boot/devb-eide 10r RECEIVE 9
8 6 roc/boot/devb-eide 10r RECEIVE 11
8 7 roc/boot/devb-eide 10r RECEIVE 5
8 8 roc/boot/devb-eide 10r RECEIVE 5
8 9 roc/boot/devb-eide 21r RECEIVE 5
8 10 roc/boot/devb-eide 10r RECEIVE 5
9 1 /boot/devc-ser8250 24r RECEIVE 1
4106 1 /boot/io-pkt-v6-hc 21r SIGWAITINFO
4106 2 /boot/io-pkt-v6-hc 21r RECEIVE 2
4106 3 /boot/io-pkt-v6-hc 21r RECEIVE 20
4106 4 /boot/io-pkt-v6-hc 21r RECEIVE 22
4106 5 /boot/io-pkt-v6-hc 21r RECEIVE 24
12299 1 bin/sh 10r SIGSUSPEND
471052 1 proc/boot/pidin 10r REPLY 1
整个结果输出有6列,从左到右分别是pid,tid,name,prio,state和blocked。其中:
- pid列显示进程的ID;
- tid列显示线程的ID;
- name列显示进程名字,如果名字太长则只显示后面一段而忽略前面的字符;
- prio列显示线程调度信息的复合体。前面数字表示线程调度优先级,后面的小写字母表示线程调度策略。调度策略有前述的四种形式:f(先进先出 FIFO), r(轮询 Round Robin), s(sporadic)和o(other)。
- state列显示线程的状态,blocked列的值依赖于线程状态。不同的线程状态拥有不同含义的值。具体如下表所示:
状态 | 值含义 |
---|---|
CONDVAR | 条件变量地址 |
JOIN | 阻塞线程ID |
MUTEX | 互斥量的地址,或者被阻塞的进程和线程的id,后面是被锁定的次数,形式为pid-tid #times |
RECEIVE | 被阻塞线程的进程内的消息通信通道 |
REPLY | 进程ID |
SEM | 信号量的地址 |
SEND | 进程ID |
STACK | 栈大小 |
WAITPAGE | 内存页虚拟地址 |
WAITTHREAD | 阻塞线程ID |
另外pidin还支持丰富的选项,满足不同的需求。下面是pidin的选项列表。
pidin 选项
-d delay
以0.1秒为单位的延迟。只有在使用-l选项时才生效,其默认值为10,即1秒钟。
-F formats
类似printf()格式化字符串的格式化代码组合。每个代码都由一个百分号(%)、一个可选的字段宽度和一个格式字符(例如"%I %60N")组成。有关更多信息,请参阅下面的 [“格式字符”] 。如果不指定任何格式代码,则默认为“%a %b %N %p %J %b”。 上面我们直接使用pidin的输出结果就是这种形式。
-f formats
与-F选项相同,但formats参数是一个可以展开的格式代码的连续字符串。例如,-f mbe扩展为-f “%m %b %e”。
-h
帮助信息。
-k
持续显示PID和TIDs的数据,直到发生错误,例如,遇到一个状态未知的PID/TID(因为PID/TID是部分活动状态的)。
-l
循环模式;显示每delay*0.1秒延迟的统计数据(delay使用-d选项指定)。
例如 每5秒钟刷一次屏幕,可以使用-d 50选项,即-d 5*10=50。
$ pidin -l -d 50
-M formats
格式字符的组合,每个字符后面都有一个百分号(%),类似于printf()的格式字符串,用于控制有关内存区域信息的格式化。有关更多信息,请参阅的 “内存格式字符” 。
-n node
获取信息的远程节点名称。
-o prio (似乎无效)
只显示运行在指定prio线程调度优先级的进程/线程。
-P pid
大写的P,只显示指定pid的进程族(pid可能是进程的名称,也可能进程号)。
-p pid
只显示指定的pid进程。
例如,只显示pid或进程名为8的进程:
# pidin -p 8
pid tid name prio STATE Blocked
8 1 roc/boot/devb-eide 10r SIGWAITINFO
8 2 roc/boot/devb-eide 21r RECEIVE 1
8 3 roc/boot/devb-eide 21r RECEIVE 3
8 4 roc/boot/devb-eide 10r RECEIVE 7
8 5 roc/boot/devb-eide 10r RECEIVE 9
8 6 roc/boot/devb-eide 10r RECEIVE 11
8 7 roc/boot/devb-eide 21r RECEIVE 5
8 8 roc/boot/devb-eide 10r RECEIVE 5
8 9 roc/boot/devb-eide 10r RECEIVE 5
pidin 支持多达63项不同内容的格式化字符串,并提供了一些常用的格式化字符串,在这摘取一些常用的参数展示如下:
arguments (-F “%a %A”)
显示进程的命令行参数。这样可以很清晰的看到进程启动时使用了什么参数。
# pidin arg
pid Arguments
1 procnto-smp-instr -v -P 100
2 slogger2 -U 2030:2030 -s 1000k -g 2030 -l /tmp
3 random -t
4 dumper -U 2040:2040 -d /tmp -I
5 pipe -U 2050:2050
6 devc-pty
7 pci-server --aspace-enable
8 devb-eide blk cache=64M,auto=partition,vnode=2000,ncache=2000,noatime,commit=low dos exe=all
9 devc-ser8250 -e -b115200
4106 io-pkt-v6-hc -d e1000 name=eq
12299 sh
77837 /usr/sbin/sshd
114702 /usr/sbin/sshd -R
1740816 pidin arg
backtrace (-F “%I %q”)
显示当前显示进程中每个线程的回溯信息,这个选项可以很方便的查看进程中每个线程的调用栈信息。例如下面显示了io-pkt-v6-hc进程中每个线程的回溯信息。
# pidin -p io-pkt-v6-hc back
pid-tid backtrace
4106-01 10004fb05:8072ef2
4106-02 10004f9f8:8146a96
4106-03 1000508cb:814680d
environment (-F “%a %N %E”)
显示运行进程的环境变量。
# pidin -p sshd env
pid name Environment
32781 usr/sbin/sshd _=/usr/sbin/sshd PATH=/proc/boot:/usr/bin:/bin:/usr/sbin:/sbin SIGKILL_TIMEOUT=300 LD_LIBRARY_PATH=/proc/boot:/lib:/usr/lib:/lib/dll:/lib/dll/pci PCI_BASE_VERBOSITY=3 PCI_DEBUG_MODULE=/proc/boot/pci_debug2.so PCI_SLOG_MODULE=/proc/boot/pci_slog2.so PCI_HW_MODULE=/proc/boot/pci_hw-Intel_x86.so ENV=/etc/.kshrc
180236 usr/sbin/sshd _=/usr/sbin/sshd PATH=/proc/boot:/usr/bin:/bin:/usr/sbin:/sbin SIGKILL_TIMEOUT=300 LD_LIBRARY_PATH=/proc/boot:/lib:/usr/lib:/lib/dll:/lib/dll/pci PCI_BASE_VERBOSITY=3 PCI_DEBUG_MODULE=/proc/boot/pci_debug2.so PCI_SLOG_MODULE=/proc/boot/pci_slog2.so PCI_HW_MODULE=/proc/boot/pci_hw-Intel_x86.so ENV=/etc/.kshrc
info
显示系统信息,例如每个处理器的类型、频率,内存大小、使用情况,进程数量等。
# pidin info
CPU:X86_64 Release:7.0.4 FreeMem:895MB/1023MB BootTime:Jul 12 07:29:37 GMT 2023
Actual resident free memory:897Mb
Processes: 15, Threads: 46
Processor1: 524974 Intel 686 F6M1�S10 1798MHz FPU
Processor2: 524974 Intel 686 F6M1�S10 1799MHz FPU
# pidin info
CPU:AARCH64 Release:7.0.4 FreeMem:24GB/30GB BootTime:Jan 01 00:00:00 GMT 1970
Actual resident free memory:24Gb
Processes: 64, Threads: 335
Processor1: 1309605952 D20/0x0350F66D 1600MHz FPU
Processor2: 1309605952 D20/0x0350F66D 1600MHz FPU
Processor3: 1309605952 D20/0x0350F66D 1600MHz FPU
Processor4: 1309605952 D20/0x0350F66D 1600MHz FPU
Processor5: 1309605952 D20/0x0350F66D 1600MHz FPU
Processor6: 1309605952 D20/0x0350F66D 1600MHz FPU
Processor7: 1309605952 D20/0x0350F66D 1600MHz FPU
threads (-F “%a %b %N %h %J %B”)
显示进程ID,线程ID, 短进程名,线程名称,线程状态,线程block状态, 如果线程没有线程名称,那么相应列就显示线程ID。
# pidin -p devb-eide threads
pid tid name thread name STATE Blocked
8 1 roc/boot/devb-eide xpt_signal_handler SIGWAITINFO
8 2 roc/boot/devb-eide eide_driver_thread RECEIVE 1
8 3 roc/boot/devb-eide eide_driver_thread RECEIVE 3
8 4 roc/boot/devb-eide async_io RECEIVE 7
8 5 roc/boot/devb-eide fsnotify_thread RECEIVE 9
8 6 roc/boot/devb-eide swap_io RECEIVE 11
8 7 roc/boot/devb-eide fsys_resmgr RECEIVE 5
8 8 roc/boot/devb-eide fsys_resmgr RECEIVE 5
8 9 roc/boot/devb-eide fsys_resmgr RECEIVE 5
top
top 工具是一个动态显示进程信息的工具,它可以实时显示进程的运行状态,包括进程的CPU占用率、内存占用率、进程的PID、进程的名称等信息。top工具的使用非常简单,直接在命令行输入top即可,显示结果如下所示:
16 processes; 48 threads;
CPU states: 50.0% user, 0.0% kernel
CPU 0 Idle: 0.0%
CPU 1 Idle: 99.9%
Memory: 1023M total, 895M avail, page size 4K
PID TID PRI STATE HH:MM:SS CPU COMMAND
241679 1 10 Run 0:00:18 49.99% main
4106 2 21 Rcv 0:00:07 0.01% io-pkt-v6-hc
6 1 10 Rcv 0:00:00 0.00% devc-pty
1 9 10 Run 0:00:00 0.00% kernel
245776 1 10 Rply 0:00:00 0.00% top
20492 1 10 SigW 0:00:00 0.00% sshd
3 2 10 NSlp 0:00:00 0.00% random
5 3 10 Rcv 0:00:00 0.00% pipe
8 3 21 Rcv 0:00:00 0.00% devb-eide
8 2 21 Rcv 0:00:00 0.00% devb-eide
Min Max Average
CPU 0 idle: 0% 99% 66%
CPU 1 idle: 0% 99% 33%
Mem Avail: 895MB 895MB 895MB
Processes: 16 16 16
Threads: 48 48 48
在上面的结果表示,当前系统中存在16个进程,48个线程,CPU的使用率分为用户态使用率和内核态使用率,其中前者为50%。设计优良的系统,用户态使用率高,内核态CPU使用率低。上面系统显示存在两个CPU核,其中CPU 0一直在工作,空闲率为0%,而CPU 1一直空闲,空闲率~100%。系统一共有1G大小内存,其中可用内存为895M,内存使用率为12.5%。内存页大小为4K。
top默认只显示前10个CPU使用率高的进程信息。每个进程显示了进程ID,线程ID,优先级,进程状态,运行时间,CPU使用率,进程名称。
结果的最后部分显示了各个CPU核的空闲率,可使用内存,系统中进程和线程数量的统计信息,每类信息都包含最小值,最大值和平均值。
如果想要将top显示的信息保存到文件中,-b选项,让top使用批处理模式,将结果输出到文件中,例如:
top -b > top.txt
top支持下列可交互的命令:
? or h
显示帮助信息。
d
设置刷新时间,单位为秒。
k
杀死指定进程,需要输入进程ID。
l
立即刷新屏幕。
n
设置显示的线程数目,默认值为10, 最小值为5。
q
退出top。
ps
ps(process status)是POSIX标准中定义的一个工具,它可以显示系统中的进程信息,包括进程的PID,进程的状态,进程的名称、参数等,可以参考QNX ps说明。
ps 包含有很多选项,可以满足不同的需求,下面列出一些常用的选项:
-a
显示所有关联到当前终端的所有进程信息。
-A
显示所有进程信息。
-e
显示所有进程信息, 与-A
类似。
-f
显示完整的列表。
-l
显示长列表。
-o format
按照指定的规范格式显示进程的信息。format 支持下列字段:
“ruser”: 进程实际的用户名或者ID号
“user”: 进程有效的用户名或者ID号
“rgroup”: 进程的实际的进程组名或ID号
“group”: 进程有效的进程组名或ID号
“pid”: 进程ID
“ppid”: 父进程ID
“pgid”: 进程组ID
“pcpu”: 最近一段时间内已使用CPU时间与可用CPU时间比率
“vsz”: 进程大小
“nice”: 进程有效优先级
“etime”: 进程启动后经过的时间
“time”: 进程累计耗时
“tty”: 正在控制终端名字(未支持)
“comm”: 正在执行的命令
“args”: 包含所有参数的命令
The command with all of its arguments.
虽然POSIX 未要求,但QNX ps还支持下列字段:
“uid”: 进程实际用户名称或ID
“env”: 以空格分割的环境变量列表
“f”: 进程标志
“pri”: 进程实际优先积极
“sid”: 会话头进程ID
“suid”: 会话所有者用户ID
“sgid”: 会话所有者组ID
“umask”: 进程文件属性掩码
“sigign”: 进程忽略信号列表
“sigpend“: 进程或者线程阻塞信号列表
“sigqueue”: 进程信号队列列表
“threads”: 进程所含有线程数目
“stime”: 进程开始运行时间
“cmd”: 当前执行命令
“sz”: 内存使用大小
以上有些是线程相关的字段,在这种情况下,使用进程中第一个线程的值。
下列字段名称显示的是线程相关的信息:
“tid”: 线程ID
“tflags”: 线程标志
“dflags”: 线程debug标志
“tsigblk”: 阻塞在线程上的列表
“cpu”: 最后运行线程的CPU号
“state”: 线程状态
“wchan”: 等待通道
“addr”: 等待地址
“psched”: 调度策略
hogs
显示系统中进程占用CPU的信息。它按照应用程序使用CPU百分比降序排列显示出一个进程列表。hogs输出的信息包含:
PID — 进程ID
NAME- 进程名称
%CPU — 进程使用的CPU百分比
%MEM — 进程使用的内存百分比
NAME — 进程名
ARGS — 进程的命令行参数
hogs 支持以下选项信息:
-i iter
将输出限制为指定的循环次数(默认无次数限制)。
-m [e][t][p][s]
指定要包含在每个进程的内存总数中的内存映射类型
e — MAP_ELF mappings
t — MAP_STACK mappings
s — MAP_SHARED mappings
p — MAP_PRIVATE mappings (the default)
-p priority
以给定的优先级运行hogs(默认值:与父进程相同)。
-S [c|m|p]
排序方式:
c — CPU (the default)
m — memory
p — process ID
-s sec
更新间隔的休眠时间(默认值:3秒)。
Sleep this long between updates (default: 3 seconds).
-% num [c|m]
只显示CPU或内存占用百分比等于或高于此值的进程。您可以使用此选项来减少输出量。