Merge "lmkd: Add meminfo logging after each kill for easy troubleshooting"
am: 7bb1ae2d88
Change-Id: Ie54654d0dd35b9549b017a7e2d10b80536e4a3af
This commit is contained in:
commit
e645496ecd
3 changed files with 98 additions and 3 deletions
|
|
@ -20,6 +20,7 @@ cc_binary {
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
logtags: ["event.logtags"],
|
||||||
}
|
}
|
||||||
|
|
||||||
cc_library_static {
|
cc_library_static {
|
||||||
|
|
|
||||||
38
lmkd/event.logtags
Normal file
38
lmkd/event.logtags
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
# The entries in this file map a sparse set of log tag numbers to tag names.
|
||||||
|
# This is installed on the device, in /system/etc, and parsed by logcat.
|
||||||
|
#
|
||||||
|
# Tag numbers are decimal integers, from 0 to 2^31. (Let's leave the
|
||||||
|
# negative values alone for now.)
|
||||||
|
#
|
||||||
|
# Tag names are one or more ASCII letters and numbers or underscores, i.e.
|
||||||
|
# "[A-Z][a-z][0-9]_". Do not include spaces or punctuation (the former
|
||||||
|
# impacts log readability, the latter makes regex searches more annoying).
|
||||||
|
#
|
||||||
|
# Tag numbers and names are separated by whitespace. Blank lines and lines
|
||||||
|
# starting with '#' are ignored.
|
||||||
|
#
|
||||||
|
# Optionally, after the tag names can be put a description for the value(s)
|
||||||
|
# of the tag. Description are in the format
|
||||||
|
# (<name>|data type[|data unit])
|
||||||
|
# Multiple values are separated by commas.
|
||||||
|
#
|
||||||
|
# The data type is a number from the following values:
|
||||||
|
# 1: int
|
||||||
|
# 2: long
|
||||||
|
# 3: string
|
||||||
|
# 4: list
|
||||||
|
#
|
||||||
|
# The data unit is a number taken from the following list:
|
||||||
|
# 1: Number of objects
|
||||||
|
# 2: Number of bytes
|
||||||
|
# 3: Number of milliseconds
|
||||||
|
# 4: Number of allocations
|
||||||
|
# 5: Id
|
||||||
|
# 6: Percent
|
||||||
|
# s: Number of seconds (monotonic time)
|
||||||
|
# Default value for data of type int/long is 2 (bytes).
|
||||||
|
#
|
||||||
|
# TODO: generate ".java" and ".h" files with integer constants from this file.
|
||||||
|
|
||||||
|
# for meminfo logs
|
||||||
|
10195355 meminfo (MemFree|1),(Cached|1),(SwapCached|1),(Buffers|1),(Shmem|1),(Unevictable|1),(SwapFree|1),(ActiveAnon|1),(InactiveAnon|1),(ActiveFile|1),(InactiveFile|1),(SReclaimable|1),(SUnreclaim|1),(KernelStack|1),(PageTables|1),(ION_heap|1),(ION_heap_pool|1),(CmaFree|1)
|
||||||
62
lmkd/lmkd.c
62
lmkd/lmkd.c
|
|
@ -37,6 +37,7 @@
|
||||||
#include <cutils/sockets.h>
|
#include <cutils/sockets.h>
|
||||||
#include <lmkd.h>
|
#include <lmkd.h>
|
||||||
#include <log/log.h>
|
#include <log/log.h>
|
||||||
|
#include <log/log_event_list.h>
|
||||||
|
|
||||||
#ifdef LMKD_LOG_STATS
|
#ifdef LMKD_LOG_STATS
|
||||||
#include "statslog.h"
|
#include "statslog.h"
|
||||||
|
|
@ -72,6 +73,9 @@
|
||||||
#define MEMINFO_PATH "/proc/meminfo"
|
#define MEMINFO_PATH "/proc/meminfo"
|
||||||
#define LINE_MAX 128
|
#define LINE_MAX 128
|
||||||
|
|
||||||
|
/* Android Logger event logtags (see event.logtags) */
|
||||||
|
#define MEMINFO_LOG_TAG 10195355
|
||||||
|
|
||||||
/* gid containing AID_SYSTEM required */
|
/* gid containing AID_SYSTEM required */
|
||||||
#define INKERNEL_MINFREE_PATH "/sys/module/lowmemorykiller/parameters/minfree"
|
#define INKERNEL_MINFREE_PATH "/sys/module/lowmemorykiller/parameters/minfree"
|
||||||
#define INKERNEL_ADJ_PATH "/sys/module/lowmemorykiller/parameters/adj"
|
#define INKERNEL_ADJ_PATH "/sys/module/lowmemorykiller/parameters/adj"
|
||||||
|
|
@ -85,6 +89,8 @@
|
||||||
#define STRINGIFY(x) STRINGIFY_INTERNAL(x)
|
#define STRINGIFY(x) STRINGIFY_INTERNAL(x)
|
||||||
#define STRINGIFY_INTERNAL(x) #x
|
#define STRINGIFY_INTERNAL(x) #x
|
||||||
|
|
||||||
|
#define min(a, b) (((a) < (b)) ? (a) : (b))
|
||||||
|
|
||||||
/* default to old in-kernel interface if no memory pressure events */
|
/* default to old in-kernel interface if no memory pressure events */
|
||||||
static bool use_inkernel_interface = true;
|
static bool use_inkernel_interface = true;
|
||||||
static bool has_inkernel_module;
|
static bool has_inkernel_module;
|
||||||
|
|
@ -120,6 +126,8 @@ static unsigned long kill_timeout_ms;
|
||||||
static bool use_minfree_levels;
|
static bool use_minfree_levels;
|
||||||
static bool per_app_memcg;
|
static bool per_app_memcg;
|
||||||
|
|
||||||
|
static android_log_context ctx;
|
||||||
|
|
||||||
/* data required to handle events */
|
/* data required to handle events */
|
||||||
struct event_handler_info {
|
struct event_handler_info {
|
||||||
int data;
|
int data;
|
||||||
|
|
@ -198,7 +206,17 @@ enum meminfo_field {
|
||||||
MI_SHMEM,
|
MI_SHMEM,
|
||||||
MI_UNEVICTABLE,
|
MI_UNEVICTABLE,
|
||||||
MI_FREE_SWAP,
|
MI_FREE_SWAP,
|
||||||
MI_DIRTY,
|
MI_ACTIVE_ANON,
|
||||||
|
MI_INACTIVE_ANON,
|
||||||
|
MI_ACTIVE_FILE,
|
||||||
|
MI_INACTIVE_FILE,
|
||||||
|
MI_SRECLAIMABLE,
|
||||||
|
MI_SUNRECLAIM,
|
||||||
|
MI_KERNEL_STACK,
|
||||||
|
MI_PAGE_TABLES,
|
||||||
|
MI_ION_HELP,
|
||||||
|
MI_ION_HELP_POOL,
|
||||||
|
MI_CMA_FREE,
|
||||||
MI_FIELD_COUNT
|
MI_FIELD_COUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -210,7 +228,17 @@ static const char* const meminfo_field_names[MI_FIELD_COUNT] = {
|
||||||
"Shmem:",
|
"Shmem:",
|
||||||
"Unevictable:",
|
"Unevictable:",
|
||||||
"SwapFree:",
|
"SwapFree:",
|
||||||
"Dirty:",
|
"Active(anon):",
|
||||||
|
"Inactive(anon):",
|
||||||
|
"Active(file):",
|
||||||
|
"Inactive(file):",
|
||||||
|
"SReclaimable:",
|
||||||
|
"SUnreclaim:",
|
||||||
|
"KernelStack:",
|
||||||
|
"PageTables:",
|
||||||
|
"ION_heap:",
|
||||||
|
"ION_heap_pool:",
|
||||||
|
"CmaFree:",
|
||||||
};
|
};
|
||||||
|
|
||||||
union meminfo {
|
union meminfo {
|
||||||
|
|
@ -222,7 +250,17 @@ union meminfo {
|
||||||
int64_t shmem;
|
int64_t shmem;
|
||||||
int64_t unevictable;
|
int64_t unevictable;
|
||||||
int64_t free_swap;
|
int64_t free_swap;
|
||||||
int64_t dirty;
|
int64_t active_anon;
|
||||||
|
int64_t inactive_anon;
|
||||||
|
int64_t active_file;
|
||||||
|
int64_t inactive_file;
|
||||||
|
int64_t sreclaimable;
|
||||||
|
int64_t sunreclaimable;
|
||||||
|
int64_t kernel_stack;
|
||||||
|
int64_t page_tables;
|
||||||
|
int64_t ion_heap;
|
||||||
|
int64_t ion_heap_pool;
|
||||||
|
int64_t cma_free;
|
||||||
/* fields below are calculated rather than read from the file */
|
/* fields below are calculated rather than read from the file */
|
||||||
int64_t nr_file_pages;
|
int64_t nr_file_pages;
|
||||||
} field;
|
} field;
|
||||||
|
|
@ -915,6 +953,15 @@ static int meminfo_parse(union meminfo *mi) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void meminfo_log(union meminfo *mi) {
|
||||||
|
for (int field_idx = 0; field_idx < MI_FIELD_COUNT; field_idx++) {
|
||||||
|
android_log_write_int32(ctx, (int32_t)min(mi->arr[field_idx] * page_k, INT32_MAX));
|
||||||
|
}
|
||||||
|
|
||||||
|
android_log_write_list(ctx, LOG_ID_EVENTS);
|
||||||
|
android_log_reset(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
static int proc_get_size(int pid) {
|
static int proc_get_size(int pid) {
|
||||||
char path[PATH_MAX];
|
char path[PATH_MAX];
|
||||||
char line[LINE_MAX];
|
char line[LINE_MAX];
|
||||||
|
|
@ -1322,6 +1369,8 @@ do_kill:
|
||||||
if (debug_process_killing) {
|
if (debug_process_killing) {
|
||||||
ALOGI("Nothing to kill");
|
ALOGI("Nothing to kill");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
meminfo_log(&mi);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int pages_freed;
|
int pages_freed;
|
||||||
|
|
@ -1370,6 +1419,9 @@ do_kill:
|
||||||
pages_to_free, pages_freed);
|
pages_to_free, pages_freed);
|
||||||
gettimeofday(&last_report_tm, NULL);
|
gettimeofday(&last_report_tm, NULL);
|
||||||
}
|
}
|
||||||
|
if (pages_freed > 0) {
|
||||||
|
meminfo_log(&mi);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1584,6 +1636,8 @@ int main(int argc __unused, char **argv __unused) {
|
||||||
per_app_memcg =
|
per_app_memcg =
|
||||||
property_get_bool("ro.config.per_app_memcg", low_ram_device);
|
property_get_bool("ro.config.per_app_memcg", low_ram_device);
|
||||||
|
|
||||||
|
ctx = create_android_logger(MEMINFO_LOG_TAG);
|
||||||
|
|
||||||
#ifdef LMKD_LOG_STATS
|
#ifdef LMKD_LOG_STATS
|
||||||
statslog_init(&log_ctx, &enable_stats_log);
|
statslog_init(&log_ctx, &enable_stats_log);
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -1619,6 +1673,8 @@ int main(int argc __unused, char **argv __unused) {
|
||||||
statslog_destroy(&log_ctx);
|
statslog_destroy(&log_ctx);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
android_log_destroy(&ctx);
|
||||||
|
|
||||||
ALOGI("exiting");
|
ALOGI("exiting");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue