Linux进程资源占用分析
[时间:2018-03] [状态:Open]
[关键词:linux, 进程,proc,top]
0 引言
最近在分析安卓程序上的monkey测试日志时发现,需要了解下Linux进程资源占用情况及其查看方法。之前在windows上有ProcessExplorer可以直接查看,在Linux下就没这么方便了,只能通过命令行来查看。
所以本文的目标就在于:在你知道你要分析的进程名之后,通过命令行工具读取进程的PID、CPU占用情况、内存占用情况、已打开文件描述符、网络情况。
1 找到进程PID
目前使用比较经典的命令是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等等。(参考文献中有很多,有兴趣可以查看下)
2 给定进程资源占用情况
这里的资源包括:CPU、内存、打开句柄、内部线程。(上面提到的工具都有对应的数据列,这里仅提供最原始的查阅方式。)
linux的新创建进程会自动创建/proc/pid
目录,其中包含以下部分:
目录名 | 功能说明 |
---|---|
cmdline | 包含了用于启动进程的命令行 |
cwd | 包含了当前进程工作目录的链接 |
environ | 包含了可用进程环境变量的列表 |
exe | 包含了正在进程中运行的可执行文件的链接 |
fd | 包含了进程打开的每一个文件的链接 |
maps | 与进程相关的内存映射信息 |
mem | 包含了进程在内存中的内容 |
stat | 包含了进程的状态信息 |
statm | 包含了进程的内存使用信息 |
limits | 存储了进程的软限制,硬限制等信息 |
root | 指向进程根目录的软链接 |
self | 链接到当前正在运行的进程 |
task | 包含当前进程所有子线程pid |
其他更多介绍建议参考man-proc。
说明一点,我使用的是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
获得。
3 网络资源监控
关于网络资源占用的信息,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
5 总结
本文的主要目标是简单地了解下linux下进程的构成,可以通过命令行直接查看进程内部已打开资源,对于实际调试中资源泄露有所帮助。
6 参考文献
- 最全列表: 80 多个 Linux 系统管理员必备的监控工具
- 你值得拥有:25个Linux性能监控工具
- 20 Command Line Tools to Monitor Linux Performance,中译版
- Linux /proc/pid目录下相应文件的信息说明和含义
- 在Linux下怎么看网络流量?
- Linux 下大家喜欢用什么命令查看流量?
Linux进程资源占用分析的更多相关文章
- linux进程资源占用高原因分析命令记录
1.查看进程的线程: ps -eLf|egrep 'gateserver|UID' 2.跟踪线程调用: strace -p 15530 3.统计线程中函数的调用小号CPU时间: strace -p 1 ...
- 资源限制 ( resource limit 或 rlimit ),是 Linux 内核控制 用户 或 进程 资源占用的机制。
###### https://learn-linux.readthedocs.io/zh_CN/latest/administration/kernel/rlimit.html ########### ...
- Linux进程内存用量分析之堆内存篇
https://mp.weixin.qq.com/s/a6mLMDinYQGUSaOsGYCEaA 独家|Linux进程内存用量分析之堆内存篇 姬晨烜 58技术 2019-12-06 导语 本文将介绍 ...
- Linux 进程一直占用单核CPU分析
pidstat 1信息
- 查看LINUX进程内存占用情况
可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令: (1)top top命令是Linux下常用的性能分析 ...
- 查看LINUX进程内存占用情况(转)
可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令: (1)top top命令是Linux下常用的性能分析 ...
- 查看LINUX进程内存占用情况及启动时间
可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令: (1) top top命令是Linux下常用的性能分 ...
- 如何灵活运用Linux 进程资源监控和进程限制
导读 每个 Linux 系统管理员都应该知道如何验证硬件.资源和主要进程的完整性和可用性.另外,基于每个用户设置资源限制也是其中一项必备技能. 在这篇文章中,我们会介绍一些能够确保系统硬件和软件正常工 ...
- Linux 进程资源用量监控和按用户设置进程限制
每个 Linux 系统管理员都应该知道如何验证硬件.资源和主要进程的完整性和可用性.另外,基于每个用户设置资源限制也是其中一项必备技能. 在这篇文章中,我们会介绍一些能够确保系统硬件和软件正常工作的方 ...
随机推荐
- Intellij IDEA更改项目优先编译顺序
今天启动公司项目突然发现了一个问题,类里面明明有这个方法,但是无论怎样都不编译.(由于公司项目是二次开发,代码都是第三方写的,代码请勿仔细看,怕伤了你的眼睛.) 如图,找不到setJGMC方法. 但是 ...
- Alpha(8/10)
鐵鍋燉腯鱻 项目:小鱼记账 团队成员 项目燃尽图 冲刺情况描述 站立式会议照片 各成员情况 团队成员 学号 姓名 git地址 博客地址 031602240 许郁杨 (组长) https://githu ...
- Redis自学笔记:2.准备
第2章:准备 '纸上得来终觉浅,绝知此事要躬行'--陆游 2.2启动和停止redis 表2-1 redis可执行文件说明 文件名 说明 redis- server redis服务器 redis-cli ...
- DWM1000 定位数据收发以及定位算法
蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: DWM1000 定位数据 官方定位程序,建议先学习基础API程序 参考手册: 在手册上提到,目前双向定 ...
- Sunscreen [POJ3614] [贪心]
描述 C (1 ≤ C ≤ 2500) 头奶牛在海滩边晒太阳,要避免在日光浴时产生难看的灼伤,每头奶牛必须用防晒霜覆盖它的皮肤.第 i 头奶牛有一个最小和最大 SPF 值 (1 ≤ minSPFi ≤ ...
- java第一次课
package java第一周学习2; 达达20173435 信1705-2 import java.text.SimpleDateFormat; import java.util.Date; pub ...
- NodeJS缓冲区
NodeJS缓冲区 JavaScript语言本身在I/O时只有字符串数据类型,没有二进制数据类型,但在处理流数据时,必须用到二进制数据,因此在Node中,定义了一个Buffer类作为存放二进制数据的缓 ...
- Intel处理器技术文档
1.intel程序员手册(1986).pdf 下载地址 2.Intel® 64 and IA-32 Architectures Software Developer Manuals 下载链接 3. ...
- [Web 前端] qs.parse()、qs.stringify()使用方法
cp from : https://blog.csdn.net/suwu150/article/details/78333452 qs是一个npm仓库所管理的包,可通过npm install qs命令 ...
- jQuery插件备忘
jQuery BlockUI Plugin 遮罩插件 ...