sheldon_blogs

Linux学习:使用 procrank 测量系统内存使用情况

  程序员应该了解一个基本问题:我的程序使用了多少内存?这可能是一个简单的问题,但是对于像Linux这样的虚拟内存操作系统,答案是相当复杂的,因为top和ps给出的数字不能简单相加。进程中两个最常见的内存信息指标是虚拟集大小(Vss)和常驻集大小(Rss),可以在ps和top指令查看到这些参数:

  

  Vss 也叫 VIRT / VSZ,是虚拟内存总量的映射,不管它是否被提交到物理内存。

  Rss 也叫 RES / RSS,是物理内存总量的映射,只要页面在自己的区间内被映射过,就算在自己的头上。例如/lib/x86_64-linux-gnu/libc-2.23.so的某一个页面被60个进程使用过,那么自己还是要算上4K。

  Vss显然被高估了,因为应用程序通常分配它们从不使用的内存。Rss是一个更好的度量方法,但仍比实际值稍大,因为它没有考虑进程之间共享的内存页。例如,内存中只有一个C库驻留程序的副本,被与之关联的所有进程之间共享,但Rss会多次占用它。

  曾经 Matt Mackall 研究过这个问题,并添加了两个称为唯一集大小(Uss)和比例集大小(Pss)的新度量,并修改了内核以开放计算它们所需的信息,这些信息可以在/proc/[PID]/smaps中找到。

  Pss 是比例集大小(与其他进程共享的内存量)除以每个页面的共享进程数,页面被多个进程映射过,那么把使用量平均到大家头上。libc的这个页面就只能算在自己头上4k / 60 = 68Bytes。

  Uss 是唯一的集合大小,即进程私有且不与任何其他进程共享的内存大小,页面只有被自己使用过,才算到自己头上。Uss的统计意义在于,如果这个进程被杀掉了,那么实际上只能释放这么多内存,所以Uss是针对某个进程进行内存泄露检测的最佳数字,因为它显示的页面是唯一的,你可以把它看作是在内存中创建副本时所损耗的内从大小,如果怀疑某个程序有内存泄露就查看这个值是否一直增加。

  一般情况下,都是:VSS >= RSS >= PSS >= USS

  为了稍微简化一下,下面的图表显示了三个进程,每个进程映射到其虚拟地址空间的页面,并且分别被标记为A、B或C类:

  • A = 映射到RAM物理页的私有内存,包括正在使用的堆和栈的部分。
  • B = 由一个或多个进程映射并共享的内存,例如共享库中的代码。
  • C = 被分配但从未被访问的内存。

  至此,每个进程所占用的内存组成如下:

  • Vss = A + B + C
  • Rss = A + B
  • Uss = A
  • Pss = A + B/n (其中n是共享进程的数量)

  
 

  计算三个进程的Pss为:

  Pss(1) = 2 + 3/3 + 2/2 = 4
  Pss(2) = 2 + 3/3 + 2/2 = 4
  Pss(3) = 2 + 3/3 = 3
  Sum(Pss) = 11 = total of pages in use

  可见Pss考虑到进程之间的内存共享,给出了一个进程正在使用的内存的精确值,所有进程使用的内存总量是它们的Pss的总和。

  Matt Mackall在Linux PC系统开发了一个工具叫smem,用来显示Uss和Pss,但它需要Python运行时环境,而在嵌入式Linux设备上通常是不可行的。而Android开发人员遇到这个问题后,使用Android BIONIC C库编写了一个叫 procrank 的命令行工具,它可以给出更准确的测量结果。

