Skip to content

Commit 5009a23

Browse files
committed
Improving Virtual Thread performance
1 parent 5576815 commit 5009a23

File tree

5 files changed

+29
-14
lines changed

5 files changed

+29
-14
lines changed

frameworks/Java/netty/run_netty_loom.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ JAVA_OPTIONS="--enable-native-access=ALL-UNNAMED \
1010
-Dio.netty.buffer.checkBounds=false \
1111
-Dio.netty.buffer.checkAccessible=false \
1212
-Dhello.eventloop.carrier=true \
13+
-XX:+UnlockExperimentalVMOptions \
14+
-XX:-DoJVMTIVirtualThreadTransitions \
15+
-Djdk.trackAllThreads=false \
1316
$@"
1417

1518
java $JAVA_OPTIONS -jar app.jar

frameworks/Java/netty/src/main/java/hello/HelloServerHandler.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package hello;
22

3-
import static hello.Constants.STATIC_PLAINTEXT;
4-
import static hello.Constants.newMsg;
53
import static hello.HttpResponses.makeJsonResponse;
64
import static hello.HttpResponses.makePlaintextResponse;
75
import static hello.JsonUtils.acquireJsonStreamFromEventLoop;
86
import static hello.JsonUtils.releaseJsonStreamFromEventLoop;
9-
import static hello.JsonUtils.serializeMsg;
107
import static io.netty.handler.codec.http.HttpResponseStatus.NOT_FOUND;
118
import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;
129

@@ -17,7 +14,6 @@
1714
import java.util.concurrent.TimeUnit;
1815

1916
import com.jsoniter.output.JsonStream;
20-
import com.jsoniter.output.JsonStreamPool;
2117

2218
import io.netty.buffer.Unpooled;
2319
import io.netty.channel.ChannelFutureListener;

frameworks/Java/netty/src/main/java/hello/HelloWebServer.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,21 @@
1616
public class HelloWebServer {
1717

1818
private static final boolean EVENT_LOOP_CARRIER = Boolean.getBoolean("hello.eventloop.carrier");
19+
private static final IoMultiplexer PREFERRED_TRANSPORT;
1920

2021
static {
2122
ResourceLeakDetector.setLevel(Level.DISABLED);
23+
String transportName = System.getProperty("hello.transport");
24+
if (transportName != null) {
25+
try {
26+
PREFERRED_TRANSPORT = IoMultiplexer.valueOf(transportName);
27+
} catch (IllegalArgumentException e) {
28+
System.err.println("Invalid transport name: " + transportName);
29+
throw e;
30+
}
31+
} else {
32+
PREFERRED_TRANSPORT = IoMultiplexer.type();
33+
}
2234
}
2335

2436
private final int port;
@@ -28,24 +40,24 @@ public HelloWebServer(int port) {
2840
}
2941

3042
public void run() throws Exception {
31-
final var type = IoMultiplexer.type();
32-
System.out.printf("Using %s IoMultiplexer%n", type);
43+
final var preferredTransport = PREFERRED_TRANSPORT;
44+
System.out.printf("Using %s IoMultiplexer%n", preferredTransport);
3345
final int coreCount = Runtime.getRuntime().availableProcessors();
3446
final var group = EVENT_LOOP_CARRIER?
35-
type.newVirtualEventExecutorGroup(coreCount) :
36-
type.newEventLoopGroup(coreCount);
47+
preferredTransport.newVirtualEventExecutorGroup(coreCount) :
48+
preferredTransport.newEventLoopGroup(coreCount);
3749
if (EVENT_LOOP_CARRIER) {
3850
LoomSupport.checkSupported();
3951
System.out.println("Using EventLoop optimized for Loom");
4052
}
4153
try {
42-
final var serverChannelClass = type.serverChannelClass();
54+
final var serverChannelClass = preferredTransport.serverChannelClass();
4355
var inet = new InetSocketAddress(port);
4456
var b = new ServerBootstrap();
4557

4658
b.option(ChannelOption.SO_BACKLOG, 8192);
4759
b.option(ChannelOption.SO_REUSEADDR, true);
48-
switch (type) {
60+
switch (preferredTransport) {
4961
case EPOLL:
5062
b.option(EpollChannelOption.SO_REUSEPORT, true);
5163
break;

frameworks/Java/netty/src/main/java/hello/JsonUtils.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.jsoniter.output.JsonStream;
99
import com.jsoniter.output.JsonStreamPool;
10+
import com.jsoniter.spi.Config;
1011
import com.jsoniter.spi.JsonException;
1112

1213
import io.netty.util.concurrent.FastThreadLocal;
@@ -35,7 +36,13 @@ private static void setIndentation(JsonStream stream, int value) {
3536
public static JsonStream acquireJsonStreamFromEventLoop() {
3637
var stream = JSON_STREAM.get();
3738
if (stream == null) {
38-
stream = new JsonStream(null, 512);
39+
stream = new JsonStream(null, 512) {
40+
// this is to save virtual threads to use thread locals
41+
@Override
42+
public Config currentConfig() {
43+
return Config.INSTANCE;
44+
}
45+
};
3946
} else {
4047
stream.reset(null);
4148
JSON_STREAM.set(null);

frameworks/Java/netty/src/main/java/hello/loom/LoomSupport.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@
44
import java.lang.invoke.MethodHandles;
55
import java.lang.reflect.Field;
66
import java.util.concurrent.Executor;
7-
import java.util.concurrent.ForkJoinPool;
8-
9-
import io.netty.util.internal.PlatformDependent;
107

118
public final class LoomSupport {
129
private static final boolean SUPPORTED;

0 commit comments

Comments
 (0)