Fix issue #17948288: Improve accuracy of memory use reporting
We now use Mapped to not double-count cached pages that are mapped in to app processes. Also read in some more values that count towards kernel RAM use, and count buffers as free rather than used RAM. It also looks like the zram accounting is broken -- it was never collecting the total zram reserved space. I need to figure out how I was finding that before. Change-Id: I883f6fc93966774b5c7d2801d1801666dd11ed41
This commit is contained in:
@@ -1093,7 +1093,15 @@ href="{@docRoot}guide/developing/tools/traceview.html">Traceview: A Graphical Lo
|
||||
/** @hide */
|
||||
public static final int MEMINFO_ZRAM_TOTAL = 8;
|
||||
/** @hide */
|
||||
public static final int MEMINFO_COUNT = 9;
|
||||
public static final int MEMINFO_MAPPED = 9;
|
||||
/** @hide */
|
||||
public static final int MEMINFO_VM_ALLOC_USED = 10;
|
||||
/** @hide */
|
||||
public static final int MEMINFO_PAGE_TABLES = 11;
|
||||
/** @hide */
|
||||
public static final int MEMINFO_KERNEL_STACK = 12;
|
||||
/** @hide */
|
||||
public static final int MEMINFO_COUNT = 13;
|
||||
|
||||
/**
|
||||
* Retrieves /proc/meminfo. outSizes is filled with fields
|
||||
|
||||
@@ -34,40 +34,65 @@ public final class MemInfoReader {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Total amount of RAM available to the kernel.
|
||||
*/
|
||||
public long getTotalSize() {
|
||||
return mInfos[Debug.MEMINFO_TOTAL] * 1024;
|
||||
}
|
||||
|
||||
/**
|
||||
* Amount of RAM that is not being used for anything.
|
||||
*/
|
||||
public long getFreeSize() {
|
||||
return mInfos[Debug.MEMINFO_FREE] * 1024;
|
||||
}
|
||||
|
||||
/**
|
||||
* Amount of RAM that the kernel is being used for caches, not counting caches
|
||||
* that are mapped in to processes.
|
||||
*/
|
||||
public long getCachedSize() {
|
||||
return mInfos[Debug.MEMINFO_CACHED] * 1024;
|
||||
return getCachedSizeKb() * 1024;
|
||||
}
|
||||
|
||||
/**
|
||||
* Amount of RAM that is in use by the kernel for actual allocations.
|
||||
*/
|
||||
public long getKernelUsedSize() {
|
||||
return getKernelUsedSizeKb() * 1024;
|
||||
}
|
||||
|
||||
/**
|
||||
* Total amount of RAM available to the kernel.
|
||||
*/
|
||||
public long getTotalSizeKb() {
|
||||
return mInfos[Debug.MEMINFO_TOTAL];
|
||||
}
|
||||
|
||||
/**
|
||||
* Amount of RAM that is not being used for anything.
|
||||
*/
|
||||
public long getFreeSizeKb() {
|
||||
return mInfos[Debug.MEMINFO_FREE];
|
||||
}
|
||||
|
||||
/**
|
||||
* Amount of RAM that the kernel is being used for caches, not counting caches
|
||||
* that are mapped in to processes.
|
||||
*/
|
||||
public long getCachedSizeKb() {
|
||||
return mInfos[Debug.MEMINFO_CACHED];
|
||||
return mInfos[Debug.MEMINFO_BUFFERS]
|
||||
+ mInfos[Debug.MEMINFO_CACHED] - mInfos[Debug.MEMINFO_MAPPED];
|
||||
}
|
||||
|
||||
public long getBuffersSizeKb() {
|
||||
return mInfos[Debug.MEMINFO_BUFFERS];
|
||||
}
|
||||
|
||||
public long getShmemSizeKb() {
|
||||
return mInfos[Debug.MEMINFO_SHMEM];
|
||||
}
|
||||
|
||||
public long getSlabSizeKb() {
|
||||
return mInfos[Debug.MEMINFO_SLAB];
|
||||
/**
|
||||
* Amount of RAM that is in use by the kernel for actual allocations.
|
||||
*/
|
||||
public long getKernelUsedSizeKb() {
|
||||
return mInfos[Debug.MEMINFO_SHMEM] + mInfos[Debug.MEMINFO_SLAB]
|
||||
+ mInfos[Debug.MEMINFO_VM_ALLOC_USED] + mInfos[Debug.MEMINFO_PAGE_TABLES]
|
||||
+ mInfos[Debug.MEMINFO_KERNEL_STACK];
|
||||
}
|
||||
|
||||
public long getSwapTotalSizeKb() {
|
||||
|
||||
@@ -552,6 +552,10 @@ enum {
|
||||
MEMINFO_SWAP_TOTAL,
|
||||
MEMINFO_SWAP_FREE,
|
||||
MEMINFO_ZRAM_TOTAL,
|
||||
MEMINFO_MAPPED,
|
||||
MEMINFO_VMALLOC_USED,
|
||||
MEMINFO_PAGE_TABLES,
|
||||
MEMINFO_KERNEL_STACK,
|
||||
MEMINFO_COUNT
|
||||
};
|
||||
|
||||
@@ -590,6 +594,11 @@ static void android_os_Debug_getMemInfo(JNIEnv *env, jobject clazz, jlongArray o
|
||||
"Slab:",
|
||||
"SwapTotal:",
|
||||
"SwapFree:",
|
||||
"ZRam:",
|
||||
"Mapped:",
|
||||
"VmallocUsed:",
|
||||
"PageTables:",
|
||||
"KernelStack:",
|
||||
NULL
|
||||
};
|
||||
static const int tagsLen[] = {
|
||||
@@ -601,12 +610,17 @@ static void android_os_Debug_getMemInfo(JNIEnv *env, jobject clazz, jlongArray o
|
||||
5,
|
||||
10,
|
||||
9,
|
||||
5,
|
||||
7,
|
||||
12,
|
||||
11,
|
||||
12,
|
||||
0
|
||||
};
|
||||
long mem[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
long mem[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
|
||||
char* p = buffer;
|
||||
while (*p && numFound < 8) {
|
||||
while (*p && numFound < 13) {
|
||||
int i = 0;
|
||||
while (tags[i]) {
|
||||
if (strncmp(p, tags[i], tagsLen[i]) == 0) {
|
||||
|
||||
@@ -1734,8 +1734,13 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
logBuilder.append(" MemInfo: ");
|
||||
logBuilder.append(infos[Debug.MEMINFO_SLAB]).append(" kB slab, ");
|
||||
logBuilder.append(infos[Debug.MEMINFO_SHMEM]).append(" kB shmem, ");
|
||||
logBuilder.append(infos[Debug.MEMINFO_VM_ALLOC_USED]).append(" kB vm alloc, ");
|
||||
logBuilder.append(infos[Debug.MEMINFO_PAGE_TABLES]).append(" kB page tables ");
|
||||
logBuilder.append(infos[Debug.MEMINFO_KERNEL_STACK]).append(" kB kernel stack\n");
|
||||
logBuilder.append(" ");
|
||||
logBuilder.append(infos[Debug.MEMINFO_BUFFERS]).append(" kB buffers, ");
|
||||
logBuilder.append(infos[Debug.MEMINFO_CACHED]).append(" kB cached, ");
|
||||
logBuilder.append(infos[Debug.MEMINFO_MAPPED]).append(" kB mapped, ");
|
||||
logBuilder.append(infos[Debug.MEMINFO_FREE]).append(" kB free\n");
|
||||
if (infos[Debug.MEMINFO_ZRAM_TOTAL] != 0) {
|
||||
logBuilder.append(" ZRAM: ");
|
||||
@@ -1952,9 +1957,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
+ (SystemClock.uptimeMillis()-start) + "ms");
|
||||
mProcessStats.addSysMemUsageLocked(memInfo.getCachedSizeKb(),
|
||||
memInfo.getFreeSizeKb(), memInfo.getZramTotalSizeKb(),
|
||||
memInfo.getBuffersSizeKb()+memInfo.getShmemSizeKb()
|
||||
+memInfo.getSlabSizeKb(),
|
||||
nativeTotalPss);
|
||||
memInfo.getKernelUsedSizeKb(), nativeTotalPss);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14240,8 +14243,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
synchronized (this) {
|
||||
mProcessStats.addSysMemUsageLocked(memInfo.getCachedSizeKb(),
|
||||
memInfo.getFreeSizeKb(), memInfo.getZramTotalSizeKb(),
|
||||
memInfo.getBuffersSizeKb()+memInfo.getShmemSizeKb()+memInfo.getSlabSizeKb(),
|
||||
nativeProcTotalPss);
|
||||
memInfo.getKernelUsedSizeKb(), nativeProcTotalPss);
|
||||
}
|
||||
}
|
||||
if (!brief) {
|
||||
@@ -14280,16 +14282,12 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
}
|
||||
if (!isCompact) {
|
||||
pw.print(" Used RAM: "); pw.print(totalPss - cachedPss
|
||||
+ memInfo.getBuffersSizeKb() + memInfo.getShmemSizeKb()
|
||||
+ memInfo.getSlabSizeKb()); pw.print(" kB (");
|
||||
+ memInfo.getKernelUsedSizeKb()); pw.print(" kB (");
|
||||
pw.print(totalPss - cachedPss); pw.print(" used pss + ");
|
||||
pw.print(memInfo.getBuffersSizeKb()); pw.print(" buffers + ");
|
||||
pw.print(memInfo.getShmemSizeKb()); pw.print(" shmem + ");
|
||||
pw.print(memInfo.getSlabSizeKb()); pw.println(" slab)");
|
||||
pw.print(memInfo.getKernelUsedSizeKb()); pw.print(" kernel)\n");
|
||||
pw.print(" Lost RAM: "); pw.print(memInfo.getTotalSizeKb()
|
||||
- totalPss - memInfo.getFreeSizeKb() - memInfo.getCachedSizeKb()
|
||||
- memInfo.getBuffersSizeKb() - memInfo.getShmemSizeKb()
|
||||
- memInfo.getSlabSizeKb()); pw.println(" kB");
|
||||
- memInfo.getKernelUsedSizeKb()); pw.println(" kB");
|
||||
}
|
||||
if (!brief) {
|
||||
if (memInfo.getZramTotalSizeKb() != 0) {
|
||||
|
||||
Reference in New Issue
Block a user