Graphics内存计算

dumpsys meminfo详情

dumpsys meminfo surfaceflinger

Applications Memory Usage (in Kilobytes):

Uptime: 14170420 Realtime: 14170420

Pss Private Private SwapPss Heap Heap Heap

Total Dirty Clean Dirty Size Alloc Free

------ ------ ------ ------ ------ ------ ------

Native Heap 6764 6764 0 0 0 0 0

Dalvik Heap 0 0 0 0 0 0 0

Stack 60 60 0 12

Ashmem 60 0 0 0

Gfx dev 3324 3324 0 0

Other dev 17 0 16 0

.so mmap 10102 2184 3244 0

Other mmap 44 8 24 28

EGL mtrack 97608 97608 0 0

Unknown 832 820 12 116

TOTAL 118967 110768 3296 156 0 0 0

App Summary

Pss(KB)

------

Java Heap: 0

Native Heap: 6764

Code: 5428

Stack: 60

Graphics: 100932

Private Other: 880

System: 4903
cat /sys/class/kgsl/kgsl/proc/14708/gpumem_mapped

3403776

at /sys/class/kgsl/kgsl/proc/14708/imported_mem

99950592

Graphics= EGL mtrack + Gfx dev,EGL mtrack主要是SurfaceView和TextureView的总和,Gfx dev是驱动反馈的GPU内存,主要是GL纹理大小的总和

获取流程图

 

Gfx dev

Gfx dev的值是从/sys/class/kgsl/kgsl/proc/pid/gpumem_mapped下读取的,这里主要为/dev/kgsl-3d0占用的空间,gpu使用的内存

 cat /proc/14708/smaps | grep kgsl

7ffd00000-7ffd20000 rw-s 00143000 00:11 28946 /dev/kgsl-3d0

7ffd26000-7ffd28000 rw-s 00139000 00:11 28946 /dev/kgsl-3d0

7ffd28000-7ffd2c000 rw-s 00142000 00:11 28946 /dev/kgsl-3d0

7ffd2c000-7ffd30000 rw-s 00141000 00:11 28946 /dev/kgsl-3d0

7ffd30000-7ffd70000 rw-s 00140000 00:11 28946 /dev/kgsl-3d0

7ffd70000-7ffdb0000 rw-s 0013f000 00:11 28946 /dev/kgsl-3d0

7ffdb0000-7ffe70000 rw-s 0013e000 00:11 28946 /dev/kgsl-3d0

7ffe70000-7ffe90000 rw-s 0013d000 00:11 28946 /dev/kgsl-3d0

7ffe90000-7ffeb0000 rw-s 0013b000 00:11 28946 /dev/kgsl-3d0

7ffeb1000-7ffeb3000 rw-s 00149000 00:11 28946 /dev/kgsl-3d0

......

smaps中所有kgsl-3d0内存加起来等于gpumem_mapped中读到的内存

EGL mtrack

EGL mTrack 主要是APP eglWindowSurface,

包括normal HWUI based app windowsurface, SurfaceView, TextureView.

这部分内存是从SurfaceFlinger 分配的,可以跟 dumpsys SurfaceFlingher 的 Alloated buffers 可以对应上

static ssize_t

imported_mem_show(struct kgsl_process_private *priv,

int type, char *buf)

{

struct kgsl_mem_entry *entry;

uint64_t imported_mem = 0;

int id = 0;

spin_lock(&priv->mem_lock);

for (entry = idr_get_next(&priv->mem_idr, &id); entry;

id++, entry = idr_get_next(&priv->mem_idr, &id)) {

int egl_surface_count = 0, egl_image_count = 0;

struct kgsl_memdesc *m;

if (kgsl_mem_entry_get(entry) == 0)

continue;

spin_unlock(&priv->mem_lock);

m = &entry->memdesc;

// 如果是ION内存

if (kgsl_memdesc_usermem_type(m) == KGSL_MEM_ENTRY_ION) {

kgsl_get_egl_counts(entry, &egl_surface_count,

&egl_image_count);

// 如果是egl_surface

if (kgsl_memdesc_get_memtype(m) ==

KGSL_MEMTYPE_EGL_SURFACE)

imported_mem += m->size;

else if (egl_surface_count == 0) {

uint64_t size = m->size;

// 如果在多个进程中使用那么计算内存时会是1/N

do_div(size, (egl_image_count ?

egl_image_count : 1));

imported_mem += size;

}

}

kgsl_mem_entry_put(entry);

spin_lock(&priv->mem_lock);

}

spin_unlock(&priv->mem_lock);

return scnprintf(buf, PAGE_SIZE, "%llu\n", imported_mem);

}

EGL mtrack和surfaceflinger中Allocated buffers的关系

Allocated buffers:

0x744340ffe0: 32400.00 KiB | 3840 (3840) x 2160 | 1 | 1 | 0x1a00 | FramebufferSurface

0x7443410050: 32400.00 KiB | 3840 (3840) x 2160 | 1 | 1 | 0x1a00 | FramebufferSurface

0x74434100c0: 32400.00 KiB | 3840 (3840) x 2160 | 1 | 1 | 0x1a00 | FramebufferSurface

0x7443410fa0: 16.00 KiB | 64 ( 64) x 64 | 1 | 1 | 0x333 | screenshot

0x7443411be0: 8100.00 KiB | 1920 (1920) x 1080 | 1 | 1 | 0x10000900 | com.konka.livelauncher/com.konka.livelauncher.TrueLauncher#0

0x7443411cc0: 8100.00 KiB | 1920 (1920) x 1080 | 1 | 1 | 0x10000900 | com.konka.livelauncher/com.konka.livelauncher.TrueLauncher#0

0x74434122e0: 8100.00 KiB | 1920 (1920) x 1080 | 1 | 1 | 0x10000900 | global_recents#0

0x74434129e0: 8100.00 KiB | 1920 (1920) x 1080 | 1 | 1 | 0x10000900 | com.konka.livelauncher/com.konka.livelauncher.TrueLauncher#0

Total allocated (estimate): 129616.00 KB

从imported_mem_show中的计算我们可以知道,如果块buff和其多个进程共用那么计算进程EGL mtrack内存的时候就是1/N,没有共用的情况下就算到单个进程的EGL mtrack中

从Allocated buffers中我们可以看出surfaceflinger中FramebufferSurface的大小为32400*3=97200

但是EGL mtrack=97608,这两个值有点细微的差别,加了点日志从kgsl_setup_dma_buf中打印出来每块内存实际为值:33316864/1024=32536KB

surfaceflinger ] PZC kgsl_setup_dma_buf1 size = 33316864

实际值32536KB比Allocated buffers中的32400KB稍微大了一点,这里可能是为了内存对齐,导致了实际内存偏大了一点点

EGL mtrack中的内存是能和Allocated buffers中对应上的

 


版权声明:本文为aa787282301原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。