Android命令之procrank&librank的使用

作者 by adtxl / 2021-12-14 / 暂无评论 / 632 个足迹

1. procrank

procrank是/system/bin/下的一个命令,在整机开发的时候,使用该命令查看应用进程的内存情况很方便。但是这个命令正常在debug/eng模式编译的时候才有,如果你是做第三方应用开发,如果可以root的手机的话,通过往该手机中push该命令,应该也可以使用该命令。

1.1 使用

procrank: invalid option -- -
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.
    -o  Show and sort by oom score against lowmemorykiller thresholds.
    -h  Display this help screen.

执行procrank命令输出如下

tv_e1_dtmb:/ # procrank
  PID       Vss      Rss      Pss      Uss     Swap    PSwap    USwap    ZSwap  cmdline
 4468  1587980K  313180K  215418K  205688K    1324K      47K       0K      13K  com.gitvdemo.video
 2128  1533820K  204476K   90260K   68764K    1232K      47K       4K      13K  system_server
 2058   112440K   40748K   32512K   32164K       0K       0K       0K       0K  media.swcodec
 2481  1152268K  117304K   28008K   21424K    1312K      47K       0K      13K  com.android.systemui
 4388  1105472K  112648K   23850K   16680K    1360K      49K       0K      13K  com.android.permissioncontroller
 2834  1074888K   98192K   22351K   18632K    1380K      49K       0K      13K  com.android.providers.media.module
......
......
 1850    23440K    2240K     414K     368K     468K     468K     468K     129K  /system/bin/iptables-restore
 1244    25312K    2880K     386K     160K    1268K    1268K    1268K     352K  /system/bin/init
                           ------   ------   ------   ------   ------   ------  ------
                          764353K  613104K   69832K   32836K   31408K    9120K  TOTAL

ZRAM: 9532K physical used for 33280K in swap (102396K total swap)
 RAM: 1323096K total, 54184K free, 14248K buffers, 323028K cached, 5504K shmem, 137268K slab

部分参数含义如下:
1、Vss
Vss与PS的VSIZE相同是单个进程全部可访问的地址空间
其大小包括可能还尚未在内存中驻留的部分。比如地址空间已经被 malloc 分配,但是还没有实际写入。
对于确定单个进程实际内存使用大小, VSS 用处不大。

2、Rss
RSS是单个进程实际占用的内存大小。
RSS易被误导的原因在于, 它包括了该进程所使用的所有共享库的全部内存大小。对于单个共享库, 尽管无论多少个进程使用,实际该共享库只会被装入内存一次。
对于单个进程的内存使用大小, RSS 不是一个精确的描述。

3、Pss
PSS 不同于RSS,它只是按比例包含其所使用的共享库大小。
例如, 三个进程使用同一个占用 30 内存页的共享库。 对于三个进程中的任何一个,PSS 将只包括 10 个内存页。
PSS 是一个非常有用的数字,因为系统中全部进程以整体的方式被统计, 对于系统中的整体内存使用是一个很好的描述。
如果一个进程被终止, 其PSS 中所使用的共享库大小将会重新按比例分配给剩下的仍在运行并且仍在使用该共享库的进程。
此种计算方式有轻微的误差,因为当某个进程中止的时候,PSS没有精确的表示被返还给整个系统的内存大小。

4、Uss
USS 是单个进程的全部私有内存大小。亦即全部被该进程独占的内存大小。
USS 是一个非常非常有用的数字, 因为它揭示了运行一个特定进程的真实的内存增量大小。
如果进程被终止, USS 就是实际被返还给系统的内存大小。
USS 是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字。

小结
VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

2. librank

2.1 使用

Usage: librank [ -P | -L ] [ -v | -r | -p | -u | -s | -h ]

Sort options:
    -v  Sort processes by VSS.
    -r  Sort processes by RSS.
    -p  Sort processes by PSS.
    -u  Sort processes by USS.
    -s  Sort processes by swap.
        (Default sort order is PSS.)
    -a  Show all mappings, including stack, heap and anon.
    -P /path  Limit libraries displayed to those in path.
    -R  Reverse sort order (default is descending).
    -m [r][w][x] Only list pages that exactly match permissions
    -c  Only show cached (storage backed) pages
    -C  Only show non-cached (ram/swap backed) pages
    -k  Only show pages collapsed by KSM
    -f  [raw][json][csv] Print output in the specified format.
        (Default format is raw text.)
    -h  Display this help screen.
RSStot       VSS      RSS      PSS      USS     Swap  Name/PID
142377K                                                [anon:scudo:primary]
           50432K   35604K   34280K   34232K     160K    com.gitvdemo.video [4468]
           26880K   15004K   13474K   13364K     180K    system_server [2128]
           28160K   12252K   11615K   11612K     520K    /system/bin/surfaceflinger [1895]
           23040K   11236K    9709K    9608K     168K    com.eswin.tv.launcher.lite [2912]
           21504K    9432K    7590K    7508K     240K    com.android.providers.media.module [2834]
           22016K    7144K    7144K    7144K       0K    librank [22726]
           36352K    6564K    6408K    6408K       0K    /system/bin/mediaserver [2016]
           18688K    6416K    4633K    4544K     204K    com.android.systemui [2481]
           17152K    4648K    2464K    2332K     268K    com.android.tv.settings [2649]
           16384K    4412K    2408K    2324K     272K    com.android.networkstack.process [2581]
           11520K    2096K    1818K    1808K     184K    /system/bin/logd [1523]
           16384K    4016K    1588K    1432K     292K    com.android.statementservice [3219]
           16896K    3948K    1563K    1452K     308K    com.android.inputmethod.leanback [3236]
           16128K    3904K    1551K    1436K     296K    com.android.providers.tv [3140]
           14848K    1176K    1052K    1052K     940K    /system/bin/init [1]
           16128K    3576K     957K     816K     336K    com.android.dynsystem:dynsystem [3010]
..........
           10496K     768K     576K     564K      44K    /system/bin/netd [1844]
           10240K     616K     576K     564K       0K    /system/bin/TVInputServer [1967]
            9472K     328K     308K     304K     456K    /system/bin/keystore2 [1804]

独特见解