Debugger overhead for virtual threads creation
Chris Plummer
chris.plummer at oracle.com
Thu Apr 3 20:32:50 UTC 2025
I got my prototype ThreadNode cleanup code working again. It seems to be
doing the job of keeping the list down to a minimal size, with usually
at most a few ThreadNodes on the list. However, that didn't help
performance. The reason is because the debug agent normally does not
need to traverse the list. It maps jthread to ThreadNode by using JVMTI
thread local data, not by searching the list, and the list is doubly
linked, so ThreadNodes can be removed quickly.
After the above results I talked with Serguei and he confirmed that
JVMTI also has a linked list, and there are some occasions where it
needs to be traversed, so that likely the bottleneck here.
Regarding my suggestion that we may be able to disable
JVMTI_EVENT_VIRTUAL_THREAD_START/END, I did experiment with that and
when disabled there are no performance issues, so I will look into
getting this to work properly. The events need to be enable if there are
any ThreadStartRequests or ThreadDeathRequests that do not have the
PlatformThreadOnly filter enabled.
https://docs.oracle.com/en/java/javase/24/docs/api/jdk.jdi/com/sun/jdi/request/ThreadStartRequest.html#addPlatformThreadsOnlyFilter()
Jdb by default uses this filter, and I suspect that IDEA does also. If
not, it would get a flood of ThreadStart and ThreadDeath events for all
the virtual threads.
Chris
On 4/3/25 2:15 AM, Serguei Spitsyn wrote:
>
> Hi Egor,
>
> Thank you for reporting this scalability issue when debugger is enabled.
> It looks like a JVMTI problem and we have some guesses but need some
> investigation to identify it better.
>
> Thanks,
>
> Serguei
>
> *From: *serviceability-dev <serviceability-dev-retn at openjdk.org> on
> behalf of Egor Ushakov <egor.ushakov at jetbrains.com>
> *Date: *Wednesday, April 2, 2025 at 3:32 AM
> *To: *Chris Plummer <chris.plummer at oracle.com>, serviceability-dev
> <serviceability-dev at openjdk.java.net>
> *Subject: *Re: Debugger overhead for virtual threads creation
>
> Thanks Chris!
>
> I've made the bug https://youtrack.jetbrains.com/issue/IDEA-365900
> visible, there's a reproducer there.
>
> Thanks,
> Egor
>
> On 02.04.2025 01:39, Chris Plummer wrote:
> > The short answer is yes. The debug agent needs to deal with
> > JVMTI_EVENT_VIRTUAL_THREAD_START/END events for every virtual thread.
> > What makes it worse is when there are a large number of virtual
> > threads that are currently alive. They are tracked on a list of
> > ThreadNodes that starts to slow down debug agent performance when it
> > gets too long. I have a work in progress that proactively purges these
> > ThreadNodes so the list does not get too big. I've been meaning to
> > revive this project for quite some time. If you have a test case I'd
> > be willing to experiment with these changes some more. I could not
> > access to the IDEA-365900 link you provided.
> >
> > Note I think after the work is done to purge ThreadNodes proactively
> > it might not be that hard of step to move to not needing
> > JVMTI_EVENT_VIRTUAL_THREAD_START/END events enabled, which will help
> > performance a lot more.
> >
> > Chris
> >
> > On 4/1/25 10:14 AM, Egor Ushakov wrote:
> >> Hi everyone!
> >>
> >> Is it expected that with the debugger attached creating virtual
> >> threads is much slower?
> >> We're getting bugs like:
> >> https://youtrack.jetbrains.com/issue/IDEA-365900
> >> And I can reproduce it easily with jdb...
> >> Just attaching the debugger immediately slows down virtual threads
> >> creation significantly.
> >>
> >> >java
> >> -agentlib:jdwp=transport=dt_shmem,server=y,suspend=n,address=8000 app
> >> ...
> >> 6808805 (1.2046688E7 threads per second)
> >> ...
> >> after >jdb -attach 8000
> >> ...
> >> 30215 (95986.055 threads per second)
> >> ...
> >>
> >> Thanks,
> >> Egor
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/serviceability-dev/attachments/20250403/85e99948/attachment.htm>
More information about the serviceability-dev
mailing list