全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-18 10 分钟 ✍️ juanwangdev

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-threadsCPU核心数IO线程数
worker-threadsIO线程数×8Worker线程数
buffer-size1024缓冲区大小(bytes)
direct-bufferstrue使用堆外内存

缓冲区优化

直接内存配置

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

📝 发现内容有误?点击此处直接编辑

← 上一篇 Tomcat线程池调优
下一篇 → 内嵌容器原理与选择
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库