赞
踩
最近在分析安卓程序上的monkey测试日志时发现,需要了解下Linux进程资源占用情况及其查看方法。之前在windows上有ProcessExplorer可以直接查看,在Linux下就没这么方便了,只能通过命令行来查看。
所以本文的目标就在于:在你知道你要分析的进程名之后,通过命令行工具读取进程的PID、CPU占用情况、内存占用情况、已打开文件描述符、网络情况。
目前使用比较经典的命令是top
。比如我想找player关键词的进程,可以使用:
- # top | grep player
- 2319 u0_a127 20 0 22% S 450 3254600K 1162720K ta com.real.simpleplayer
- 2134 u0_a14 20 0 0% S 13 1410516K 37624K bg com.huawei.hwvplayer.youku
这样就可以很简单找到你需要的进程PID。当然也可以使用其他命令行工具,比如atop、Htop等等。(参考文献中有很多,有兴趣可以查看下)
这里的资源包括:CPU、内存、打开句柄、内部线程。(上面提到的工具都有对应的数据列,这里仅提供最原始的查阅方式。)
linux的新创建进程会自动创建/proc/pid
目录,其中包含以下部分:
目录名 | 功能说明 |
---|---|
cmdline | 包含了用于启动进程的命令行 |
cwd | 包含了当前进程工作目录的链接 |
environ | 包含了可用进程环境变量的列表 |
exe | 包含了正在进程中运行的可执行文件的链接 |
fd | 包含了进程打开的每一个文件的链接 |
maps | 与进程相关的内存映射信息 |
mem | 包含了进程在内存中的内容 |
stat | 包含了进程的状态信息 |
statm | 包含了进程的内存使用信息 |
limits | 存储了进程的软限制,硬限制等信息 |
root | 指向进程根目录的软链接 |
self | 链接到当前正在运行的进程 |
task | 包含当前进程所有子线程pid |
说明一点,我使用的是Huawei Mate9的adb shell。
例如以下是cat limits
的输出结果:
- # cat limits
- Limit Soft Limit Hard Limit Units
- Max cpu time unlimited unlimited seconds
- Max file size unlimited unlimited bytes
- Max data size unlimited unlimited bytes
- Max stack size 8388608 unlimited bytes
- Max core file size 0 unlimited bytes
- Max resident set unlimited unlimited bytes
- Max processes 11590 11590 processes
- Max open files 1024 4096 files
- Max locked memory 65536 65536 bytes
- Max address space unlimited unlimited bytes
- Max file locks unlimited unlimited locks
- Max pending signals 11590 11590 signals
- Max msgqueue size 819200 819200 bytes
- Max nice priority 40 40
- Max realtime priority 0 0
- Max realtime timeout unlimited unlimited us
对于CPU占用情况,你可以使用top或ps直接获取,当然你可以参考通过/proc/stat等文件计算Cpu使用率。
对于内存占用情况,可以直接通过查看cat /proc/pid/status
获得,比如下面的一个输出:
- Name: al.simpleplayer
- State: S (sleeping)
- Tgid: 12041
- Ngid: 0
- Pid: 12041
- PPid: 467
- TracerPid: 0
- Uid: 10127 10127 10127 10127
- Gid: 10127 10127 10127 10127
- FDSize: 256
- Groups: 3003 9997 50127
- VmPeak: 3010472 kB
- VmSize: 2884308 kB
- VmLck: 0 kB
- VmPin: 0 kB
- VmHWM: 948344 kB
- VmRSS: 916964 kB
- VmData: 1518672 kB
- VmStk: 8196 kB
- VmExe: 20 kB
- VmLib: 136604 kB
- VmPTE: 3824 kB
- VmPMD: 16 kB
- VmSwap: 4 kB
- Threads: 380
- SigQ: 0/11590
- SigPnd: 0000000000000000
- ShdPnd: 0000000000000000
- SigBlk: 0000000000001204
- SigIgn: 0000000000000000
- SigCgt: 200000020000c4fa
- CapInh: 0000000000000000
- CapPrm: 0000000000000000
- CapEff: 0000000000000000
- CapBnd: 0000000000000000
- CapAmb: 0000000000000000
- Seccomp: 0
- Cpus_allowed: ff
- Cpus_allowed_list: 0-7
- Mems_allowed: 1
- Mems_allowed_list: 0
- voluntary_ctxt_switches: 407399
- nonvoluntary_ctxt_switches: 315236
内存相关的都是Vm打头的,解释如下:
VmPeak: 60184 kB 进程地址空间的大小
VmHWM: 18020 kB 文件内存映射和匿名内存映射的大小
VmSize(KB)=1499136 任务虚拟地址空间的大小 (total_vm-reserved_vm),其中total_vm为进程的地址空间的大小,reserved_vm:进程在预留或特殊的内存间的物理页
VmLck(KB)=0 任务已经锁住的物理内存的大小。锁住的物理内存不能交换到硬盘 (locked_vm)
VmRSS(KB)= 344 kB 应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)
VmData(KB)=20KB 程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据; (total_vm-shared_vm-stack_vm)
VmStk(KB)=84KB 任务在用户态的栈的大小 (stack_vm)
VmExe(KB)=4KB 程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 (end_code-start_code)
VmLib(KB)=1300KB 被映像到任务的虚拟内存空间的库的大小 (exec_lib)
VmPTE=6KB 该进程的所有页表的大小,单位:kb
该进程已打开句柄(fd)可以使用ls -l /proc/pid/fd/
,输出为详细内容:
- # ls -l fd
- total 0
- lrwx------ 1 u0_a127 u0_a127 64 2018-03-02 17:31 0 -> /dev/null
- lrwx------ 1 u0_a127 u0_a127 64 2018-03-02 17:31 1 -> /dev/null
- lr-x------ 1 u0_a127 u0_a127 64 2018-03-02 17:31 10 -> /system/etc/event-log-tags
- lr-x------ 1 u0_a127 u0_a127 64 2018-03-02 17:31 11 -> /system/framework/core-oj.jar
- lrwx------ 1 u0_a127 u0_a127 64 2018-03-02 17:31 26 -> anon_inode:[eventfd]
- l-wx------ 1 u0_a127 u0_a127 64 2018-03-02 17:31 27 -> /dev/cpuctl/tasks
- lrwx------ 1 u0_a127 u0_a127 64 2018-03-02 17:31 3 -> socket:[17762]
- l-wx------ 1 u0_a127 u0_a127 64 2018-03-02 17:31 33 -> pipe:[275546]
- lrwx------ 1 u0_a127 u0_a127 64 2018-03-02 17:28 43 -> /storage/emulated/0/render.log
进程内部包含的线程详细信息可以在/proc/pid/task
目录中查看,统计数目可以在cat /proc/pid/status
获得。
关于网络资源占用的信息,linux下提供了很多工具,比如netstat、iftop、ntop、nethogs、ifstat等等。可以按照进程、端口、设备统计具体流量。如果大家对其中某个工具感兴趣可以查看对应的资料。
这里我们介绍下如何通过/proc/pid/目录拿到特定进程已打开的socket及其属性(udp、tcp、占用端口等)。
在/proc/pid/fd
目录下可以看到当前进程打开多少个socket(socket也属于fd的一种)。更具体的信息可以在/proc/pid/net/tcp
或/proc/pid/net/udp
,输出信息如下:
- hi3660:/proc/24495/net # cat tcp
- sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
- 0: 0100007F:13AD 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 9672 1 fffffff5cc160000 100 0 0 10 0
- 1: CD340A0A:DB24 AB66387B:0050 06 00000000:00000000 03:00000B7B 00000000 0 0 0 3 fffffff597baad68
- 2: CD340A0A:DADE AB66387B:0050 06 00000000:00000000 03:0000051B 00000000 0 0 0 3 fffffff597baaa50
- 3: CD340A0A:DAC2 AB66387B:0050 06 00000000:00000000 03:000004A2 00000000 0 0 0 3 fffffff597baa108
- 4: CD340A0A:DBBA AB66387B:0050 06 00000000:00000000 03:0000171C 00000000 0 0 0 3 fffffff597baa000
- 5: CD340A0A:DBB4 AB66387B:0050 08 00000000:00000000 00:00000000 00000000 10129 0 960411 1 fffffff59f790000 20 4 32 10 7
- 6: CD340A0A:DBC4 AB66387B:0050 01 00000000:00000000 00:00000000 00000000 10129 0 971487 1 fffffff599916600 21 4 30 10 7
- 7: CD340A0A:DBB2 AB66387B:0050 06 00000000:00000000 03:00001713 00000000 0 0 0 3 fffffff597baa948
- 8: CD340A0A:DBA8 AB66387B:0050 06 00000000:00000000 03:0000170A 00000000 0 0 0 3 fffffff597baa528
- 9: CD340A0A:DBB6 AB66387B:0050 06 00000000:00000000 03:00001718 00000000 0 0 0 3 fffffff597baa420
- 10: CD340A0A:DB0C AB66387B:0050 06 00000000:00000000 03:000009F5 00000000 0 0 0 3 fffffff597baa630
- 11: CD340A0A:DBB8 AB66387B:0050 06 00000000:00000000 03:0000171A 00000000 0 0 0 3 fffffff597baa738
这和netstat输出是一致的。
- hi3660:/proc/24495/net # netstat -tu
- Active Internet connections (w/o servers)
- Proto Recv-Q Send-Q Local Address Foreign Address State
- tcp 0 0 10.10.52.205:56100 123.56.102.171:http TIME_WAIT
- tcp 0 0 10.10.52.205:56308 123.56.102.171:http ESTABLISHED
- tcp 0 0 10.10.52.205:56030 123.56.102.171:http TIME_WAIT
- tcp 0 0 10.10.52.205:56284 123.56.102.171:http CLOSE_WAIT
- tcp 0 0 10.10.52.205:56002 123.56.102.171:http TIME_WAIT
- tcp 0 0 10.10.52.205:56250 123.56.102.171:http TIME_WAIT
- tcp 0 0 10.10.52.205:56242 123.56.102.171:http TIME_WAIT
- tcp 0 0 10.10.52.205:56232 123.56.102.171:http TIME_WAIT
- tcp 0 0 10.10.52.205:56246 123.56.102.171:http TIME_WAIT
- tcp 0 0 10.10.52.205:56076 123.56.102.171:http TIME_WAIT
- tcp 0 0 10.10.52.205:56248 123.56.102.171:http TIME_WAIT
本文的主要目标是简单地了解下linux下进程的构成,可以通过命令行直接查看进程内部已打开资源,对于实际调试中资源泄露有所帮助。
内核资料直通车:Linux内核源码技术学习路线+视频教程代码资料
学习直通车:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈
原文作者:极致Linux内核
原文地址:Linux内核:进程管理——进程资源占用分析 - 知乎(版权归原文作者所有,侵权留言联系删除)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。