[lldb-dev] LLDB performance drop from 3.9 to 4.0
Pavel Labath via lldb-dev
lldb-dev at lists.llvm.org
Thu Apr 13 05:37:02 PDT 2017
Bisecting the performance regression would be extremely valuable. If you
want to do that, it would be very appreciated.
On 12 April 2017 at 20:39, Scott Smith via lldb-dev <lldb-dev at lists.llvm.org
> wrote:
> For my app I think it's largely parsing debug symbols tables for shared
> libraries. My main performance improvement was to increase the parallelism
> of parsing that information.
>
> Funny, gdb/gold has a similar accelerator table (created when you link
> with -gdb-index). I assume lldb doesn't know how to parse it.
>
> I'll work on bisecting the change.
>
> On Wed, Apr 12, 2017 at 12:26 PM, Jason Molenda <jason at molenda.com> wrote:
>
>> I don't know exactly when the 3.9 / 4.0 branches were cut, and what was
>> done between those two points, but in general we don't expect/want to see
>> performance regressions like that. I'm more familiar with the perf
>> characteristics on macos, Linux is different in some important regards, so
>> I can only speak in general terms here.
>>
>> In your example, you're measuring three things, assuming you have debug
>> information for MY_PROGRAM. The first is "Do the initial read of the main
>> binary and its debug information". The second is "Find all symbol names
>> 'main'". The third is "Scan a newly loaded solib's symbols" (assuming you
>> don't have debug information from solibs from /usr/lib etc). Technically
>> there's some additional stuff here -- launching the process, detecting
>> solibs as they're loaded, looking up the symbol context when we hit the
>> breakpoint, backtracing a frame or two, etc, but that stuff is rarely where
>> you'll see perf issues on a local debug session.
>>
>> Which of these is likely to be important will depend on your MY_PROGRAM.
>> If you have a 'int main(){}', it's not going to be dwarf parsing. If your
>> binary only pulls in three solib's by the time it is running, it's not
>> going to be new module scanning. A popular place to spend startup time is
>> in C++ name demangling if you have a lot of solibs with C++ symbols.
>>
>>
>> On Darwin systems, we have a nonstandard accelerator table in our DWARF
>> emitted by clang that lldb reads. The "apple_types", "apple_names" etc
>> tables. So when we need to find a symbol named "main", for Modules that
>> have a SymbolFile, we can look in the accelerator table. If that
>> SymbolFile has a 'main', the accelerator table gives us a reference into
>> the DWARF for the definition, and we can consume the DWARF lazily. We
>> should never need to do a full scan over the DWARF, that's considered a
>> failure.
>>
>> (in fact, I'm working on a branch of the llvm.org sources from
>> mid-October and I suspect Darwin lldb is often consuming a LOT more dwarf
>> than it should be when I'm debugging, I need to figure out what is causing
>> that, it's a big problem.)
>>
>>
>> In general, I've been wanting to add a new "perf counters" infrastructure
>> & testsuite to lldb, but haven't had time. One thing I work on a lot is
>> debugging over a bluetooth connection; it turns out that BT is very slow,
>> and any extra packets we send between lldb and debugserver are very
>> costly. The communication is so fast over a local host, or over a usb
>> cable, that it's easy for regressions to sneak in without anyone noticing.
>> So the original idea was hey, we can have something that counts packets for
>> distinct operations. Like, this "next" command should take no more than 40
>> packets, that kind of thing. And it could be expanded -- "b main should
>> fully parse the DWARF for only 1 symbol", or "p *this should only look up 5
>> types", etc.
>>
>>
>>
>>
>> > On Apr 12, 2017, at 11:26 AM, Scott Smith via lldb-dev <
>> lldb-dev at lists.llvm.org> wrote:
>> >
>> > I worked on some performance improvements for lldb 3.9, and was about
>> to forward port them so I can submit them for inclusion, but I realized
>> there has been a major performance drop from 3.9 to 4.0. I am using the
>> official builds on an Ubuntu 16.04 machine with 16 cores / 32 hyperthreads.
>> >
>> > Running: time lldb-4.0 -b -o 'b main' -o 'run' MY_PROGRAM > /dev/null
>> >
>> > With 3.9, I get:
>> > real 0m31.782s
>> > user 0m50.024s
>> > sys 0m4.348s
>> >
>> > With 4.0, I get:
>> > real 0m51.652s
>> > user 1m19.780s
>> > sys 0m10.388s
>> >
>> > (with my changes + 3.9, I got real down to 4.8 seconds! But I'm not
>> convinced you'll like all the changes.)
>> >
>> > Is this expected? I get roughly the same results when compiling
>> llvm+lldb from source.
>> >
>> > I guess I can spend some time trying to bisect what happened. 5.0
>> looks to be another 8% slower.
>> >
>> > _______________________________________________
>> > lldb-dev mailing list
>> > lldb-dev at lists.llvm.org
>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
>>
>>
>
> _______________________________________________
> lldb-dev mailing list
> lldb-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20170413/07e83921/attachment-0001.html>
More information about the lldb-dev
mailing list