内存计算
内存映射计算步骤
通过命令“adbshell dmesg > dmesg.txt”收集内核日志,即dmesg日志
通过命令收集meminfo
adb shell cat/proc/meminfo > Meminfo.txt
生成内存映射的说明
下表显示了1GB终端的内存映射示列
非HLOS |
99MB |
Modem(W+G) ADSP Wconnect等 |
HLOS静态 |
25MB |
内核 |
HLOS或android |
900MB |
应用程序+框架 411MB |
可用+缓存 489MB |
内存映射可分为三个主要区域:
n 非HLOS内存
n HLOS-静态内存(包括内核内存、IONCarveout内存,也可以包括Framebuffer内存)
n HLOS或Android内存
遵循以下方法测量或计算上述内存映射的各个组成部分:
1. 捕获终端的启动时间内核日志。启动时间内核消息输出的示例如下:
<6>[ 0.000000] Machine: QualcommTechnologies, Inc. MSM 8916 MTP
<6>[ 0.000000] cma: Foundexternal_image__region@0, memory base 0x0000000086000000, size 8 MiB, limit 0xffffffffffffffff
<6>[ 0.000000] cma: Foundmodem_adsp_region@0, memory base 0x0000000086800000, size 85 MiB, limit 0xffffffffffffffff
<6>[ 0.000000] cma: Foundpheripheral_region@0, memory base0x000000008bd00000, size 6 MiB,limit 0xffffffffffffffff
<6>[ 0.000000] cma: Foundsecure_region@0, memory base 0x0000000000000000, size 109 MiB, limit0xffffffffffffffff
<6>[ 0.000000] cma: Foundvenus_qseecom_region@0, memory base 0x0000000000000000, size 18 MiB, limit0x0000000090000000
<6>[ 0.000000] cma: Foundaudio_region@0, memory base
0x0000000000000000, size 3 MiB, limit0xffffffffffffffff
/proc/meminfo的日志示例显示如下。 ¨ MemTotal − 921600 kB
¨ MemFree − 138728 kB
¨ Buffers − 4616 kB
¨ Cached − 362008 kB
测量非HLOS内存。基于以下日志:
非HLOS内存 = 8 MB + 85 MB + 6 MB = 99 MB
4. 测量HLOS或Android内存。根据/proc/meminfo,作如下计算:
HLOS或Android内存 = MemTotal(来自/proc/meminfo= 900MB)
5. 计算内核内存,内核空间 = 总RAM – 非HLOS内存 – HLOS或Android内存 –(Carveout +Framebuffer,如有)。
= 1024 MB – 99 MB – 900 MB – 0 MB = 25 MB
6. 计算可用内存。
可用内存 = Memfree + Cached(来自/proc/meminfo = 489 MB)
= 138728 kB + 362008 kB ~= 489 MB
7. 计算应用程序+框架,应用程序+框架 = HLOS或Android内存 – 可用内存 = 900 MB – 489 MB =411 MB
n 要获得终端的root访问权限:
adb root
adb shell setenforce 0
n 要获得整体内存占用,使用以下命令:
adb shell cat /proc/meminfo
adb shell /proc/iomem
adb shell procrank
adb shell procrank –C
adb shell cat /proc/zoneinfo
adb shell dumpsys meminfo
adb shell dumpsys SurfaceFlinger
(以相同顺序运行上述命令,由于dumpsys会触发GC,这会导致数据出现变化)
n 使用以下命令获得zram配置的详细情况,并将zram文件夹复制到日志位置:
adb shell cat /proc/swaps
adb pull /sys/block/zram0/ zram
n 使用以下命令获得PPR配置的详细情况(按进程回收)。
adb shell
cat/sys/module/process_reclaim/parameters/enable_process_reclaim
adb shell cat/sys/module/process_reclaim/parameters/pressure_min
adb shell cat/sys/module/process_reclaim/parameters/pressure_max
adb shell cat /sys/module/process_reclaim/parameters/per_swap_size
adb shell cat/sys/module/process_reclaim/parameters/swap_opt_eff
n 如果有多个zram终端(zram1、zram2等),需要获取全部此项信息。要了解KSM节省的空间,使用以下命令集并共享ksm文件夹。
mount –t debugfs none /sys/kernel/debug
adb pull /sys/kernel/mm/ksm/ ksm
n 要获得特定进程的内存占用,使用以下命令:
adb shell procmem
adb shell dumpsys meminfo
adb shell cat/proc/
adb shell dumpsys procstat
n 要了解所有vm设置,使用以下命令:
adb shell cat /proc/sys/vm/*
n 要获得LMK参数,使用以下命令:
adb shell cat/sys/module/lowmemorykiller/parameters/adj
adb shell cat/sys/module/lowmemorykiller/parameters/minfree
n 使用以下命令获得自适应LMK参数的详细信息。
adb shell cat/sys/module/lowmemorykiller/parameters/enable_adaptive_lmk
adb shell cat /sys/module/lowmemorykiller/parameters/vmpressure_file_min
n 要了解内核的缓冲区分配情况,使用以下命令:
nm -t d -l -r --size-sort -S vmlinux | head-50
n 要了解KGSL分配情况,使用以下命令集并共享kgsl文件夹。
mount –t debugfs none /sys/kernel/debug
adb pull /sys/class/kgsl/kgsl/ kgsl
n 共享终端上的build.prop文件:
adb pull /system/build.prop
n 共享终端规格:
RAM size
Display resolution
LCD screen length
某个应用程序的内存占用
每个应用程序的内存消耗中都包含以下部分
n 非缓存内存
n 缓存内存
n KGSL内存
n ION内存
QC提供的所有进程内存数据均使用“dumpsysmeminfo”包含上述全部内容。其他供应商可能不包括KGSL和ION内存。我们基于Google的建议在表达中包括了kgsl和ion,实施在memtrack硬件模块(/system/lib/hw/memtrack.msm8916.so)中,作为解决方案的一部分并对上层开放(例如dumpsys、meminfo等)
生成内存映射的说明
下表显示了1GB终端的内存映射示列
非HLOS |
99MB |
Modem(W+G) ADSP Wconnect等 |
HLOS静态 |
25MB |
内核 |
HLOS或android |
900MB |
应用程序+框架 411MB |
可用+缓存 489MB |
内存映射可分为三个主要区域:
n 非HLOS内存
n HLOS-静态内存(包括内核内存、IONCarveout内存,也可以包括Framebuffer内存)
n HLOS或Android内存
遵循以下方法测量或计算上述内存映射的各个组成部分:
1. 捕获终端的启动时间内核日志。启动时间内核消息输出的示例如下:
<6>[ 0.000000] Machine: QualcommTechnologies, Inc. MSM 8916 MTP
<6>[ 0.000000] cma: Foundexternal_image__region@0, memory base 0x0000000086000000, size 8 MiB, limit 0xffffffffffffffff
<6>[ 0.000000] cma: Foundmodem_adsp_region@0, memory base 0x0000000086800000, size 85 MiB, limit 0xffffffffffffffff
<6>[ 0.000000] cma: Foundpheripheral_region@0, memory base0x000000008bd00000, size 6 MiB,limit 0xffffffffffffffff
<6>[ 0.000000] cma: Foundsecure_region@0, memory base 0x0000000000000000, size 109 MiB, limit0xffffffffffffffff
<6>[ 0.000000] cma: Foundvenus_qseecom_region@0, memory base 0x0000000000000000, size 18 MiB, limit0x0000000090000000
<6>[ 0.000000] cma: Foundaudio_region@0, memory base
0x0000000000000000, size 3 MiB, limit0xffffffffffffffff
/proc/meminfo的日志示例显示如下。 ¨ MemTotal − 921600 kB
¨ MemFree − 138728 kB
¨ Buffers − 4616 kB
¨ Cached − 362008 kB
测量非HLOS内存。基于以下日志:
非HLOS内存 = 8 MB + 85 MB + 6 MB = 99 MB
4. 测量HLOS或Android内存。根据/proc/meminfo,作如下计算:
HLOS或Android内存 = MemTotal(来自/proc/meminfo= 900MB)
5. 计算内核内存,内核空间 = 总RAM – 非HLOS内存 – HLOS或Android内存 –(Carveout +Framebuffer,如有)。
= 1024 MB – 99 MB – 900 MB – 0 MB = 25 MB
6. 计算可用内存。
可用内存 = Memfree + Cached(来自/proc/meminfo = 489 MB)
= 138728 kB + 362008 kB ~= 489 MB
7. 计算应用程序+框架,应用程序+框架 = HLOS或Android内存 – 可用内存 = 900 MB – 489 MB =411 MB
n 要获得终端的root访问权限:
adb root
adb shell setenforce 0
n 要获得整体内存占用,使用以下命令:
adb shell cat /proc/meminfo
adb shell /proc/iomem
adb shell procrank
adb shell procrank –C
adb shell cat /proc/zoneinfo
adb shell dumpsys meminfo
adb shell dumpsys SurfaceFlinger
(以相同顺序运行上述命令,由于dumpsys会触发GC,这会导致数据出现变化)
n 使用以下命令获得zram配置的详细情况,并将zram文件夹复制到日志位置:
adb shell cat /proc/swaps
adb pull /sys/block/zram0/ zram
n 使用以下命令获得PPR配置的详细情况(按进程回收)。
adb shell
cat/sys/module/process_reclaim/parameters/enable_process_reclaim
adb shell cat/sys/module/process_reclaim/parameters/pressure_min
adb shell cat/sys/module/process_reclaim/parameters/pressure_max
adb shell cat /sys/module/process_reclaim/parameters/per_swap_size
adb shell cat/sys/module/process_reclaim/parameters/swap_opt_eff
n 如果有多个zram终端(zram1、zram2等),需要获取全部此项信息。要了解KSM节省的空间,使用以下命令集并共享ksm文件夹。
mount –t debugfs none /sys/kernel/debug
adb pull /sys/kernel/mm/ksm/ ksm
n 要获得特定进程的内存占用,使用以下命令:
adb shell procmem
adb shell dumpsys meminfo
adb shell cat/proc/
adb shell dumpsys procstat
n 要了解所有vm设置,使用以下命令:
adb shell cat /proc/sys/vm/*
n 要获得LMK参数,使用以下命令:
adb shell cat/sys/module/lowmemorykiller/parameters/adj
adb shell cat/sys/module/lowmemorykiller/parameters/minfree
n 使用以下命令获得自适应LMK参数的详细信息。
adb shell cat/sys/module/lowmemorykiller/parameters/enable_adaptive_lmk
adb shell cat /sys/module/lowmemorykiller/parameters/vmpressure_file_min
n 要了解内核的缓冲区分配情况,使用以下命令:
nm -t d -l -r --size-sort -S vmlinux | head-50
n 要了解KGSL分配情况,使用以下命令集并共享kgsl文件夹。
mount –t debugfs none /sys/kernel/debug
adb pull /sys/class/kgsl/kgsl/ kgsl
n 共享终端上的build.prop文件:
adb pull /system/build.prop
n 共享终端规格:
RAM size
Display resolution
LCD screen length
某个应用程序的内存占用
每个应用程序的内存消耗中都包含以下部分
n 非缓存内存
n 缓存内存
n KGSL内存
n ION内存
QC提供的所有进程内存数据均使用“dumpsysmeminfo”包含上述全部内容。其他供应商可能不包括KGSL和ION内存。我们基于Google的建议在表达中包括了kgsl和ion,实施在memtrack硬件模块(/system/lib/hw/memtrack.msm8916.so)中,作为解决方案的一部分并对上层开放(例如dumpsys、meminfo等)