Skip to content

Commit cc1929c

Browse files
committed
Add --netty-epoll option
1 parent ac0284a commit cc1929c

File tree

3 files changed

+47
-9
lines changed

3 files changed

+47
-9
lines changed

pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
<micrometer.version>1.15.2</micrometer.version>
6363
<jgroups.version>5.4.8.Final</jgroups.version>
6464
<jgroups-kubernetes.version>2.0.2.Final</jgroups-kubernetes.version>
65+
<netty.version>4.2.3.Final</netty.version>
6566
<gson.version>2.13.1</gson.version>
6667
<resilience4j.version>2.1.0</resilience4j.version>
6768
<logback.version>1.3.15</logback.version>
@@ -169,6 +170,12 @@
169170
<artifactId>jgroups-kubernetes</artifactId>
170171
<version>${jgroups-kubernetes.version}</version>
171172
</dependency>
173+
<dependency>
174+
<groupId>io.netty</groupId>
175+
<artifactId>netty-transport-native-epoll</artifactId>
176+
<version>${netty.version}</version>
177+
<classifier>linux-x86_64</classifier>
178+
</dependency>
172179

173180
<dependency>
174181
<groupId>org.junit.jupiter</groupId>

src/main/java/com/rabbitmq/perf/PerfTest.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@
4242
import com.rabbitmq.perf.metrics.MetricsFormatterFactory.Context;
4343
import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
4444
import io.netty.channel.EventLoopGroup;
45+
import io.netty.channel.IoHandlerFactory;
4546
import io.netty.channel.MultiThreadIoEventLoopGroup;
47+
import io.netty.channel.epoll.EpollIoHandler;
4648
import io.netty.channel.nio.NioIoHandler;
4749
import java.io.*;
4850
import java.math.BigDecimal;
@@ -855,10 +857,13 @@ private static ConnectionFactory configureNettyIfRequested(
855857
CommandLineProxy cmd, ConnectionFactory factory, ShutdownService shutdownService) {
856858
if (netty(cmd)) {
857859
int nbThreads = Utils.intArg(cmd, "ntyt", -1);
860+
boolean epoll = hasOption(cmd, "ntyep");
861+
IoHandlerFactory ioHandlerFactory =
862+
epoll ? EpollIoHandler.newFactory() : NioIoHandler.newFactory();
858863
EventLoopGroup eventLoopGroup =
859864
nbThreads > 0
860-
? new MultiThreadIoEventLoopGroup(nbThreads, NioIoHandler.newFactory())
861-
: new MultiThreadIoEventLoopGroup(NioIoHandler.newFactory());
865+
? new MultiThreadIoEventLoopGroup(nbThreads, ioHandlerFactory)
866+
: new MultiThreadIoEventLoopGroup(ioHandlerFactory);
862867
shutdownService.wrap(() -> eventLoopGroup.shutdownGracefully(0, 0, TimeUnit.SECONDS));
863868
factory.netty().eventLoopGroup(eventLoopGroup);
864869
}
@@ -868,7 +873,8 @@ private static ConnectionFactory configureNettyIfRequested(
868873
private static boolean netty(CommandLineProxy cmd) {
869874
boolean netty = hasOption(cmd, "nty");
870875
int nbThreads = Utils.intArg(cmd, "ntyt", -1);
871-
return netty || nbThreads > 0;
876+
boolean epoll = hasOption(cmd, "ntyep");
877+
return netty || nbThreads > 0 || epoll;
872878
}
873879

874880
static MulticastSet.CompletionHandler getCompletionHandler(
@@ -1445,6 +1451,12 @@ static Options getOptions() {
14451451
"netty-threads",
14461452
true,
14471453
"number of Netty threads to use (default is Netty's default)"));
1454+
options.addOption(
1455+
new Option(
1456+
"ntyep",
1457+
"netty-epoll",
1458+
false,
1459+
"use Netty's native epoll transport (Linux x86-64 only)"));
14481460

14491461
return options;
14501462
}

src/test/java/com/rabbitmq/perf/it/PerfTestIT.java

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333
import org.junit.jupiter.api.BeforeAll;
3434
import org.junit.jupiter.api.BeforeEach;
3535
import org.junit.jupiter.api.Test;
36+
import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
37+
import org.junit.jupiter.api.condition.EnabledOnOs;
38+
import org.junit.jupiter.api.condition.OS;
3639
import org.junit.jupiter.params.ParameterizedTest;
3740
import org.junit.jupiter.params.provider.EnumSource;
3841

@@ -105,6 +108,16 @@ void tlsWithDefaultSslContextShouldFail(IoLayer ioLayer) throws Exception {
105108
assertThat(consoleOutput()).contains("test stopped");
106109
}
107110

111+
@Test
112+
@EnabledOnOs(OS.LINUX)
113+
@EnabledIfSystemProperty(named = "os.arch", matches = "amd64")
114+
void nativeEpollWorksOnLinux() throws Exception {
115+
int messageCount = 1000;
116+
run(builder().pmessages(messageCount).cmessages(messageCount).nettyThreads(1).nettyEpoll());
117+
waitRunEnds();
118+
assertThat(consoleOutput()).contains("starting", "stopped", "avg");
119+
}
120+
108121
private static void waitOneSecond() throws InterruptedException {
109122
wait(Duration.ofSeconds(1));
110123
}
@@ -154,24 +167,30 @@ ArgumentsBuilder nettyThreads(int threads) {
154167
}
155168

156169
ArgumentsBuilder uri(String uri) {
157-
this.arguments.put("uri", uri);
158-
return this;
170+
return this.argument("uri", uri);
159171
}
160172

161173
ArgumentsBuilder sni(String sni) {
162-
this.arguments.put("server-name-indication", sni);
163-
return this;
174+
return argument("server-name-indication", sni);
164175
}
165176

166177
ArgumentsBuilder useDefaultSslContext() {
167-
this.arguments.put("use-default-ssl-context", "true");
168-
return this;
178+
return argument("use-default-ssl-context", "true");
179+
}
180+
181+
public ArgumentsBuilder nettyEpoll() {
182+
return argument("netty-epoll", "true");
169183
}
170184

171185
ArgumentsBuilder rate(int rate) {
172186
return intArgument("rate", rate);
173187
}
174188

189+
private ArgumentsBuilder argument(String key, String value) {
190+
this.arguments.put(key, value);
191+
return this;
192+
}
193+
175194
private ArgumentsBuilder intArgument(String key, int value) {
176195
this.arguments.put(key, String.valueOf(value));
177196
return this;

0 commit comments

Comments
 (0)