libunwind-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Libunwind-devel] Question about performance of threaded access in l


From: Milian Wolff
Subject: Re: [Libunwind-devel] Question about performance of threaded access in libunwind
Date: Thu, 06 Oct 2016 18:25:25 +0200
User-agent: KMail/5.3.69 (Linux/4.7.6-1-ARCH; KDE/5.27.0; x86_64; git-a2ad080; 2016-10-05)

On Thursday, October 6, 2016 12:55:52 PM CEST Robert Schöne wrote:
> Hello,
> 
> Could it be that unwinding does not work well with threading?
> 
> I run an Intel dual core system + Hyperthreading using Ubuntu 16.04.
> and patched tests/Gperf-trace.c so that this part

<snip>

I'm the author of heaptrack and have seen the dwarf-based unwinding adding a 
significant slow-down when profiling multi-threaded applications. The reason 
is mostly the synchronization point within the many calls to `dl_iterate_phdr` 
when encountering non-cached code locations. Once everything is cached, 
libunwind is pretty fast and scales OK across threads.

I have submitted a patch which did not get accepted upstream yet (the project 
is pretty much unmaintained atm), to improve the per-thread caching 
functionality.

Others have submitted patches to allow replacing `dl_iterate_phdr` with 
something custom, which allows one to cache the `dl_iterate_phdr` results once 
and only update that cache when dlclose/dlopen is called.

> According to perf and strace a significant amount of time is spent in
> the kernel, i.e. in sigprocmask.

Can you verify where sigprocmask is coming from, i.e. sample with call stacks? 
I remember it being a problem once, but don't think it's the main culprit for 
thread scaling.

Unrelated to this: At this stage, I would recommend looking at an alternative 
to libunwind. elfutils' libdwfl can unwind the stack, and is supposedly even 
faster at it. You have to write more code though, but you can also implement 
the address lookups manually, invalidating all of the points above.

For inspiration on how to do that, look at the backward-cpp sources:
https://github.com/bombela/backward-cpp

Cheers
-- 
Milian Wolff
address@hidden
http://milianw.de



reply via email to

[Prev in Thread] Current Thread [Next in Thread]