Bug 368855 - changing files via git (rebase, checkout) causes 100% CPU usage on 2 cores
Summary: changing files via git (rebase, checkout) causes 100% CPU usage on 2 cores
Status: CONFIRMED
Alias: None
Product: kdevelop
Classification: Applications
Component: general (show other bugs)
Version: 5.0.1
Platform: openSUSE Linux
: NOR normal
Target Milestone: ---
Assignee: kdevelop-bugs-null
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2016-09-15 16:07 UTC by Rolf Eike Beer
Modified: 2016-11-09 12:06 UTC (History)
1 user (show)

See Also:
Latest Commit:
Version Fixed In:


Attachments
perf data (1.01 MB, application/x-xz)
2016-10-31 22:22 UTC, Rolf Eike Beer
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Rolf Eike Beer 2016-09-15 16:07:37 UTC
I have a 2core+HT system. When I change the files using git from the commandline (git checkout some-other-branch or git rebase) it often happens that the CPU usage on 2 cores goes to 100% (i.e. 50% system load). I can normally quit KDevelop afterwards, everything is fine if I open it again.

Reproducible: Sometimes
Comment 1 Kevin Funk 2016-09-16 09:39:39 UTC
Backtrace please.
Comment 2 Rolf Eike Beer 2016-09-18 12:53:34 UTC
Thread 14 (Thread 0x7fe1a8c3f700 (LWP 10656)):
#0  0x00007fe203b1403f in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fe1fe47f86b in  () at /usr/lib64/libQt5Script.so.5
#2  0x00007fe1fe47f899 in  () at /usr/lib64/libQt5Script.so.5
#3  0x00007fe203b100a4 in start_thread () at /lib64/libpthread.so.0
#4  0x00007fe209ddc02d in clone () at /lib64/libc.so.6

Thread 13 (Thread 0x7fe1aa5ab700 (LWP 10635)):
#0  0x00007fe209dd3bfd in poll () at /lib64/libc.so.6
#1  0x00007fe202e94e64 in  () at /usr/lib64/libglib-2.0.so.0
#2  0x00007fe202e94f7c in g_main_context_iteration () at /usr/lib64/libglib-2.0.so.0
#3  0x00007fe20a700d6c in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#4  0x00007fe20a6a7d53 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#5  0x00007fe20a4c961a in QThread::exec() () at /usr/lib64/libQt5Core.so.5
#6  0x00007fe20a4ce32f in  () at /usr/lib64/libQt5Core.so.5
#7  0x00007fe203b100a4 in start_thread () at /lib64/libpthread.so.0
#8  0x00007fe209ddc02d in clone () at /lib64/libc.so.6

Thread 12 (Thread 0x7fe18bfff700 (LWP 10528)):
#0  0x00007fe209dd3bfd in poll () at /lib64/libc.so.6
#1  0x00007fe202e94e64 in  () at /usr/lib64/libglib-2.0.so.0
#2  0x00007fe202e94f7c in g_main_context_iteration () at /usr/lib64/libglib-2.0.so.0
#3  0x00007fe20a700d6c in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#4  0x00007fe20a6a7d53 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#5  0x00007fe20a4c961a in QThread::exec() () at /usr/lib64/libQt5Core.so.5
#6  0x00007fe20a4ce32f in  () at /usr/lib64/libQt5Core.so.5
#7  0x00007fe203b100a4 in start_thread () at /lib64/libpthread.so.0
#8  0x00007fe209ddc02d in clone () at /lib64/libc.so.6

Thread 11 (Thread 0x7fe1aadac700 (LWP 10515)):
#0  0x00007fe203b1403f in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fe20a4cf34b in QWaitCondition::wait(QMutex*, unsigned long) () at /usr/lib64/libQt5Core.so.5
#2  0x00007fe1ff2b465f in ThreadWeaver::Weaver::takeFirstAvailableJobOrSuspendOrWait(ThreadWeaver::Thread*, bool, bool, bool) () at /usr/lib64/libKF5ThreadWeaver.so.5
#3  0x00007fe1ff2b843a in  () at /usr/lib64/libKF5ThreadWeaver.so.5
#4  0x00007fe1ff2b26cb in ThreadWeaver::Weaver::applyForWork(ThreadWeaver::Thread*, bool) () at /usr/lib64/libKF5ThreadWeaver.so.5
#5  0x00007fe1ff2b6005 in ThreadWeaver::Thread::run() () at /usr/lib64/libKF5ThreadWeaver.so.5
#6  0x00007fe20a4ce32f in  () at /usr/lib64/libQt5Core.so.5
#7  0x00007fe203b100a4 in start_thread () at /lib64/libpthread.so.0
#8  0x00007fe209ddc02d in clone () at /lib64/libc.so.6

