On 06/01/16(Wed) 11:19, Landry Breuil wrote:
> [...] 
> i've had multiple ppl coming to me privately about this - Yes,
> performance with firefox has been steadily degrading in the past
> releases, since around 39 or so - i'm aware of this, but nobody is
> actually working on it - i won't/can't since this is way out my skills
> and i have no time nor motivation for that.
> 
> Debugging this requires profiling / running the browser within ktrace
> and figuring out why apparently it does way much more syscalls than
> before, which might be a clue, or not. Of course since you cant really
> use traditional tools like gdb, your toolbox is empty. Or that could be
> graphical stack regressions. Or so many other things. The builtin
> profiler needs specific code to work on OpenBSD.
> 
> Anybody is welcome to look into it - or 5.9 will ship with firefox 43
> as is.

I started looking at this but didn't go far.  It seems that the problem
is related to/exposed by the use of pthread_mutex_lock(3) & friends. I
tried to analyze ltrace(1) outputs, but I got lost in Firefox's sources.
I really don't know where to look at.

Here's what I wrote two months ago:

On 18/11/15(Wed) 20:44 +0100, Martin Pieuchot wrote:
> The actual firefox port (not the -esr one) might be exposing a bug in
> librthread resulting in a storm of sched_yield(2) calls when multiples
> threads are trying to access the same lock, see _spinlock().
> 
> I generated two ltrace(1) dumps for librthread hackers to have a look
> at.  They are both generate with a hacked version of ltrace(1) with:
> 
>       $ ltrace -p $pid -t cu -u libpthread ; sleep 2; ktrace -C
> 
> After having started firefox with:
> 
>       $ LD_TRACE_PLT="" LD_TRACE_PLTSPEC="libpthread" DISPLAY=:0 firefox
> 
> 
> The dumps are generate while firefox is sitting in its own custom home
> page.
> 
> 
> kump-esr.txt          a dump of the firefox-esr which work "not so bad"
> 
> kdump-nightly.txt     a dump of firefox's trunk which expose the problem
> 
> 
> $ grep sched_yield kdump-esr.txt |wc -l
>        4
> $ grep sched_yield kdump-nightly.txt  |wc -l               
>     89418
> 
> 
> The sequence below is an extract of what you can find there, when you
> have multiple threads fighting for the malloc lock...  this goes on
> forever and gets even worse when thread 1019109 returns from thrsleep...
> 
> Apparently they are all waiting for thread 1010468 to release the malloc
> lock or...  is it bad doctor?
> 
> 
>  13288/1032189 firefox-bin RET   sched_yield 0
>  13288/1010095 firefox-bin USER  .plt symbol: 7 bytes        "__errno"
>  13288/1032189 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1010095 firefox-bin USER  .plt symbol: 19 bytes        
> "_thread_malloc_lock"
>  13288/1032189 firefox-bin CALL  sched_yield()
>  13288/1027370 firefox-bin USER  .plt symbol: 11 bytes        "_spinunlock"
>  13288/1010095 firefox-bin USER  .plt symbol: 9 bytes        "_spinlock"
>  13288/1027370 firefox-bin USER  .plt symbol: 7 bytes        "__errno"
>  13288/1010095 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1010095 firefox-bin CALL  sched_yield()
>  13288/1027370 firefox-bin USER  .plt symbol: 19 bytes        
> "_thread_malloc_lock"
>  13288/1010095 firefox-bin RET   sched_yield 0
>  13288/1027370 firefox-bin USER  .plt symbol: 9 bytes        "_spinlock"
>  13288/1010095 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1027370 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1010095 firefox-bin CALL  sched_yield()
>  13288/1027370 firefox-bin CALL  sched_yield()
>  13288/1032189 firefox-bin RET   sched_yield 0
>  13288/1032189 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1032189 firefox-bin CALL  sched_yield()
>  13288/1027370 firefox-bin RET   sched_yield 0
>  13288/1027370 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1027370 firefox-bin CALL  sched_yield()
>  13288/1032189 firefox-bin RET   sched_yield 0
>  13288/1032189 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1032189 firefox-bin CALL  sched_yield()
>  13288/1027370 firefox-bin RET   sched_yield 0
>  13288/1010095 firefox-bin RET   sched_yield 0
>  13288/1027370 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1010095 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1027370 firefox-bin CALL  sched_yield()
>  13288/1010095 firefox-bin CALL  sched_yield()
>  13288/1032189 firefox-bin RET   sched_yield 0
>  13288/1032189 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1032189 firefox-bin CALL  sched_yield()
>  13288/1027370 firefox-bin RET   sched_yield 0
>  13288/1010095 firefox-bin RET   sched_yield 0
>  13288/1027370 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1027370 firefox-bin CALL  sched_yield()
>  13288/1032189 firefox-bin RET   sched_yield 0
>  13288/1010095 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1010095 firefox-bin CALL  sched_yield()
>  13288/1032189 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1010095 firefox-bin RET   sched_yield 0
>  13288/1032189 firefox-bin CALL  sched_yield()
>  13288/1027370 firefox-bin RET   sched_yield 0
>  13288/1010095 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1010095 firefox-bin CALL  sched_yield()
>  13288/1027370 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1010095 firefox-bin RET   sched_yield 0
>  13288/1027370 firefox-bin CALL  sched_yield()
>  13288/1032189 firefox-bin RET   sched_yield 0
>  13288/1010095 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1010095 firefox-bin CALL  sched_yield()
>  13288/1032189 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1010095 firefox-bin RET   sched_yield 0
>  13288/1032189 firefox-bin CALL  sched_yield()
>  13288/1027370 firefox-bin RET   sched_yield 0
>  13288/1010095 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1010095 firefox-bin CALL  sched_yield()
>  13288/1027370 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1010095 firefox-bin RET   sched_yield 0
>  13288/1027370 firefox-bin CALL  sched_yield()
>  13288/1032189 firefox-bin RET   sched_yield 0
>  13288/1010095 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1010095 firefox-bin CALL  sched_yield()
>  13288/1032189 firefox-bin USER  .plt symbol: 12 bytes        "_atomic_lock"
>  13288/1010095 firefox-bin RET   sched_yield 0
>  13288/1032189 firefox-bin CALL  sched_yield()
>  13288/1027370 firefox-bin RET   sched_yield 0
> ...

Reply via email to