Tarantool development patches archive
 help / color / mirror / Atom feed
From: Igor Munkin <imun@tarantool.org>
To: Sergey Kaplun <skaplun@tarantool.org>
Cc: tarantool-patches@dev.tarantool.org
Subject: Re: [Tarantool-patches] [RFC v4] rfc: luajit metrics
Date: Thu, 8 Oct 2020 20:25:12 +0300	[thread overview]
Message-ID: <20201008172512.GU18920@tarantool.org> (raw)
In-Reply-To: <20201005063029.31737-1-skaplun@tarantool.org>

Sergey,

Thanks for the updates! Considering the changes in the follow-up reply,
there are still several comments below.

On 05.10.20, Sergey Kaplun wrote:
> Part of #5187
> ---
> 
> This patch adds RFC to LuaJIT metrics interfaces. Nevertheless name
> `misc` for builtin library is not good and should be discussed, because
> tons of user modules can use that name for their own libraries.
> 
> Branch: https://github.com/tarantool/tarantool/tree/skaplun/5187-luajit-metrics
> Issue: https://github.com/tarantool/tarantool/issues/5187
> 
> Changes in v2:
> - Fixed typos
> - Made comments more verbose
> - Avoided flushing any of metrics after each call of luaM_metrics()
> Changes in v3:
> - Added colors count metrics description
> - Added description about how metrics are collected
> - Added benchmarks
> Changes in v3:
> - Removed colors count metrics
> - Added code block language
> - Added how to use section

Minor: ChangeLog is misordered (the latest changes are the first entry).

> 
>  doc/rfc/5187-luajit-metrics.md | 299 +++++++++++++++++++++++++++++++++
>  1 file changed, 299 insertions(+)
>  create mode 100644 doc/rfc/5187-luajit-metrics.md
> 
> diff --git a/doc/rfc/5187-luajit-metrics.md b/doc/rfc/5187-luajit-metrics.md
> new file mode 100644
> index 000000000..02f5b559f
> --- /dev/null
> +++ b/doc/rfc/5187-luajit-metrics.md
> @@ -0,0 +1,299 @@

<snipped>

> +Couple of words about how metrics are collected:
> +- `strhash_*` -- whenever existing string is returned after attempt to
> +  create new string there is incremented `strhash_hit` counter, if new string
> +  created then `strhash_miss` is incremented instead.

Minor: I propose to reword it the way similar you've updated it in the
luam_Metrics comments.

> +- `gc_*num`, `jit_trace_num` -- corresponding counter incremented whenever new

Typo: s/whenever new/whenever a new/.

> +  object is allocated. When object become garbage collected its counter is

Typo: s/become garbage collected/is collected by GC/.

> +  decremented.
> +- `gc_total`, `gc_allocated`, `gc_freed` -- any time when allocation function
> +  is called `gc_allocated` and/or `gc_freed` is increased and `gc_total`
> +  increase when memory is allocated or reallocated, decrease when memory is

Typo: s/increase/is increased/.
Typo: s/decrease/is decreased/.

> +  freed.
> +- `gc_steps_*` -- corresponding counter increments whenever Garbage Collector

Typo: s/increments/is incremented/.

> +  starts to execute 1 step of garbage collection.

Minor: I propose s/1/an incremental/.

> +- `jit_snap_restore` -- whenever JIT machine exits from the trace and restores
> +  interpreter state `jit_snap_restore` counter is incremented.
> +- `jit_trace_abort` -- whenever JIT compiler can't record the trace in case NYI
> +  BC this counter is incremented.

Minor: NYI relates also to builtins, not only to bytecodes.

> +- `jit_mcode_size` -- whenever new MCode area is allocated `jit_mcode_size` is
> +  increased at corresponding size in bytes. Sets to 0 when all mcode area is
> +  freed.

How does it change, when a trace is collected as a result of its flush?

> +
> +All metrics are collected throughout the platform uptime. These metrics
> +increase monotonically and can overflow:
> +  - `strhash_hit`
> +  - `strhash_miss`
> +  - `gc_freed`
> +  - `gc_allocated`,

Typo: Excess comma.

> +  - `gc_steps_pause`
> +  - `gc_steps_propagate`
> +  - `gc_steps_atomic`
> +  - `gc_steps_sweepstring`
> +  - `gc_steps_sweep`
> +  - `gc_steps_finalize`
> +  - `jit_snap_restore`
> +  - `jit_trace_abort`

<snipped>

> +## How to use
> +
> +This section describes small example of metrics usage.
> +
> +For example amount of `strhash_misses` can be shown for tracking of new string
> +objects allocations. For example if we add code like:
> +```lua
> +local function sharded_storage_func(storage_name, func_name)
> +    return 'sharded_storage.storages.' .. storage_name .. '.' .. func_name
> +end
> +```
> +increase in slope curve of `strhash_misses` means, that after your changes
> +there are more new strings allocating at runtime. Of course slope curve of
> +`strhash_misses` _should_ be less than slope curve of `strhash_hits`. If it
> +is not, you should refactor your code.

Minor: I guess it's not a good idea to suggest 'code refactoring'. This
section is good to describe the values being observed, so the first part
about tilt angle is enough.

