Linux學習:使用 procrank 測量系統內存使用狀況

  程序員應該瞭解一個基本問題:個人程序使用了多少內存?這多是一個簡單的問題,可是對於像Linux這樣的虛擬內存操做系統,答案是至關複雜的,由於top和ps給出的數字不能簡單相加。進程中兩個最多見的內存信息指標是虛擬集大小(Vss)和常駐集大小(Rss),能夠在ps和top指令查看到這些參數:

  

  Vss 也叫 VIRT / VSZ,是虛擬內存總量的映射,無論它是否被提交到物理內存。java

  Rss 也叫 RES / RSS,是物理內存總量的映射,只要頁面在本身的區間內被映射過,就算在本身的頭上。例如/lib/x86_64-linux-gnu/libc-2.23.so的某一個頁面被60個進程使用過,那麼本身仍是要算上4K。linux

  Vss顯然被高估了,由於應用程序一般分配它們從不使用的內存。Rss是一個更好的度量方法,但仍比實際值稍大,由於它沒有考慮進程之間共享的內存頁。例如,內存中只有一個C庫駐留程序的副本,被與之關聯的全部進程之間共享,但Rss會屢次佔用它。android

  曾經 Matt Mackall 研究過這個問題,並添加了兩個稱爲惟一集大小(Uss)和比例集大小(Pss)的新度量,並修改了內核以開放計算它們所需的信息,這些信息能夠在/proc/[PID]/smaps中找到。ios

  Pss 是比例集大小(與其餘進程共享的內存量)除以每一個頁面的共享進程數,頁面被多個進程映射過,那麼把使用量平均到你們頭上。libc的這個頁面就只能算在本身頭上4k / 60 = 68Bytes。git

  Uss 是惟一的集合大小,即進程私有且不與任何其餘進程共享的內存大小,頁面只有被本身使用過,纔算到本身頭上。Uss的統計意義在於,若是這個進程被殺掉了,那麼實際上只能釋放這麼多內存,因此Uss是針對某個進程進行內存泄露檢測的最佳數字,由於它顯示的頁面是惟一的,你能夠把它看做是在內存中建立副本時所損耗的內從大小,若是懷疑某個程序有內存泄露就查看這個值是否一直增長。程序員

  通常狀況下,都是:VSS >= RSS >= PSS >= USSgithub

  爲了稍微簡化一下,下面的圖表顯示了三個進程,每一個進程映射到其虛擬地址空間的頁面,而且分別被標記爲A、B或C類:web

  • A = 映射到RAM物理頁的私有內存,包括正在使用的堆和棧的部分。
  • B = 由一個或多個進程映射並共享的內存,例如共享庫中的代碼。
  • C = 被分配但從未被訪問的內存。

  至此,每一個進程所佔用的內存組成以下:app

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

  
 

  計算三個進程的Pss爲:composer

  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。

相關文章
相關標籤/搜索