Thread 10 (Thread 0x7fe1ab5ad700 (LWP 10514)):
#0  0x00007fe203b1403f in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fe20a4cf34b in QWaitCondition::wait(QMutex*, unsigned long) () at /usr/lib64/libQt5Core.so.5
#2  0x00007fe1ff2b465f in ThreadWeaver::Weaver::takeFirstAvailableJobOrSuspendOrWait(ThreadWeaver::Thread*, bool, bool, bool) () at /usr/lib64/libKF5ThreadWeaver.so.5
#3  0x00007fe1ff2b843a in  () at /usr/lib64/libKF5ThreadWeaver.so.5
#4  0x00007fe1ff2b26cb in ThreadWeaver::Weaver::applyForWork(ThreadWeaver::Thread*, bool) () at /usr/lib64/libKF5ThreadWeaver.so.5
#5  0x00007fe1ff2b8481 in  () at /usr/lib64/libKF5ThreadWeaver.so.5
#6  0x00007fe1ff2b26cb in ThreadWeaver::Weaver::applyForWork(ThreadWeaver::Thread*, bool) () at /usr/lib64/libKF5ThreadWeaver.so.5
#7  0x00007fe1ff2b6005 in ThreadWeaver::Thread::run() () at /usr/lib64/libKF5ThreadWeaver.so.5
#8  0x00007fe20a4ce32f in  () at /usr/lib64/libQt5Core.so.5
#9  0x00007fe203b100a4 in start_thread () at /lib64/libpthread.so.0
#10 0x00007fe209ddc02d in clone () at /lib64/libc.so.6

Thread 9 (Thread 0x7fe1abdae700 (LWP 10513)):
#0  0x00007fe203b1403f in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fe20a4cf34b in QWaitCondition::wait(QMutex*, unsigned long) () at /usr/lib64/libQt5Core.so.5
#2  0x00007fe1ff2b465f in ThreadWeaver::Weaver::takeFirstAvailableJobOrSuspendOrWait(ThreadWeaver::Thread*, bool, bool, bool) () at /usr/lib64/libKF5ThreadWeaver.so.5
#3  0x00007fe1ff2b843a in  () at /usr/lib64/libKF5ThreadWeaver.so.5
#4  0x00007fe1ff2b26cb in ThreadWeaver::Weaver::applyForWork(ThreadWeaver::Thread*, bool) () at /usr/lib64/libKF5ThreadWeaver.so.5
#5  0x00007fe1ff2b6005 in ThreadWeaver::Thread::run() () at /usr/lib64/libKF5ThreadWeaver.so.5
#6  0x00007fe20a4ce32f in  () at /usr/lib64/libQt5Core.so.5
#7  0x00007fe203b100a4 in start_thread () at /lib64/libpthread.so.0
#8  0x00007fe209ddc02d in clone () at /lib64/libc.so.6

Thread 8 (Thread 0x7fe1ac5af700 (LWP 10512)):
#0  0x00007fe203b1403f in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fe20a4cf34b in QWaitCondition::wait(QMutex*, unsigned long) () at /usr/lib64/libQt5Core.so.5
#2  0x00007fe1ff2b465f in ThreadWeaver::Weaver::takeFirstAvailableJobOrSuspendOrWait(ThreadWeaver::Thread*, bool, bool, bool) () at /usr/lib64/libKF5ThreadWeaver.so.5
#3  0x00007fe1ff2b843a in  () at /usr/lib64/libKF5ThreadWeaver.so.5
#4  0x00007fe1ff2b26cb in ThreadWeaver::Weaver::applyForWork(ThreadWeaver::Thread*, bool) () at /usr/lib64/libKF5ThreadWeaver.so.5
#5  0x00007fe1ff2b6005 in ThreadWeaver::Thread::run() () at /usr/lib64/libKF5ThreadWeaver.so.5
#6  0x00007fe20a4ce32f in  () at /usr/lib64/libQt5Core.so.5
#7  0x00007fe203b100a4 in start_thread () at /lib64/libpthread.so.0
#8  0x00007fe209ddc02d in clone () at /lib64/libc.so.6

