Mac和Linux的top还是有些区别的,在使用的时候需要注意,我们从帮助提示可以看出,比如:
Linux电脑:
$ top -h
top: procps version 3.2.8
usage: top -hv | -abcHimMsS -d delay -n iterations [-u user | -U user] -p pid [,pid ...]
Mac电脑:
top usage: top
[-a | -d | -e | -c <mode>]
[-F | -f]
[-h]
[-i <interval>]
[-l <samples>]
[-ncols <columns>]
[-o <key>] [-O <secondaryKey>]
keys: pid (default), command, cpu, cpu_me, cpu_others, csw,
time, threads, ports, mregion, mem, rprvt, purg, vsize, vprvt,
kprvt, kshrd, pgrp, ppid, state, uid, wq, faults, cow, user,
msgsent, msgrecv, sysbsd, sysmach, pageins, boosts, instrs, cycles
[-R | -r]
[-S]
[-s <delay>]
[-n <nprocs>]
[-stats <key(s)>]
[-pid <processid>]
[-user <username>]
[-U <username>]
[-u]
回到正题,在最近的工作中,遇到了一个问题:需要统计一个Mac桌面应用的CPU和内存资源,但是这个应用里面由于技术实现的原因,有很多个进程的资源需要统计,然后mac的内存计算方法和常规的有点点不一样,详情见:Link,然后python的psutil模块得到的结果也不是我们想要的,Mac我们其实可以使用top的终端命令来统计,具体的方法如下:
假设我们有2个进程,对应的pid分别是:21825和21978,我们想执行3次,每次都同时输出这两个进程的信息,命令如下:
top -l 3 -o mem -pid 21825 -pid 21978
Ps:linux下,多个进程通过【-p 21825,21978】这种指定就行了。
Mac上运行命令后输出结果如下:
Processes: 432 total, 2 running, 430 sleeping, 2619 threads
2021/12/21 20:56:12
Load Avg: 3.62, 2.90, 3.04
CPU usage: 4.41% user, 11.2% sys, 84.55% idle
SharedLibs: 259M resident, 42M data, 23M linkedit.
MemRegions: 171676 total, 1528M resident, 70M private, 623M shared.
PhysMem: 8160M used (2370M wired), 31M unused.
VM: 4944G vsize, 2318M framework vsize, 2465278(0) swapins, 3037599(0) swapouts.
Networks: packets: 3808354/2388M in, 3495950/644M out.
Disks: 2872677/62G read, 1604147/37G written.
PID COMMAND %CPU TIME #TH #WQ #PORTS MEM PURG CMPRS PGRP PPID STATE BOOSTS %CPU_ME %CPU_OTHRS UID FAULTS COW MSGSENT MSGRECV SYSBSD SYSMACH CSW PAGEINS IDLEW POWER INSTRS CYCLES USER #MREGS RPRVT VPRVT VSIZE KPRVT KSHRD
21825 Infoflow 0.0 10:17.78 35 8 1619 461M 1928K 279M 21825 1 sleeping *0[3326] 0.00000 0.00000 502 7025422 3929 4716403 700533 3879927 10722990 5175647 9266 221434 0.0 0 0 rongsong N/A N/A N/A N/A N/A N/A
21978 com.apple.WebKit 0.0 00:01.99 3 1 95 13M 0B 7372K 21978 1 sleeping 0[1550] 0.00000 0.00000 502 26970 327 24381 12486 26370 49141 26067 173 875 0.0 0 0 rongsong N/A N/A N/A N/A N/A N/A
Processes: 432 total, 2 running, 430 sleeping, 2622 threads
2021/12/21 20:56:13
Load Avg: 3.41, 2.87, 3.03
CPU usage: 6.13% user, 6.76% sys, 87.9% idle
SharedLibs: 259M resident, 42M data, 23M linkedit.
MemRegions: 171676 total, 1528M resident, 70M private, 623M shared.
PhysMem: 8135M used (2388M wired), 55M unused.
VM: 4944G vsize, 2318M framework vsize, 2465342(64) swapins, 3037599(0) swapouts.
Networks: packets: 3808510/2388M in, 3496205/644M out.
Disks: 2872683/62G read, 1604149/37G written.
PID COMMAND %CPU TIME #TH #WQ #PORTS MEM PURG CMPRS PGRP PPID STATE BOOSTS %CPU_ME %CPU_OTHRS UID FAULTS COW MSGSENT MSGRECV SYSBSD SYSMACH CSW PAGEINS IDLEW POWER INSTRS CYCLES USER #MREGS RPRVT VPRVT VSIZE KPRVT KSHRD
21825 Infoflow 2.3 10:17.81 35 8 1619 461M- 2004K+ 279M- 21825 1 sleeping *0[3327+] 0.08172 0.72198 502 7025483+ 3929 4716814+ 700645+ 3880138+ 10724443+ 5176152+ 9266 221461+ 3.2 17923740 45825430 rongsong N/A N/A N/A N/A N/A N/A
21978 com.apple.WebKit 0.0 00:01.99 3 1 95 13M 0B 7372K 21978 1 sleeping 0[1550] 0.00000 0.00000 502 26970 327 24383+ 12487+ 26370 49150+ 26068+ 173 875 0.0 44148 158501 rongsong N/A N/A N/A N/A N/A N/A
Processes: 432 total, 3 running, 429 sleeping, 2618 threads
2021/12/21 20:56:14
Load Avg: 3.41, 2.87, 3.03
CPU usage: 2.47% user, 3.29% sys, 94.23% idle
SharedLibs: 259M resident, 42M data, 23M linkedit.
MemRegions: 171676 total, 1528M resident, 70M private, 623M shared.
PhysMem: 8135M used (2388M wired), 55M unused.
VM: 4944G vsize, 2318M framework vsize, 2465342(0) swapins, 3037599(0) swapouts.
Networks: packets: 3808557/2388M in, 3496341/644M out.
Disks: 2872683/62G read, 1604369/37G written.
PID COMMAND %CPU TIME #TH #WQ #PORTS MEM PURG CMPRS PGRP PPID STATE BOOSTS %CPU_ME %CPU_OTHRS UID FAULTS COW MSGSENT MSGRECV SYSBSD SYSMACH CSW PAGEINS IDLEW POWER INSTRS CYCLES USER #MREGS RPRVT VPRVT VSIZE KPRVT KSHRD
21825 Infoflow 0.3 10:17.82 35 8 1614- 461M 1928K- 279M 21825 1 sleeping *0[3328+] 0.02540 0.03795 502 7025487+ 3929 4716863+ 700654+ 3880218+ 10724609+ 5176243+ 9266 221495+ 1.9 2064739 6240688 rongsong N/A N/A N/A N/A N/A N/A
21978 com.apple.WebKit 0.0 00:01.99 3 1 95 13M 0B 7372K 21978 1 sleeping 0[1550] 0.00000 0.00000 502 26970 327 24383 12487 26370 49150 26068 173 875 0.0 0 0
有了这些信息,就可以容易的提取出我们想要的信息了,因为每次输出的信息基本是固定的(不过这里需要考虑进程中途退出的情况,比如21978进程中途可能没有了,应该就最后的结果输出行数有区别)
Ps:比如下面这种场景,同样一条命令,开始时有3个进程,后面只有2个进程,其实前面的行数都是固定的,只是后面的详情输出不一样而已。这个其实也很好处理,比如可以以Processes来分组。(第一个Processes出现的位置到第二个Processes出现的位置为第一组数据,以此类推)
因为每一次采样的输出是以这种格式开头的:Processes: 431 total, 2 running, 429 sleeping, 3078 threads。