Embedded Jetty 9首次请求响应过慢及负载异常问题排查
解决Embedded Jetty首次请求慢及负载骤升的配置调整方案
1. 预热Web应用上下文
Jetty默认不会在启动时完全初始化WebAppContext,首次请求才触发Spring容器、Servlet等组件的初始化,这是首次请求延迟的核心原因。可以在启动阶段主动完成预热:
- 调用
context.getServletContext()触发ServletContext初始化 - 模拟一次轻量请求(如健康检查接口)触发Spring Bean实例化
context.start(); // 触发ServletContext初始化 ServletContext servletContext = context.getServletContext(); // 发送预热请求 HttpClient httpClient = new HttpClient(); httpClient.start(); httpClient.GET("http://localhost:" + port + "/health"); // 替换为你的轻量接口 httpClient.stop();
2. 优化线程池配置
当前代码中线程池初始化参数与描述不一致,需统一并调整以下项:
- 预先启动核心线程:调用
prestartAllCoreThreads(),在启动时创建所有核心线程,避免负载突增时的线程创建开销 - 延长线程空闲超时:默认60秒闲置后线程会被销毁,调整为
setIdleTimeout(300000)(5分钟),减少线程重建次数
QueuedThreadPool jettyThreadPool = new QueuedThreadPool(50, 500, 60000); jettyThreadPool.setIdleTimeout(300000); jettyThreadPool.prestartAllCoreThreads(); server.setThreadPool(jettyThreadPool);
3. 调整WebAppContext初始化参数
- 禁用文件映射缓冲:设置
context.setInitParameter("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false"),避免首次请求时的文件缓冲初始化开销 - 启用并行类加载:使用
ParallelWebAppClassLoader替代默认类加载器,提升类加载速度
context.setClassLoader(new ParallelWebAppClassLoader(context)); context.setInitParameter("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");
4. 优化ServerConnector配置
- 增大接受队列:设置
serverConnector.setAcceptQueueSize(2048)(默认100),避免高负载时请求被拒绝 - 开启TCP连接复用:设置
serverConnector.setReuseAddress(true),提升连接复用率
ServerConnector serverConnector = new ServerConnector(server, new HttpConnectionFactory()); serverConnector.setPort(port); serverConnector.setAcceptQueueSize(2048); serverConnector.setReuseAddress(true); server.addConnector(serverConnector);
5. 关闭不必要特性
- 禁用JSP预编译检查:若应用不使用JSP,设置
context.setInitParameter("org.eclipse.jetty.jsp.precompiled", "true"),关闭JSP相关扫描逻辑 - 临时关闭访问日志:调试阶段可关闭
RequestLogHandler,减少IO开销
内容的提问来源于stack exchange,提问作者Jeevi
相关产品推荐
相关产品推荐