Thread 7 (Thread 0x7fe1be3df700 (LWP 10511)):
#0  0x00007fe203b1403f in pthread_cond_wait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fe20a4cf34b in QWaitCondition::wait(QMutex*, unsigned long) () at /usr/lib64/libQt5Core.so.5
#2  0x00007fe1ff2b465f in ThreadWeaver::Weaver::takeFirstAvailableJobOrSuspendOrWait(ThreadWeaver::Thread*, bool, bool, bool) () at /usr/lib64/libKF5ThreadWeaver.so.5
#3  0x00007fe1ff2b843a in  () at /usr/lib64/libKF5ThreadWeaver.so.5
---Type <return> to continue, or q <return> to quit---
#4  0x00007fe1ff2b26cb in ThreadWeaver::Weaver::applyForWork(ThreadWeaver::Thread*, bool) () at /usr/lib64/libKF5ThreadWeaver.so.5
#5  0x00007fe1ff2b6005 in ThreadWeaver::Thread::run() () at /usr/lib64/libKF5ThreadWeaver.so.5
#6  0x00007fe20a4ce32f in  () at /usr/lib64/libQt5Core.so.5
#7  0x00007fe203b100a4 in start_thread () at /lib64/libpthread.so.0
#8  0x00007fe209ddc02d in clone () at /lib64/libc.so.6

Thread 6 (Thread 0x7fe1bdbde700 (LWP 10435)):
#0  0x00007fe209dd3bfd in poll () at /lib64/libc.so.6
#1  0x00007fe202e94e64 in  () at /usr/lib64/libglib-2.0.so.0
#2  0x00007fe202e94f7c in g_main_context_iteration () at /usr/lib64/libglib-2.0.so.0
#3  0x00007fe20a700d6c in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#4  0x00007fe20a6a7d53 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#5  0x00007fe20a4c961a in QThread::exec() () at /usr/lib64/libQt5Core.so.5
#6  0x00007fe1ffc67e18 in  () at /usr/lib64/libQt5Qml.so.5
#7  0x00007fe20a4ce32f in  () at /usr/lib64/libQt5Core.so.5
#8  0x00007fe203b100a4 in start_thread () at /lib64/libpthread.so.0
#9  0x00007fe209ddc02d in clone () at /lib64/libc.so.6

Thread 5 (Thread 0x7fe1bfe69700 (LWP 10405)):
#0  0x00007fe209dd3bfd in poll () at /lib64/libc.so.6
#1  0x00007fe202e94e64 in  () at /usr/lib64/libglib-2.0.so.0
#2  0x00007fe202e94f7c in g_main_context_iteration () at /usr/lib64/libglib-2.0.so.0
#3  0x00007fe20a700d6c in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#4  0x00007fe20a6a7d53 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#5  0x00007fe20a4c961a in QThread::exec() () at /usr/lib64/libQt5Core.so.5
#6  0x00007fe208003dc3 in  () at /usr/lib64/libKDevPlatformLanguage.so.10
#7  0x00007fe20a4ce32f in  () at /usr/lib64/libQt5Core.so.5
#8  0x00007fe203b100a4 in start_thread () at /lib64/libpthread.so.0
#9  0x00007fe209ddc02d in clone () at /lib64/libc.so.6

Thread 4 (Thread 0x7fe1dce35700 (LWP 10404)):
#0  0x00007fe209dd3bfd in poll () at /lib64/libc.so.6
#1  0x00007fe202e94e64 in  () at /usr/lib64/libglib-2.0.so.0
#2  0x00007fe202e94f7c in g_main_context_iteration () at /usr/lib64/libglib-2.0.so.0
#3  0x00007fe20a700d8b in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#4  0x00007fe20a6a7d53 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#5  0x00007fe20a4c961a in QThread::exec() () at /usr/lib64/libQt5Core.so.5
#6  0x00007fe208003dc3 in  () at /usr/lib64/libKDevPlatformLanguage.so.10
#7  0x00007fe20a4ce32f in  () at /usr/lib64/libQt5Core.so.5
#8  0x00007fe203b100a4 in start_thread () at /lib64/libpthread.so.0
#9  0x00007fe209ddc02d in clone () at /lib64/libc.so.6