> +
> +Slope curves of `gc_freed` and `gc_allocated` can be used for analysis of GC
> +pressure of your application (less is better).
> +
> +Also we can check some hacky optimization with these metrics. For example let's
> +assume that we have this code snippet:
> +```lua
> +local old_metrics = misc.getmetrics()
> +local t = {}
> +for i = 1, 513 do
> +    t[i] = i
> +end
> +local new_metrics = misc.getmetrics()
> +local diff =  new_metrics.gc_allocated - old_metrics.gc_allocated
> +```
> +`diff` equals to 18879 after running of this chunk.
> +
> +But if we change table initialization to
> +```lua
> +local table_new = require "table.new"
> +local old_metrics = misc.getmetrics()
> +local t = table_new(513,0)
> +for i = 1, 513 do
> +    t[i] = i
> +end
> +local new_metrics = misc.getmetrics()
> +local diff =  new_metrics.gc_allocated - old_metrics.gc_allocated
> +```
> +`diff` shows us only 5895.
> +
> +Slope curves of `gc_steps_*` can be used for tracking of GC pressure too. For
> +long time observations you will see periodic increment for `gc_steps_*` metrics
> +-- for example longer period of `gc_steps_atomic` increment is better. Also
> +additional amount of `gc_steps_propagate` in one period can be used to
> +indirectly estimate amount of objects.

These values also correlate with the <stepmul> value. The amount of
incremental steps can grow, but one step can process a small amount of
GCobjects. So these metrics should be considered together with GC setup.

> +
> +Amount of `gc_*num` is useful for control of memory leaks -- totally amount of

Typo: s/totally/total/.

> +these objects should not growth nonstop (you can also track `gc_total` for
> +this).  Also `jit_mcode_size` can be used for tracking amount of allocated

Typo: double space prior to "Also".

> +memory for traces machine code.
> +
> +Slope curves of `jit_trace_abort` shows how many times trace hasn't been
> +compiled when the attempt was made (less is better).
> +
> +Amount of `gc_trace_num` is shown how much traces was generated (_usually_
> +more is better).
> +
> +And the last one -- `gc_snap_restores` can be used for estimation when LuaJIT
> +is stop trace execution. If slope curves of this metric growth after changing
> +old code it can mean performance degradation.
> +
> +Assumes that we have code like this:
> +```lua
> +local function foo(i)
> +    return i <= 5 and i or tostring(i)
> +end
> +-- minstitch option needs to emulate nonstitching behaviour
> +jit.opt.start(0, "hotloop=2", "hotexit=2", "minstitch=15")
> +
> +local sum = 0
> +local old_metrics = misc.getmetrics()
> +for i = 1, 10 do
> +    sum = sum + foo(i)
> +end
> +local new_metrics = misc.getmetrics()
> +local diff = new_metrics.jit_snap_restore - old_metrics.jit_snap_restore
> +```
> +`diff` equals 3 (1 side exit on loop end, 2 side exits to the interpreter
> +before trace gets hot and compiled) after this chunk of code.
> +
> +And now we decide to change `foo` function like this:
> +```lua
> +local function foo(i)
> +    -- math.fmod is not yet compiled!
> +    return i <= 5 and i or math.fmod(i, 11)
> +end
> +```
> +`diff` equals 6 (1 side exit on loop end, 2 side exits to the interpreter
> +before trace gets hot and compiled an 3 side exits from the root trace could
> +not get compiled) after the same chunk of code.
> +
> +## Benchmarks
> +
> +Benchmarks was taken from repo:

Typo: s/was/were/.

> +[LuaJIT-test-cleanup](https://github.com/LuaJIT/LuaJIT-test-cleanup).
> +
> +Example of usage:
> +```bash
> +/usr/bin/time -f"array3d %U" ./luajit $BENCH_DIR/array3d.lua  300 >/dev/null

Typo: double space prior to "300".

> +```

<snipped>

> -- 
> 2.28.0
> 

-- 
Best regards,
IM

  parent reply	other threads:[~2020-10-08 17:35 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-05  6:30 [Tarantool-patches] [PATCH v4 0/2] Implement LuaJIT platform metrics Sergey Kaplun
2020-10-05  6:30 ` [Tarantool-patches] [PATCH v4 1/2] core: introduce various " Sergey Kaplun
2020-10-07 14:11   ` Igor Munkin
2020-10-07 19:55     ` Sergey Kaplun
2020-10-07 20:16       ` Igor Munkin
2020-10-08  9:28         ` Igor Munkin
2020-10-08 10:11         ` Sergey Kaplun
2020-10-08 12:44           ` Igor Munkin
2020-10-09 14:39             ` Sergey Ostanevich
2020-10-05  6:30 ` [Tarantool-patches] [PATCH v4 2/2] misc: add C and Lua API for " Sergey Kaplun
2020-10-06 22:17   ` Igor Munkin
2020-10-07  5:57     ` Igor Munkin
2020-10-07 14:35     ` Sergey Kaplun
2020-10-07 18:23       ` Igor Munkin
2020-10-07 20:09         ` Sergey Kaplun
2020-10-09 14:45   ` Sergey Ostanevich
2020-10-13  6:01     ` Sergey Kaplun
2020-10-05  6:30 ` [Tarantool-patches] [RFC v4] rfc: luajit metrics Sergey Kaplun
2020-10-07 14:46   ` Sergey Kaplun
2020-10-08 17:25   ` Igor Munkin [this message]
2020-10-08 19:29     ` Sergey Kaplun
2020-10-08 20:26       ` Igor Munkin
2020-10-09  6:06         ` Sergey Kaplun
2020-12-22  9:07   ` Kirill Yukhin
2020-10-08 17:33 ` [Tarantool-patches] [PATCH v4 0/2] Implement LuaJIT platform metrics Igor Munkin
2020-10-13 13:17 ` Kirill Yukhin

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=20201008172512.GU18920@tarantool.org \
    --to=imun@tarantool.org \
    --cc=skaplun@tarantool.org \
    --cc=tarantool-patches@dev.tarantool.org \
    --subject='Re: [Tarantool-patches] [RFC v4] rfc: luajit metrics' \
    /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