From d3104fb10aec2fce0d88373a95961b15b0495523 Mon Sep 17 00:00:00 2001 From: fx Date: Wed, 22 Jul 2020 18:26:00 +0800 Subject: [PATCH] stat: add mem stat for jemalloc 1, add opts arg for mallctl,dumpinfo 2, collect jemalloc.mem info 3, add debug_console cmd: jmem --- lualib-src/lua-memory.c | 35 ++++++++++++++++++++++++++++++++++- service/debug_console.lua | 10 ++++++++++ skynet-src/malloc_hook.c | 6 +++--- skynet-src/malloc_hook.h | 2 +- 4 files changed, 48 insertions(+), 5 deletions(-) diff --git a/lualib-src/lua-memory.c b/lualib-src/lua-memory.c index b9b07a611..2f77a97d7 100644 --- a/lualib-src/lua-memory.c +++ b/lualib-src/lua-memory.c @@ -23,11 +23,42 @@ lblock(lua_State *L) { static int ldumpinfo(lua_State *L) { - memory_info_dump(); + const char *opts = NULL; + if (lua_isstring(L, 1)) { + opts = luaL_checkstring(L,1); + } + memory_info_dump(opts); return 0; } +static int +ljestat(lua_State *L) { + static const char* names[] = { + "stats.allocated", + "stats.resident", + "stats.retained", + "stats.mapped", + "stats.active" }; + static size_t flush = 1; + mallctl_int64("epoch", &flush); // refresh je.stats.cache + lua_newtable(L); + int i; + for (i = 0; i < (sizeof(names)/sizeof(names[0])); i++) { + lua_pushstring(L, names[i]); + lua_pushinteger(L, (lua_Integer) mallctl_int64(names[i], NULL)); + lua_settable(L, -3); + } + return 1; +} + +static int +lmallctl(lua_State *L) { + const char *name = luaL_checkstring(L,1); + lua_pushinteger(L, (lua_Integer) mallctl_int64(name, NULL)); + return 1; +} + static int ldump(lua_State *L) { dump_c_mem(); @@ -69,6 +100,8 @@ luaopen_skynet_memory(lua_State *L) { { "total", ltotal }, { "block", lblock }, { "dumpinfo", ldumpinfo }, + { "jestat", ljestat }, + { "mallctl", lmallctl }, { "dump", ldump }, { "info", dump_mem_lua }, { "current", lcurrent }, diff --git a/service/debug_console.lua b/service/debug_console.lua index 07572bbbf..35c4f1d08 100644 --- a/service/debug_console.lua +++ b/service/debug_console.lua @@ -156,6 +156,7 @@ function COMMAND.help() debug = "debug address : debug a lua service", signal = "signal address sig", cmem = "Show C memory info", + jmem = "Show jemalloc mem stats", ping = "ping address", call = "call address ...", trace = "trace address [proto] [on|off]", @@ -342,6 +343,15 @@ function COMMAND.cmem() return tmp end +function COMMAND.jmem() + local info = memory.jestat() + local tmp = {} + for k,v in pairs(info) do + tmp[k] = string.format("%11d %8.2f Mb", v, v/1048576) + end + return tmp +end + function COMMAND.ping(address) address = adjust_address(address) local ti = skynet.now() diff --git a/skynet-src/malloc_hook.c b/skynet-src/malloc_hook.c index 150c2cc61..a3fed30ec 100644 --- a/skynet-src/malloc_hook.c +++ b/skynet-src/malloc_hook.c @@ -127,8 +127,8 @@ static void malloc_oom(size_t size) { } void -memory_info_dump(void) { - je_malloc_stats_print(0,0,0); +memory_info_dump(const char* opts) { + je_malloc_stats_print(0,0, opts); } bool @@ -241,7 +241,7 @@ skynet_posix_memalign(void **memptr, size_t alignment, size_t size) { #define raw_free free void -memory_info_dump(void) { +memory_info_dump(const char* opts) { skynet_error(NULL, "No jemalloc"); } diff --git a/skynet-src/malloc_hook.h b/skynet-src/malloc_hook.h index 04f522ac7..ae95b9a5e 100644 --- a/skynet-src/malloc_hook.h +++ b/skynet-src/malloc_hook.h @@ -7,7 +7,7 @@ extern size_t malloc_used_memory(void); extern size_t malloc_memory_block(void); -extern void memory_info_dump(void); +extern void memory_info_dump(const char *opts); extern size_t mallctl_int64(const char* name, size_t* newval); extern int mallctl_opt(const char* name, int* newval); extern bool mallctl_bool(const char* name, bool* newval);