From: Maxim Kokryashkin via Tarantool-patches <tarantool-patches@dev.tarantool.org> To: tarantool-patches@dev.tarantool.org, skaplun@tarantool.org, sergeyb@tarantool.org Subject: [Tarantool-patches] [PATCH luajit 2/2] profilers: purge generation mechanism Date: Mon, 28 Aug 2023 18:23:36 +0300 [thread overview] Message-ID: <c5778a46c50b2b7a97486c966402369879b4a6f3.1693236068.git.m.kokryashkin@tarantool.org> (raw) In-Reply-To: <cover.1693236068.git.m.kokryashkin@tarantool.org> Since both of the profiler parsers are now processing the events in a stream-like fashion, the generation mechanism is excessive and can be purged. This results in a significant memory consumption drop, especially for the AVL-tree part. Follows up tarantool/tarantool#8700 --- .../gh-5813-resolving-of-c-symbols.test.lua | 7 ++-- tools/memprof/parse.lua | 2 +- tools/sysprof/parse.lua | 9 ++--- tools/utils/avl.lua | 4 +-- tools/utils/symtab.lua | 33 +++++++------------ 5 files changed, 19 insertions(+), 36 deletions(-) diff --git a/test/tarantool-tests/gh-5813-resolving-of-c-symbols.test.lua b/test/tarantool-tests/gh-5813-resolving-of-c-symbols.test.lua index 30b8a3ca..1581ee4b 100644 --- a/test/tarantool-tests/gh-5813-resolving-of-c-symbols.test.lua +++ b/test/tarantool-tests/gh-5813-resolving-of-c-symbols.test.lua @@ -24,12 +24,9 @@ local TMP_BINFILE = profilename("memprofdata.tmp.bin") local function tree_contains(node, name) if node == nil then return false + elseif node.value.name == name then + return true else - for i = 1, #node.value do - if node.value[i].name == name then - return true - end - end return tree_contains(node.left, name) or tree_contains(node.right, name) end end diff --git a/tools/memprof/parse.lua b/tools/memprof/parse.lua index 1b6eceb4..6fd7451b 100644 --- a/tools/memprof/parse.lua +++ b/tools/memprof/parse.lua @@ -78,7 +78,7 @@ local function parse_location(reader, asource, symbols) else error("Unknown asource "..asource) end - local loc = symtab.loc(symbols, args) + local loc = symtab.loc(args) return symtab.id(loc), symtab.demangle(symbols, loc) end diff --git a/tools/sysprof/parse.lua b/tools/sysprof/parse.lua index 451edecb..bb1cb02c 100755 --- a/tools/sysprof/parse.lua +++ b/tools/sysprof/parse.lua @@ -59,7 +59,7 @@ end local function parse_lfunc(reader, symbols) local addr = reader:read_uleb128() local line = reader:read_uleb128() - local loc = symtab.loc(symbols, { addr = addr, line = line }) + local loc = symtab.loc{ addr = addr, line = line } loc.type = FRAME.LFUNC return symtab.demangle(symbols, loc) end @@ -71,7 +71,7 @@ end local function parse_cfunc(reader, symbols) local addr = reader:read_uleb128() - local loc = symtab.loc(symbols, { addr = addr }) + local loc = symtab.loc{ addr = addr } loc.type = FRAME.CFUNC return symtab.demangle(symbols, loc) end @@ -99,7 +99,7 @@ local function parse_host_callchain(reader, event, symbols) local addr = reader:read_uleb128() while addr ~= 0 do - local loc = symtab.loc(symbols, { addr = addr }) + local loc = symtab.loc{ addr = addr } table.insert(event.host.callchain, 1, symtab.demangle(symbols, loc)) addr = reader:read_uleb128() end @@ -113,14 +113,11 @@ local function parse_trace_callchain(reader, event, symbols) loc.addr = reader:read_uleb128() loc.line = reader:read_uleb128() - local gen = symtab.loc(symbols, loc).gen local name_lua = symtab.demangle(symbols, { addr = loc.addr, traceno = loc.traceno, - gen = gen }) event.lua.trace = loc - event.lua.trace.gen = gen event.lua.trace.name = name_lua end diff --git a/tools/utils/avl.lua b/tools/utils/avl.lua index d5baa534..81ef9265 100644 --- a/tools/utils/avl.lua +++ b/tools/utils/avl.lua @@ -78,7 +78,7 @@ end function M.insert(node, key, value) assert(key, "Key can't be nil") if node == nil then - return create_node(key, { value }) + return create_node(key, value) end if key < node.key then @@ -86,7 +86,7 @@ function M.insert(node, key, value) elseif key > node.key then node.right = M.insert(node.right, key, value) else - table.insert(node.value, value) + node.value = value end update_height(node) diff --git a/tools/utils/symtab.lua b/tools/utils/symtab.lua index c26a9e8c..2afd2fd1 100644 --- a/tools/utils/symtab.lua +++ b/tools/utils/symtab.lua @@ -22,22 +22,13 @@ local SYMTAB_TRACE = 2 local M = {} -function M.loc(symtab, args) +function M.loc(args) local loc = { addr = args.addr or 0, line = args.line or 0, traceno = args.traceno or 0, } - if loc.traceno ~= 0 and symtab.trace[loc.traceno] then - loc.gen = #symtab.trace[loc.traceno] - elseif symtab.lfunc[loc.addr] then - loc.gen = #symtab.lfunc[loc.addr] - else - local _, csym = avl.floor(symtab.cfunc, loc.addr) - loc.gen = csym and #csym or 1 - end - return loc end @@ -56,10 +47,10 @@ function M.parse_sym_lfunc(reader, symtab) ) end - table.insert(symtab.lfunc[sym_addr], { + symtab.lfunc[sym_addr] = { source = sym_chunk, linedefined = sym_line, - }) + } end function M.parse_sym_trace(reader, symtab) @@ -69,9 +60,9 @@ function M.parse_sym_trace(reader, symtab) symtab.trace[traceno] = symtab.trace[traceno] or {} - table.insert(symtab.trace[traceno], { - start = M.loc(symtab, { addr = sym_addr, line = sym_line }) - }) + symtab.trace[traceno] = { + start = M.loc{ addr = sym_addr, line = sym_line } + } end -- Parse a single entry in a symtab: .so library @@ -136,7 +127,7 @@ end function M.id(loc) return string_format( - "f%#xl%dt%dg%d", loc.addr, loc.line, loc.traceno, loc.gen + "f%#xl%dt%dg", loc.addr, loc.line, loc.traceno ) end @@ -146,8 +137,7 @@ local function demangle_trace(symtab, loc) assert(traceno ~= 0, "Location is a trace") local trace_str = string_format("TRACE [%d]", traceno) - local gens = symtab.trace[traceno] - local trace = gens and gens[loc.gen] + local trace = symtab.trace[traceno] if trace then assert(trace.start.traceno == 0, "Trace start is not a trace") @@ -162,21 +152,20 @@ function M.demangle(symtab, loc) end local addr = loc.addr - local gen = loc.gen if addr == 0 then return "INTERNAL" end - if symtab.lfunc[addr] and symtab.lfunc[addr][gen] then - local source = symtab.lfunc[addr][gen].source + if symtab.lfunc[addr] then + local source = symtab.lfunc[addr].source return string_format("%s:%d", symtab.alias[source] or source, loc.line) end local key, value = avl.floor(symtab.cfunc, addr) if key then - return string_format("%s:%#x", value[gen].name, key) + return string_format("%s:%#x", value.name, key) end return string_format("CFUNC %#x", addr) -- 2.41.0
next prev parent reply other threads:[~2023-08-28 15:24 UTC|newest] Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-08-28 15:23 [Tarantool-patches] [PATCH luajit 0/2] profilers: purge generations Maxim Kokryashkin via Tarantool-patches 2023-08-28 15:23 ` [Tarantool-patches] [PATCH luajit 1/2] memprof: refactor symbol resolution Maxim Kokryashkin via Tarantool-patches 2023-09-03 10:14 ` Sergey Kaplun via Tarantool-patches 2023-09-04 5:44 ` Maxim Kokryashkin via Tarantool-patches 2023-09-05 11:47 ` Sergey Bronnikov via Tarantool-patches 2023-09-08 11:04 ` Maxim Kokryashkin via Tarantool-patches 2023-10-06 14:52 ` Sergey Bronnikov via Tarantool-patches 2023-08-28 15:23 ` Maxim Kokryashkin via Tarantool-patches [this message] 2023-09-03 10:21 ` [Tarantool-patches] [PATCH luajit 2/2] profilers: purge generation mechanism Sergey Kaplun via Tarantool-patches 2023-09-04 5:47 ` Maxim Kokryashkin via Tarantool-patches 2023-09-05 11:53 ` Sergey Bronnikov via Tarantool-patches 2023-09-12 10:26 ` Maxim Kokryashkin via Tarantool-patches 2023-09-14 9:47 ` Sergey Bronnikov via Tarantool-patches 2023-09-18 9:18 ` Maxim Kokryashkin via Tarantool-patches 2023-10-06 14:43 ` Sergey Bronnikov via Tarantool-patches 2023-10-06 14:45 ` Sergey Bronnikov via Tarantool-patches 2023-10-06 14:40 ` Sergey Bronnikov via Tarantool-patches 2023-10-06 14:52 ` Sergey Bronnikov via Tarantool-patches 2023-11-13 18:48 ` Igor Munkin via Tarantool-patches 2023-11-23 6:32 ` [Tarantool-patches] [PATCH luajit 0/2] profilers: purge generations Igor Munkin via Tarantool-patches
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=c5778a46c50b2b7a97486c966402369879b4a6f3.1693236068.git.m.kokryashkin@tarantool.org \ --to=tarantool-patches@dev.tarantool.org \ --cc=max.kokryashkin@gmail.com \ --cc=sergeyb@tarantool.org \ --cc=skaplun@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH luajit 2/2] profilers: purge generation mechanism' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox