Undertow性能调优
Undertow 是 WildFly 的默认 Web 服务器,采用非阻塞 I/O 架构,吞吐量优于 Tomcat。
架构特点
XNIO 非阻塞模型
YAML
请求 → IO 线程(非阻塞读取) → Worker 线程(业务处理) → 响应
↓
事件驱动,不阻塞
线程分工
- IO 线程:处理网络 I/O,数量建议等于 CPU 核心数
- Worker 线程:执行业务逻辑,数量可较高
核心参数配置
application.yml 配置
Java
server:
undertow:
threads:
io: 8 # IO线程数,建议=CPU核心数
worker: 200 # Worker线程数
buffer-size: 1024 # 每个buffer大小(KB)
direct-buffers: true # 使用直接内存
max-http-post-size: 10MB
参数详解
| 参数 | 默认值 | 说明 |
|---|---|---|
| io-threads | CPU核心数 | IO线程数 |
| worker-threads | IO线程数×8 | Worker线程数 |
| buffer-size | 1024 | 缓冲区大小(bytes) |
| direct-buffers | true | 使用堆外内存 |
缓冲区优化
直接内存配置
Java
@Configuration
public class UndertowBufferConfig {
@Bean
public WebServerFactoryCustomizer<UndertowServletWebServerFactory> bufferCustomizer() {
return factory -> {
factory.addBuilderCustomizers(builder -> {
// 使用直接内存提升性能
builder.setBufferSize(16384); // 16KB
builder.setDirectBuffers(true);
builder.setIoThreads(Runtime.getRuntime().availableProcessors());
});
};
}
}
缓冲区大小计算
Java
buffer-size = 平均请求体大小
direct-buffers = 请求量大时开启
总缓冲区内存 ≈ buffer-size × io-threads × 4
线程池调优
IO 线程配置
Java
@Bean
public WebServerFactoryCustomizer<UndertowServletWebServerFactory> ioThreadCustomizer() {
return factory -> {
factory.addBuilderCustomizers(builder -> {
int cores = Runtime.getRuntime().availableProcessors();
builder.setIoThreads(cores);
});
};
}
Worker 线程配置
Java
@Bean
public WebServerFactoryCustomizer<UndertowServletWebServerFactory> workerThreadCustomizer() {
return factory -> {
factory.addBuilderCustomizers(builder -> {
int cores = Runtime.getRuntime().availableProcessors();
// IO密集型:cores * 2 ~ cores * 4
// CPU密集型:cores + 1
builder.setWorkerThreads(cores * 10);
});
};
}
非阻塞请求处理
异步 Servlet
YAML
@RestController
public class AsyncController {
@GetMapping("/async")
public CompletableFuture<String> asyncRequest() {
return CompletableFuture.supplyAsync(() -> {
// 异步处理业务逻辑
processBusiness();
return "success";
});
}
}
Undertow 异非阻塞处理
Java
@Configuration
public class UndertowAsyncConfig {
@Bean
public UndertowServletWebServerFactory undertowFactory() {
UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory();
factory.addDeploymentInfoCustomizers(deployment -> {
// 启用异步处理
deployment.setAsyncSupported(true);
});
return factory;
}
}
HTTP/2 支持
启用 HTTP/2
Java
server:
http2:
enabled: true
ssl:
enabled: true
key-store: classpath:keystore.p12
key-store-password: password
HTTP/2 配置优化
Java
@Bean
public WebServerFactoryCustomizer<UndertowServletWebServerFactory> http2Customizer() {
return factory -> {
factory.addBuilderCustomizers(builder -> {
builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true);
builder.setServerOption(UndertowOptions.HTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 100);
});
};
}
连接器配置
监听器配置
Java
@Bean
public WebServerFactoryCustomizer<UndertowServletWebServerFactory> listenerCustomizer() {
return factory -> {
factory.addBuilderCustomizers(builder -> {
// HTTP 监听器
builder.addHttpListener(8080, "0.0.0.0");
// AJP 监听器(反向代理场景)
// builder.addAjpListener(8009, "0.0.0.0");
});
};
}
连接限制
text
@Bean
public WebServerFactoryCustomizer<UndertowServletWebServerFactory> connectionCustomizer() {
return factory -> {
factory.addBuilderCustomizers(builder -> {
builder.setServerOption(UndertowOptions.MAX_ENTITY_SIZE, 10485760L); // 10MB
builder.setServerOption(UndertowOptions.MAX_PARAMETERS, 1000);
builder.setServerOption(UndertowOptions.MAX_HEADERS, 200);
});
};
}
性能监控
Undertow 指标
text
@Component
public class UndertowMetrics {
private final MeterRegistry registry;
@EventListener
public void onUndertowStarted(UndertowStartedEvent event) {
// 注册 Undertow 性能指标
registry.gauge("undertow.io.threads", this::getIoThreadCount);
registry.gauge("undertow.worker.threads", this::getWorkerThreadCount);
}
}
注意:直接内存不受 JVM 堆限制,需预留足够系统内存,避免 OOM。
要点总结
- IO 线程数等于 CPU 核心数,Worker 线程数根据业务类型调整
- 直接内存缓冲区提升性能,但需监控内存使用
- HTTP/2 多路复用减少连接开销
- 异步非阻塞处理提升吞吐量
- 根据请求体大小调整 buffer-size
📝 发现内容有误?点击此处直接编辑