msmnile:/ # procrank
  PID       Vss      Rss      Pss      Uss  cmdline
  897  4900108K  319044K  153980K  131100K  system_server
 3910  4670340K  200476K   77423K   67964K  org.codeaurora.snapcam
  732   281036K   76952K   69501K   68784K  /vendor/bin/hw/android.hardware.camera.provider@2.4-service_64
 1859  4532080K  205212K   59186K   48300K  com.android.systemui
  673  1632240K  134900K   42328K   17100K  zygote
 2669  4481540K  148792K   30077K   21900K  com.android.launcher3
 2067  4472708K  134984K   29088K   24184K  com.android.phone
  672  4319928K  151224K   25268K    7800K  zygote64
 1778  4458488K  116912K   19279K   15600K  com.android.bluetooth
 1275   126780K   36996K   19247K    8760K  /vendor/bin/hw/qcrild
 3025  4429916K  111348K   18965K   16384K  org.codeaurora.dialer
 1304   124668K   36440K   18513K    8000K  /vendor/bin/hw/qcrild
  826  2188808K   35200K   17394K   12620K  /system/bin/surfaceflinger
  728    47200K   20752K   17040K   16608K  /vendor/bin/hw/android.hardware.audio@2.0-service
 3428  1707580K   82368K   16143K    3408K  com.qualcomm.qti.qms.service.connectionsecurity
 1831  1634080K   56768K   16013K    5888K  webview_zygote
  821    86604K   28932K   15049K   11536K  /system/bin/audioserver
 3443  1705828K   80684K   14900K    2284K  com.qualcomm.qti.qms.service.telemetry
 2571  4419152K  115552K   14712K   10600K  com.android.nfc
 1805  4411628K  113984K   14547K   10972K  com.android.inputmethod.latin
 3942  4399092K   94988K   13766K   10728K  com.google.ar.core.examples.java.helloar
  737    59436K   22164K   12749K   11312K  /vendor/bin/hw/android.hardware.graphics.composer@2.2-service
 3139  4407532K  107504K   12371K    9620K  com.android.email
 1079    75212K   16236K   10657K    9936K  media.codec
 1319   137232K   17276K   10503K    9580K  /system/vendor/bin/netmgrd
 2831  4401620K  112884K   10086K    5968K  android.process.media
 3200  4407188K  106352K    9966K    6632K  com.android.mms
 1040  2196216K   25216K    9650K    7740K  media.extractor
  754    47912K   15444K    9279K    8852K  /vendor/bin/hw/vendor.qti.gnss@2.1-service
 3921  4402276K   96488K    9207K    7096K  org.codeaurora.gallery
 2540  4403336K  107660K    8612K    5220K  com.qualcomm.qti.qdma
 1979  4413808K  101996K    8174K    5548K  .dataservices
 3087  4396428K  101276K    7004K    4256K  com.android.providers.calendar
 1004    41104K   18720K    6821K    4524K  /system/bin/cameraserver
 2910  4402852K   97864K    6750K    3604K  com.qualcomm.location.XT
 2025  4400076K   98136K    5998K    3320K  com.qualcomm.qti.telephonyservice
 3491  4396328K   94684K    5944K    3732K  com.qualcomm.qti.workloadclassifier
 2191  4398632K   97916K    5857K    3220K  com.qualcomm.qcrilmsgtunnel
 2125  4395848K   97736K    5739K    3068K  android.ext.services
 2721  4395804K   97800K    5718K    3212K  com.qualcomm.qti.smq
  961  2151708K   13616K    5668K    4448K  /system/vendor/bin/cnd
 3951  4398484K   91132K    5621K    3592K  com.android.music
 2646  4399780K   95124K    5407K    3068K  com.qualcomm.qti.services.secureui:sui_service
 1054    58104K   17440K    5355K    3220K  /system/bin/mediaserver
 3412  4393968K   94736K    5252K    2776K  com.qualcomm.qti.modemtestmode
 1042  2155140K   18408K    5220K    3556K  media.metrics
 3007  4399292K   94332K    5091K    2824K  com.qti.diagservices
 2627  4398052K   92572K    5044K    2888K  com.android.se
 3335  4397228K   93000K    5031K    2908K  com.qualcomm.qti.biometrics.fingerprint.service:remote
 3300  4399052K   93328K    4959K    2784K  com.qualcomm.telephony
 2809  4395468K   92844K    4955K    2812K  com.android.keychain
 2601  4394396K   93704K    4927K    2672K  .pasr
 3365  4395848K   92928K    4876K    2720K  com.qualcomm.qti.callenhancement
 3507  4395736K   93212K    4862K    2708K  com.qualcomm.simcontacts
 3473  4395708K   93376K    4784K    2620K  com.qualcomm.qti.smcinvokepkgmgr
 3458  4393648K   91164K    4775K    2728K  com.qualcomm.qti.radioconfiginterface
 3397  4393652K   91324K    4764K    2712K  com.qualcomm.qti.lpa
 3382  4393548K   91288K    4735K    2680K  com.qualcomm.qti.carrierswitch
 2697  4393548K   91596K    4681K    2520K  com.android.smspush
 3969  4395056K   90068K    4619K    2544K  com.waterdaaan.cpufloat
 2465    31360K    8952K    4051K    3892K  /vendor/bin/hbtp_daemon
    1    32124K    5740K    3937K    3312K  /init
  582    23516K    6652K    3890K    3856K  /system/bin/logd
  743    22028K    9624K    3866K    3576K  /vendor/bin/hw/android.hardware.neuralnetworks@1.1-service-qti
 1008    25340K   14056K    3718K    1980K  /system/bin/drmserver
  748    18056K    7980K    3527K    3460K  /vendor/bin/hw/android.hardware.wifi@1.0-service
  772    30396K    9644K    3524K    2992K  /vendor/bin/hw/vendor.qti.hardware.perf@1.0-service
 1248  2139568K   10056K    3306K    2248K  /vendor/bin/imsdatadaemon
 1159    21432K    8392K    2987K    2476K  /system/bin/update_engine
  745    36012K    9872K    2910K    2296K  /vendor/bin/hw/android.hardware.sensors@1.0-service
  756    34456K    8444K    2896K    2396K  /vendor/bin/hw/vendor.qti.hardware.biometrics.face@1.0-service
 1022  2132188K    8188K    2857K    2492K  /system/bin/keystore
  591    27712K    8036K    2802K    2484K  /system/bin/vold
  990    32308K    8116K    2703K    2508K  /vendor/bin/ims_rtp_daemon
 1013    26448K    6848K    2699K    2604K  /system/bin/installd
 1155  2135988K   10992K    2575K    1580K  /system/bin/seempd
 1152    13328K    6964K    2567K    1888K  /system/bin/qvrservice
 1153    31912K    8588K    2563K    2012K  xtra-daemon
  671  2146312K    7840K    2551K    2352K  /system/bin/netd
  978    20036K    7124K    2490K    2436K  /vendor/bin/imsrcsd
 1151    32240K    8404K    2414K    1964K  slim_daemon
  985    15652K    6120K    2372K    2312K  /system/vendor/bin/cnss_diag
  968    76792K    7052K    2329K    2260K  /vendor/bin/thermal-engine
 1297    22584K    7196K    2283K    2044K  /system/vendor/bin/ipacm
 1164    22216K    6612K    2138K    2088K  /vendor/bin/qfp-daemon
  752    25164K    6692K    2086K    1720K  /vendor/bin/hw/vendor.nxp.hardware.nfc@1.1-service
 1109    19304K    5672K    2081K    2000K  /vendor/bin/chre
  731    30956K    6632K    2043K    1988K  /vendor/bin/hw/android.hardware.bluetooth@1.0-service-qti
 1147    17700K    5456K    2002K    1948K  /system/bin/perfprofd
  776    17944K    5848K    1985K    1268K  /vendor/bin/hw/vendor.qti.hardware.scve.objecttracker@1.0-service
  778    18272K    5784K    1985K    1300K  /vendor/bin/hw/vendor.qti.hardware.scve.panorama@1.0-service
 1066    21752K    6820K    1983K    1664K  /system/bin/statsd
  764    23440K    7216K    1956K    1708K  /vendor/bin/hw/vendor.qti.hardware.iop@2.0-service
  592  2127348K    7072K    1956K    1576K  /system/bin/hwservicemanager
 1069    21356K    6664K    1942K    1772K  /system/bin/storaged
  757    16488K    6428K    1867K    1748K  /vendor/bin/hw/vendor.qti.hardware.cvp@1.0-service
  963    22004K    6624K    1866K    1612K  /vendor/bin/vppservice
  854    26396K    7880K    1863K    1308K  /vendor/bin/sensors.qti
 1150  2131700K    6312K    1862K    1704K  lowi-server
  734    20968K    6748K    1835K    1224K  /vendor/bin/hw/android.hardware.configstore@1.1-service
  583    33820K    7108K    1784K    1388K  /vendor/bin/qseecomd
  749    17628K    6512K    1767K    1616K  /vendor/bin/hw/vendor.display.color@1.0-service
  785    22052K    8520K    1767K    1248K  /vendor/bin/hw/vendor.qti.hardware.sensorscalibrate@1.0-service
 4023    21844K    1816K    1687K    1680K  /system/bin/adbd
  736    22460K    6692K    1685K    1412K  /vendor/bin/hw/android.hardware.drm@1.1-service.clearkey
  727    23572K    7696K    1680K    1124K  /vendor/bin/sscrpcd
  735    21644K    6876K    1654K    1372K  /vendor/bin/hw/android.hardware.drm@1.0-service
 1075    17088K    5980K    1635K    1524K  /system/bin/wificond
  560     7756K    3088K    1620K    1108K  /init
 1089    28572K    6776K    1619K    1500K  /system/vendor/bin/cnss-daemon
  562     9040K    2980K    1560K    1088K  /sbin/ueventd
 1311    23980K    5672K    1546K    1472K  /system/vendor/bin/qti
 1023  2130020K    7220K    1522K    1228K  /system/bin/mediadrmserver
  800    21284K    6148K    1513K    1112K  /vendor/bin/hw/vendor.qti.secure_element@1.0-service
 1097    25908K    4108K    1507K    1304K  /vendor/bin/ssgtzd
 1123  2127344K    6972K    1479K    1192K  /system/bin/gatekeeperd
 1315    23760K    5500K    1440K    1368K  /system/vendor/bin/adpl
 1082     9732K    4796K    1416K    1088K  /vendor/bin/wifidisplayhalservice
 1654  2126448K    5904K    1388K    1248K  /vendor/bin/hw/android.hardware.contexthub@1.0-service
 1530  2141100K    4240K    1374K     652K  seempd_sphinx
  774    18452K    6100K    1367K    1168K  /vendor/bin/hw/vendor.qti.hardware.qteeconnector@1.0-service
  962    20436K    5820K    1343K    1292K  /system/vendor/bin/dpmQmiMgr
  733     8728K    4904K    1308K     928K  /vendor/bin/hw/android.hardware.cas@1.0-service
  682    10096K    3772K    1297K    1280K  /system/bin/ip6tables-restore
 1117    21832K    5480K    1277K    1160K  /vendor/bin/tloc_daemon
  763    22576K    6272K    1256K    1124K  /vendor/bin/hw/vendor.qti.hardware.display.allocator@1.0-service
  585    16844K    6048K    1229K     924K  /vendor/bin/hw/android.hardware.keymaster@4.0-strongbox-service-qti
  681    10076K    3688K    1225K    1208K  /system/bin/iptables-restore
  584    16840K    5948K    1220K     916K  /vendor/bin/hw/android.hardware.keymaster@4.0-service-qti
 1176    21340K    5296K    1207K     700K  /system/bin/dpmd
 1084    26012K    5056K    1195K    1152K  /vendor/bin/time_daemon
  744    16196K    5640K    1182K    1108K  /vendor/bin/hw/android.hardware.power@1.2-service
 4330    17968K    3724K    1177K    1160K  procrank
 1009    18460K    5496K    1164K    1040K  /system/bin/incidentd
 1101    26360K    5068K    1163K    1096K  /system/vendor/bin/qdmastatsd
 1056    22816K    5656K    1162K    1036K  /system/bin/perfservice
  952    18648K    5588K    1147K    1064K  /system/vendor/bin/qcom-system-daemon
  810    27784K    5432K    1135K    1064K  /vendor/bin/pm-service
  765    16284K    5724K    1134K    1076K  /vendor/bin/hw/vendor.qti.hardware.mlshal@1.0-service
 1208    22840K    5644K    1123K    1044K  /vendor/bin/ATFWD-daemon
  561     6732K    2384K    1101K     692K  /init
  740    14368K    5224K    1098K    1060K  /vendor/bin/hw/android.hardware.health@2.0-service
  796    14272K    5164K    1097K    1060K  /vendor/bin/hw/vendor.qti.hardware.vibrator@1.2-service
  975    16320K    4904K    1089K    1048K  /vendor/bin/imsqmidaemon
  790    14904K    5440K    1081K    1020K  /vendor/bin/hw/vendor.qti.hardware.soter@1.0-service
  619    15396K    5556K    1053K     976K  /vendor/bin/hw/android.hardware.gatekeeper@1.0-service-qti
  618    14860K    5392K    1037K     988K  /vendor/bin/hw/android.hardware.boot@1.0-service
  827    15220K    5076K    1032K     956K  /system/bin/thermalserviced
  994    24884K    4304K    1014K     988K  /vendor/bin/hvdcp_opti
 1121    16300K    5320K     990K     480K  /system/bin/dpmd
  773    15000K    5628K     985K     904K  /vendor/bin/hw/vendor.qti.hardware.qdutils_disp@1.0-service-qti
  779    14128K    5664K     977K     904K  /vendor/bin/hw/vendor.qti.hardware.seccam@1.0-service-qti
  747    15276K    5236K     969K     928K  /vendor/bin/hw/android.hardware.usb@1.0-service
  807    18628K    4864K     956K     904K  /vendor/bin/pd-mapper
  791    13740K    5608K     951K     820K  /vendor/bin/hw/vendor.qti.hardware.tui_comm@1.0-service-qti
  971    15584K    4452K     927K     860K  /vendor/bin/adsprpcd
  966    14280K    5288K     921K     860K  /system/vendor/bin/wifilearner
  613    12716K    4448K     918K     872K  /vendor/bin/vndservicemanager
  746    14392K    5144K     916K     876K  /vendor/bin/hw/android.hardware.thermal@1.0-service
  741    14400K    5144K     911K     872K  /vendor/bin/hw/android.hardware.light@2.0-service
  753    13664K    5216K     893K     808K  /vendor/bin/hw/vendor.qti.esepowermanager@1.0-service
  755    14268K    5056K     886K     848K  /vendor/bin/hw/vendor.qti.hardware.alarm@1.0-service
  799    14272K    5196K     885K     844K  /vendor/bin/hw/vendor.qti.power.pasrmanager@1.0-service
  742    14400K    5084K     883K     844K  /vendor/bin/hw/android.hardware.memtrack@1.0-service
  935    18452K    4816K     882K     828K  /vendor/bin/pm-proxy
 1102    15900K    4344K     879K     840K  /system/vendor/bin/loc_launcher
  730    13368K    4512K     867K     748K  /system/bin/healthd
  612    12004K    3900K     855K     812K  /system/bin/servicemanager
 1532  2137004K    3588K     854K     132K  seempd_spa
 1290    14788K    4416K     854K     820K  /system/vendor/bin/ipacm-diag
  615    24380K    4372K     844K     808K  /vendor/bin/sec_nvm
  805    13320K    4088K     829K     804K  /vendor/bin/tftp_server
 1099    15640K    4172K     826K     736K  /vendor/bin/mlid
  998    15620K    4180K     800K     768K  /system/bin/smcinvoked
  804    19180K    4308K     792K     760K  /vendor/bin/rmt_storage
  973    15584K    4176K     786K     724K  /vendor/bin/cdsprpcd
  969    15584K    4196K     782K     716K  /vendor/bin/adsprpcd
  872     9596K    3312K     767K     576K  /system/bin/sh
 4029     9596K    3260K     766K     576K  /system/bin/sh
 1250    11380K    4336K     725K     696K  /vendor/bin/msm_irqbalance
 1326    15996K    4348K     719K     684K  /system/vendor/bin/port-bridge
  729    13004K    4352K     711K     672K  /system/bin/hw/android.hidl.allocator@1.0-service
  614    12820K    4140K     676K     640K  /vendor/bin/spdaemon
 1107    11492K    4160K     662K     632K  /vendor/bin/seemp_healthd
 1156     9896K    3112K     651K     636K  /system/bin/tombstoned
  802    10388K    3652K     616K     592K  /vendor/bin/qrtr-ns
 1094     5088K    2600K     601K     480K  /vendor/bin/ssgqmigd
  825    10452K    3284K     555K     536K  /system/bin/lmkd
 3528    12144K    3256K     534K     516K  /system/bin/dun-server
                           ------   ------  ------
                          1165847K  869196K  TOTAL

 RAM: 5635676K total, 1902208K free, 20072K buffers, 1183188K cached, 2392K shmem, 566800K slab

  网上已有牛人基于Android的procrank源码(\system\extras\libpagemap\)做了一些小的修改,并添加了一个Makefile,这样它就可以在大多数GNU/Linux环境下编译,包括交叉编译以供嵌入式使用。

  代码下载:

git clone  https://github.com/csimmonds/procrank_linux.git

  关于编译和使用的说明请参考 README。

posted on 2019-09-09 15:33  sheldon_blogs  阅读(2876)  评论(0编辑  收藏  举报

导航