在Linux上运行procmem和procrank
Android系统中提供了两个命令行工具procrank、procmem用于查看系统中的内存使用情况。procrank可以查看系统中所有进程的整体内存占用情况,并按照规则排序。而procmem可以针对某个特定的进程分析其堆、栈、共享库等内存占用情况。这两个工具对于我们分析内存相关问题非常有效。由于Android系统使用的是Linux内核,理论上这样的工具可以在Linux上运行。
编译
参考Android系统中procrank、procmem的Android.mk发现他们依赖于libpagemap库,需要将其一并移植到Linux系统中。
Makefile可以通过CMake自动生成,当然前提是需要安装cmake工具。
sudo apt-get install cmake
参考Android.mk,可以写出如下的CMakeLists.txt.
cmake_minimum_required(VERSION 2.8)
PROJECT (mem_proc)
file(GLOB SOURCES "${PROJECT_SOURCE_DIR}/libpagemap/*.c")
add_definitions (-D_LARGEFILE64_SOURCE)
include_directories (${PROJECT_SOURCE_DIR}/libpagemap/include)
add_library(pagemap ${SOURCES})add_executable(procmem ${PROJECT_SOURCE_DIR}/procmem/procmem.c)
target_link_libraries(procmem pagemap)
add_executable(procrank ${PROJECT_SOURCE_DIR}/procrank/procrank.c)
target_link_libraries(procrank pagemap)
编译过程如下:
-从GitHub下载源码
david-virtual-machine% git clone https://github.com/sunao2002002/mem_proc.git
正克隆到 'mem_proc'...
remote: Counting objects: 22, done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 22 (delta 4), reused 22 (delta 4), pack-reused 0
展开对象中: 100% (22/22), 完成.
检查连接... 完成。
-运行cmake生成Makefile
david-virtual-machine% cd mem_proc
david-virtual-machine% ls
build.sh CMakeLists.txt libpagemap procmem procrank
david-virtual-machine% mkdir out
david-virtual-machine% cd out
david-virtual-machine% cmake ..
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/david/github/mem_proc/out
david-virtual-machine% ls
CMakeCache.txt CMakeFiles cmake_install.cmake Makefile
david-virtual-machine%
-make生成可执行文件
david-virtual-machine% make
Scanning dependencies of target pagemap
[ 11%] Building C object CMakeFiles/pagemap.dir/libpagemap/pm_memusage.c.o
[ 22%] Building C object CMakeFiles/pagemap.dir/libpagemap/pm_process.c.o
[ 33%] Building C object CMakeFiles/pagemap.dir/libpagemap/pm_map.c.o
[ 44%] Building C object CMakeFiles/pagemap.dir/libpagemap/pm_kernel.c.o
[ 55%] Linking C static library libpagemap.a
[ 55%] Built target pagemap
Scanning dependencies of target procmem
[ 66%] Building C object CMakeFiles/procmem.dir/procmem/procmem.c.o
[ 77%] Linking C executable procmem
[ 77%] Built target procmem
Scanning dependencies of target procrank
[ 88%] Building C object CMakeFiles/procrank.dir/procrank/procrank.c.o
/home/david/github/mem_proc/procrank/procrank.c: In function ‘getprocname’:
/home/david/github/mem_proc/procrank/procrank.c:381:9: warning: implicit declaration of function ‘asprintf’ [-Wimplicit-function-declaration]if (asprintf(&filename, "/proc/%d/cmdline", pid) < 0) {^
/home/david/github/mem_proc/procrank/procrank.c:408:56: warning: comparison between pointer and integerif (strncpy(buf, unknown_cmdline, (size_t)len) >= (size_t)len) {^
[100%] Linking C executable procrank
[100%] Built target procrank
david-virtual-machine% file procrank procmem
procrank: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=19cdcb1d4674c66a3ea62e3bc026f01773a43ce0, not stripped
procmem: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=20e20cce4fd40bc859eca4d91d298f4d5165c8ff, not stripped
david-virtual-machine%
-也可以直接运行build.sh完成整个流程。
运行
procrank
procrank是按照内存占用情况对进程进行排序。因为它需要遍历/proc下的所有进程获取内存占用情况,所以在运行时候需要有root权限。可用排序的有VSS、RSS、PSS、USS。
VSS:Virtual Set Size,虚拟内存耗用内存,包括共享库的内存
RSS:Resident Set Size,实际使用物理内存,包括共享库
PSS:Proportional Set Size,实际使用的物理内存,共享库按比例分配
USS:Unique Set Size,进程独占的物理内存,不计算共享库,也可以理解为将进程杀死能释放出的内存
一般VSS >= RSS >= PSS >= USS
procrank默认是按照PSS降序排列
david-virtual-machine% sudo ./procrank -h
Usage: ./procrank [ -W ] [ -v | -r | -p | -u | -s | -h ]-v Sort by VSS.
-r Sort by RSS.
-p Sort by PSS.
-u Sort by USS.
-s Sort by swap.
(Default sort order is PSS.)-R Reverse sort order (default is descending).
-c Only show cached (storage backed) pages
-C Only show non-cached (ram/swap backed) pages
-k Only show pages collapsed by KSM
-w Display statistics for working set only.
-W Reset working set of all processes.
-h Display this help screen.
david-virtual-machine%
运行如下截图
david-virtual-machine% sudo ./procrankPID Vss Rss Pss Uss cmdline1078 283472K 40276K 33492K 32176K /usr/lib/xorg/Xorg1746 637444K 50136K 21732K 16172K /usr/bin/python31724 237872K 28724K 17579K 14408K /usr/bin/python3......1793 4504K 1688K 261K 244K /bin/sh749 4396K 1760K 240K 220K /usr/sbin/acpid3158 14868K 1788K 188K 164K gnome-pty-helper------ ------ ------340421K 270184K TOTALRAM: 8157592K total, 6676160K free, 116188K buffers, 834428K cached, 12048K shmem, 148268K slab
procmem
procrank 给出了系统整体的内存占用情况,针对每一个进程具体分析就要使用procmem工具了。同样运行procmem需要root权限。
以上图1793号进程 /bin/sh为例,分析内存占用情况:
david-virtual-machine% sudo ./procmem 1793Vss Rss Pss Uss ShCl ShDi PrCl PrDi Name
------- ------- ------- ------- ------- ------- ------- -------144K 144K 144K 144K 0K 0K 144K 0K /bin/dash8K 8K 8K 8K 0K 0K 8K 0K /bin/dash4K 4K 4K 4K 0K 0K 4K 0K /bin/dash8K 4K 4K 4K 0K 0K 4K 0K132K 8K 8K 8K 0K 0K 8K 0K [heap]1788K 1288K 16K 0K 1288K 0K 0K 0K /lib/x86_64-linux-gnu/libc-2.23.so2048K 0K 0K 0K 0K 0K 0K 0K /lib/x86_64-linux-gnu/libc-2.23.so16K 16K 16K 16K 0K 0K 16K 0K /lib/x86_64-linux-gnu/libc-2.23.so8K 8K 8K 8K 0K 0K 8K 0K /lib/x86_64-linux-gnu/libc-2.23.so16K 8K 8K 8K 0K 0K 8K 0K152K 152K 1K 0K 152K 0K 0K 0K /lib/x86_64-linux-gnu/ld-2.23.so12K 12K 12K 12K 0K 0K 12K 0K8K 8K 8K 8K 0K 0K 8K 0K4K 4K 4K 4K 0K 0K 4K 0K /lib/x86_64-linux-gnu/ld-2.23.so4K 4K 4K 4K 0K 0K 4K 0K /lib/x86_64-linux-gnu/ld-2.23.so4K 4K 4K 4K 0K 0K 4K 0K132K 12K 12K 12K 0K 0K 12K 0K [stack]8K 0K 0K 0K 0K 0K 0K 0K [vvar]8K 4K 0K 0K 4K 0K 0K 0K [vdso]0K 0K 0K 0K 0K 0K 0K 0K [vsyscall]
------- ------- ------- ------- ------- ------- ------- -------4504K 1688K 261K 244K 1444K 0K 244K 0K TOTAL
procmem 给出了procrank中VSS、RSS、PSS、USS的每一部分组成,包括进程可执行程序本身、共享库、堆、栈的内存占用。这里的信息应该是从/proc/pid/maps文件中获取的.
david-virtual-machine% sudo cat /proc/1793/maps
559358022000-559358046000 r-xp 00000000 08:01 1835041 /bin/dash
559358245000-559358247000 r--p 00023000 08:01 1835041 /bin/dash
559358247000-559358248000 rw-p 00025000 08:01 1835041 /bin/dash
559358248000-55935824a000 rw-p 00000000 00:00 0
559358920000-559358941000 rw-p 00000000 00:00 0 [heap]
7fab1342c000-7fab135eb000 r-xp 00000000 08:01 7606546 /lib/x86_64-linux-gnu/libc-2.23.so
7fab135eb000-7fab137eb000 ---p 001bf000 08:01 7606546 /lib/x86_64-linux-gnu/libc-2.23.so
7fab137eb000-7fab137ef000 r--p 001bf000 08:01 7606546 /lib/x86_64-linux-gnu/libc-2.23.so
7fab137ef000-7fab137f1000 rw-p 001c3000 08:01 7606546 /lib/x86_64-linux-gnu/libc-2.23.so
7fab137f1000-7fab137f5000 rw-p 00000000 00:00 0
7fab137f5000-7fab1381b000 r-xp 00000000 08:01 7602273 /lib/x86_64-linux-gnu/ld-2.23.so
7fab139fa000-7fab139fd000 rw-p 00000000 00:00 0
7fab13a18000-7fab13a1a000 rw-p 00000000 00:00 0
7fab13a1a000-7fab13a1b000 r--p 00025000 08:01 7602273 /lib/x86_64-linux-gnu/ld-2.23.so
7fab13a1b000-7fab13a1c000 rw-p 00026000 08:01 7602273 /lib/x86_64-linux-gnu/ld-2.23.so
7fab13a1c000-7fab13a1d000 rw-p 00000000 00:00 0
7ffe0a1f9000-7ffe0a21a000 rw-p 00000000 00:00 0 [stack]
7ffe0a273000-7ffe0a275000 r--p 00000000 00:00 0 [vvar]
7ffe0a275000-7ffe0a277000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
在Linux上运行procmem和procrank相关推荐
- linux里运行windows,在Linux上运行Windows应用程序
当前位置:我的异常网» Linux/Unix » 在Linux上运行Windows应用程序 在Linux上运行Windows应用程序 www.myexceptions.net 网友分享于:2015- ...
- linux下运行python unitest_Python unittest打印日志可以在Linux上运行,但在Windows上不行...
我正在尝试编写一个unittest,它将stdout和stderr重定向到一个写在Windows网络驱动器上的文件.出于某些原因,相同的脚本(只有diff.是目录路径)可以在Linux上工作,但在Wi ...
- python php linux-怎么在linux上运行python
Linux默认是已经安装好了Python程序 目前来说,大多数的Linux发行版是安装了两个版本的Python程序 一个是Python 2.x 一个是Python 3.x 一些系统自带的程序文件需要P ...
- Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台
Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台 原文:Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台 转发请注明此文 ...
- linux上运行项目,发布项目到 Linux 上运行 Core 项目
目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win7)上用虚拟机建了个 CentOS7 ,来演示下,我们windows上的项目如何发布项目到Linux上运行 ...
- linux java的启动内存溢出,java - Java的R代码可在Linux上运行,但不能在Windows中运行 - 堆栈内存溢出...
我在做什么? 我正在用Java编写一个数据分析程序,该程序依赖R的arulesViz库来挖掘关联规则. 我想要什么? 我的目的是将规则存储在Java中的String变量中,以便以后进行处理. 它是如何 ...
- 在Linux上运行Windows软件的4种以上方法
Linux has come a long way, but you may still need to run Windows applications occasionally – especia ...
- 不装mono,你的.NET程序照样可以在Linux上运行
让.NET应用程序在linux上运行,目前通用的做法就是在Linux上安装mono,然后通过"mono your.exe"命令运行这个程序. 这种运行.net程序的办法有两个弱点, ...
- linux java jar打包_【Java】Java程序打包成jar包在Linux上运行
当需要把在Windows上开发的Java程序用在Linux上运行时,就需要吧该Java程序打包成jar包上传到Linux上去运行. 1.Java程序用MyEclipse打包成可运行的jar包 (1)在 ...
- 如何在Linux上运行Windows软件?
因此,您已经准备好过渡到Linux ,但是您仍然有一些程序还不十分乐于使用. 您仍然可以在Linux上运行Windows软件吗? 答案可能是肯定的,但是有一些警告. 在继续之前,我想作一个重要的区分. ...
最新文章
- TMAXug ATPG Design Flow
- mysql readline_readLine的两种用法
- Android 系统(230)---OTA 软件包工具
- 如何让 Pages 文字分为两栏或更多栏?
- [c++primer][06]语句
- 滴滴再曝收费不靠谱:去程19元 回时164.8元
- nowcoder-linux
- MATLAB实现傅里叶变换
- 9550电机_扭矩公式9550是什么 电机扭矩计算公式T=9550P/n怎么算
- 计算机一级excel典型试题,最新excel计算机一级试题合集
- 双系统之删除Linux
- 路由器设置成交换机步骤
- 建筑智能化资质办理要求
- steam游戏一直连接服务器,steam无法连接到更新服务器快速有效解决办法
- Anaconda 修改默认虚拟环境安装位置
- Aspose for Java 去除水印和数量限制
- Bing翻译实例(microsoft translator API)
- Android studio 3.0 Appt2的异常问题 不一定需要关闭才能通过编译
- yota3墨水屏调节对比度_双屏手机YOTA3评测:墨水屏能当“Kindle”用,还支持微信!...
- MATLAB练习题(数学实验作业)