On Tue, 20 Dec 2022 02:25:38 GMT, Chris Plummer <cjplum...@openjdk.org> wrote:

>> There are a few nsk debugger tests that pin multiple virtual threads to 
>> carrier threads when synchronizing. Sometime the default number of carrier 
>> threads (which equals the number of CPUs) is not enough, and the test 
>> deadlocks because virtual threads start to wait forever for an available 
>> carrier thread. This PR fixes this problem by using the 
>> `jdk.virtualThreadScheduler.parallelism` property to change the default 
>> number of carrier threads. I believe the largest number of carrier threads 
>> any test needs is 11, so I chose 15 just to be safe.
>> 
>> I had initially tried to fix each individual test by using the test support 
>> in `VThreadRunner.setParallism()`. The advantage of this was limiting the 
>> scope of the change to just a few tests, and also being able to specify the 
>> exact number of needed carrier threads. The disadvantage was having to make 
>> quite a few changes to quite a few tests, plus I had one troublesome test 
>> that was still failing, I believe because I didn't fully understand how many 
>> carrier threads it needed. Just giving every test 15 carrier threads in the 
>> end was a lot easier.
>
> Chris Plummer has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   Better comments.

The JEP defines pinning as expected:
> There are two scenarios in which a virtual thread cannot be unmounted during 
> blocking operations because it is pinned to its carrier:
>
>  When it executes code inside a synchronized block or method, or
>  When it executes a native method or a [foreign 
> function](https://openjdk.java.net/jeps/424).
>
> Pinning does not make an application incorrect, but it might hinder its 
> scalability. If a virtual thread performs a blocking operation such as I/O or 
> BlockingQueue.take() while it is pinned, then its carrier and the underlying 
> OS thread are blocked for the duration of the operation. Frequent pinning for 
> long durations can harm the scalability of an application by capturing 
> carriers.

But then also says:
> The scheduler does not compensate for pinning by expanding its parallelism.

which contradicts what you quoted from Alan above - though I prefer that 
behaviour as the JEP's behaviour seems a design flaw to me.

-------------

PR: https://git.openjdk.org/jdk/pull/11735

Reply via email to