[Tarantool-patches] [PATCH 1/2] fiber: add PoC for fiber creation backtrace
Egor Elchinov
eelchinov at tarantool.org
Mon Jun 7 19:39:45 MSK 2021
Hi! Thanks for the review!
On 6/7/21 11:28 AM, Cyrill Gorcunov wrote:
> On Fri, Jun 04, 2021 at 02:13:10PM +0300, Egor Elchinov via Tarantool-patches wrote:
>> From: Egor2001 <elchinov.es at gmail.com>
>>
>> For now fiber creation backtrace is stored
>> in the separate subtable of fiber.info
>> called backtrace_parent for convenience.
>>
>> Lua stacks of fiber creation
>> aren't preserved in backtrace yet because
>> of need to somehow handle parent Lua state
>> inside the child fiber for this sake.
>>
>> Backtrace caching and demangling
>> aren't present yet too as this is a
>> proof-of-concept implementation.
>>
>> Needed for: #4002
>> ---
>>
>> +/**
>> + * Collect up to `limit' IP register values
>> + * for frames of the current stack into `ip_buf'.
>> + * Must be by far faster than usual backtrace according to the
>> + * libunwind doc for unw_backtrace().
>> + */
>> +void
>> +fast_trace_collect(void **ip_buf, int limit)
>> +{
>> + memset(ip_buf, 0, limit * sizeof(*ip_buf));
>> + unw_backtrace(ip_buf, limit);
>> +}
> This is not guaranteed to be faster, so I would name it
> backtrace_collect_ip. Also you have to mark it as NOINLINE,
> otherwise IPs gonna be screwed. Moreover you put a special
> offset into IPs resolving inside fast_trace_foreach to hide
> the fast_trace_collect call itself, I think we should be
> very loud about, otherwise other people might get confusing
> what we're doing with frame numbers and why we skip the first
> frame.
Thanks, fixed.
> Also I personally not sure if we must collect fiber's creation
> backtrace for every fiber in a system even if we never need it,
> I'm pretty sure that backtrace is very far from cheap. But I
> left it up to you to decide. I guess we might need some kind
> of dynamic settings similar to fiber_top?
Good point, I've consulted with Alexander Lyapunov and
it was decided to add a dynamic setting enabling this feature.
>> +void
>> +fast_trace_foreach(backtrace_cb cb, void **ip_buf, int limit, void *cb_ctx)
>> +{
>> + static __thread char proc_name[BACKTRACE_NAME_MAX];
> Why do you need it be per thread? There must be very strong reason why some
> data is put into TLS.
Thanks, fixed.
>> + int frame_no = 0;
> This is shor routine and I think plain `n` would be more than enough.
For now that's true, but `frame_no` name was chosen mostly
for consistency with the present `backtrace` routines.
Also, routine will be more complicated after addition of
DARWIN `#ifdef` and demangling support.
>> + unw_word_t ip = 0, offset = 0;
>> + unw_proc_info_t pi;
>> + int ret = 0;
>> + char* proc = NULL;
>> +
>> + unw_accessors_t* acc = unw_get_accessors(unw_local_addr_space);
>> + assert(acc);
>> +
>> + for (frame_no = 0; frame_no < limit && ip_buf[frame_no] != NULL;
>> + ++frame_no) {
>> + ip = (unw_word_t)ip_buf[frame_no];
>> + if (acc->get_proc_name == NULL) {
>> + ret = unw_get_proc_info_by_ip(unw_local_addr_space,
>> + ip, &pi, NULL);
>> + offset = ip - pi.start_ip;
> Why proc is left untouched here? it may carry old value from
> previous acc->get_proc_name call, is it ok?
It's ok, because if `proc` gets non-NULL value then
`acc->get_proc_name` routine is present in the system and
this part of code will never be called.
Otherwise `proc` can't be retrieved by the
libunwind API and has to be NULL.
>> + } else {
>> + ret = acc->get_proc_name(unw_local_addr_space, ip,
>> + proc_name, sizeof(proc_name),
>> + &offset, NULL);
>> + proc = proc_name;
>> + }
>> +
>> + if (ret != 0 || (frame_no > 0 &&
>> + cb(frame_no - 1, (void *)ip, proc,
>> + (size_t)offset, cb_ctx) != 0))
>> + break;
>> + }
> Egor, I think this is very good PoC code! Here is the diff I made
> on top of your patch to share ideas. Not insisting anyhow on code
> refactoring, vars renaming and etc.
>
> Also I CC Vlad, since he might have own vision on overall code design.
> And since Vlad is the final line before code goes upstream better wait
> for his opinion.
Thanks a lot for your diff!
Also I haven't decided yet how to grab Lua stacks of
fiber creation in a cheap way.
I would be glad for any suggestions on this issue too.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.tarantool.org/pipermail/tarantool-patches/attachments/20210607/a4ed3815/attachment.htm>
More information about the Tarantool-patches
mailing list