Thread 3 (Thread 0x7fe1dfb32700 (LWP 10403)):
#0  0x00007fe203b143e8 in pthread_cond_timedwait@@GLIBC_2.3.2 () at /lib64/libpthread.so.0
#1  0x00007fe20a4cf298 in QWaitCondition::wait(QMutex*, unsigned long) () at /usr/lib64/libQt5Core.so.5
#2  0x00007fe207f314f3 in  () at /usr/lib64/libKDevPlatformLanguage.so.10
#3  0x00007fe20a4ce32f in  () at /usr/lib64/libQt5Core.so.5
#4  0x00007fe203b100a4 in start_thread () at /lib64/libpthread.so.0
#5  0x00007fe209ddc02d in clone () at /lib64/libc.so.6

Thread 2 (Thread 0x7fe1ed5f4700 (LWP 10402)):
#0  0x00007fe209dd3bfd in poll () at /lib64/libc.so.6
#1  0x00007fe1fcf25422 in  () at /usr/lib64/libxcb.so.1
#2  0x00007fe1fcf2700f in xcb_wait_for_event () at /usr/lib64/libxcb.so.1
#3  0x00007fe1ef9493c9 in  () at /usr/lib64/libQt5XcbQpa.so.5
#4  0x00007fe20a4ce32f in  () at /usr/lib64/libQt5Core.so.5
#5  0x00007fe203b100a4 in start_thread () at /lib64/libpthread.so.0
#6  0x00007fe209ddc02d in clone () at /lib64/libc.so.6

Thread 1 (Thread 0x7fe20d0427c0 (LWP 10401)):
#0  0x00007fe209dd3bfd in poll () at /lib64/libc.so.6
#1  0x00007fe202e94e64 in  () at /usr/lib64/libglib-2.0.so.0
#2  0x00007fe202e94f7c in g_main_context_iteration () at /usr/lib64/libglib-2.0.so.0
#3  0x00007fe20a700d6c in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#4  0x00007fe20a6a7d53 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib64/libQt5Core.so.5
#5  0x00007fe20a6af8f6 in QCoreApplication::exec() () at /usr/lib64/libQt5Core.so.5
#6  0x000000000040c460 in main(int, char**) (argc=1, argv=<optimized out>) at /usr/src/debug/kdevelop-5.0/app/main.cpp:745
Comment 3 Sven Brauch 2016-09-20 07:23:48 UTC
Hm, all threads in that trace are idle.
Comment 4 Milian Wolff 2016-09-21 09:30:41 UTC
not a backtrace, a profile is needed. Please get one when you see 100% CPU usage via:

perf record --call-graph dwarf --pid $(pidof kdevelop)
# wait a couple of seconds
^C

then create a report file and upload it here:

perf report --no-children -g graph --stdio | bzip2 > perf.report.bz2
Comment 5 Rolf Eike Beer 2016-10-31 22:19:22 UTC
Just another data point: after a couple of seconds (~20-30) everything goes back to normal
Comment 6 Rolf Eike Beer 2016-10-31 22:22:00 UTC
Created attachment 101934 [details]
perf data
Comment 7 Sven Brauch 2016-11-01 10:28:41 UTC
The time is spent in libclang, i.e. parsing. This behaviour seems perfectly normal to me; files changed, they have to be reparsed, that takes a while. So, not a bug ...?
Comment 8 Rolf Eike Beer 2016-11-01 12:38:29 UTC
> The time is spent in libclang, i.e. parsing. This behaviour seems 
> perfectly
> normal to me; files changed, they have to be reparsed, that takes a 
> while. So,
> not a bug ...?

There are few files, and parsing a few thousand lines of codes shouldn't 
take half a minute on a Core i7. In fact this sometimes works fine (and 
fast), so I guess the problem really is that the files changed while 
libclang is trying to parse them.
Comment 9 Sven Brauch 2016-11-09 12:06:28 UTC
This could be the same issue like the one on the mailing list, i.e. parsing sometimes being super slow under some unclear conditions.