Jetty 启动需要多长时间?
What is taking long on Jetty startup?
启动 Jetty 在我的 Web 应用程序开始加载之前有很长的延迟(8 秒)
13:50:10 [INFO] jetty-9.4.5.v20170502
13:50:18 [INFO] Scanning elapsed time=146ms
启用调试日志记录后,有两个有趣的步骤
提取依赖war-application,毕竟需要时间(3s)
10:03:13 [DEBUG] Extracting entry = null from jar file:[..]/application-1.0.war
10:03:16 [DEBUG] Unpacked overlay: jar:file:[..]/application-1.0.war!/ to file:[..]
以及以下4s延迟:
10:03:16 [DEBUG] Service loaders found in 0ms
10:03:20 [DEBUG] loaded interface javax.servlet.ServletContainerInitializer
我如何调试或影响造成超过 4 秒延迟的原因?
配置
pom.xml
<dependency>
<groupId>com.company</groupId>
<artifactId>application</artifactId>
<version>1.0</version>
<type>war</type>
</dependency>
[...]
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.5.v20170502</version>
<configuration>
<webApp>
<webInfIncludeJarPattern>empty</webInfIncludeJarPattern>
<containerIncludeJarPattern>empty</containerIncludeJarPattern>
</webApp>
</configuration>
</plugin>
web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.app.AnnotationConfig</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
[...]
</web-app>
您的网络应用程序比普通网络应用程序大(70MB WEB-INF/lib 罐子),但没有什么特别大的(我见过 800MB war 文件)
发生了一些可能导致速度变慢的事情。
- 解压 war 到 WebApp 临时目录
- 解压资源 jar (
WEB-INF/lib/*.jar!/META-INF/resources/
) 到 WebApp 临时目录
- Jar 字节码扫描(对于在
javax.servlet.ServletContainerInitializer
classes 上的 @HandlesType
注释中声明的注释和类型)
如果您的文件系统很慢,那么以上任何一项都会减慢您的速度。
Note: the DEBUG logging of Jetty will tell you the timing of each of those (even breaking down the timing of bytecode scanning timing to the individual jar)
字节码扫描步骤是最常影响启动时间的地方。
不建议为 "empty" 配置 <containerIncludeJarPattern>
,这是 Servlet、JSP、Taglib 运行所必需的。
The containerIncludeJarPattern
default 只是 servlet / jsp / taglib jar。 (扫描需要几微秒)
<webInfIncludeJarPattern>
也不应该只是 "empty",它至少应该包括您的 WEB-INF/classes
内容(又名 .*/classes/.*
)。考虑将其设置为仅扫描您需要的那些 WEB-INF/lib
罐子。 (类似于 .*/lib/spring-.*\.jar$|.*/classes/.*
)
您的 WEB-INF/lib/*.jar
和 WEB-INF/classes
中的 classes 的字节大小实际上是无关紧要的。与时间更相关的是找到的文件数量(甚至是非 class 文件)。
如果您使用资源罐 (WEB-INF/lib/*.jar!/META-INF/resources/
),那么这是您启动缓慢的重要 penalty/source。
你能做什么:
从查看您的 DEBUG 日志开始,它会告诉您哪里有问题。
下一步,如果启动时间很重要,请研究使用 Jetty 的 quickstart
功能(这有 2 个部分,一个构建时组件,用于扫描和构建 jetty-quickstart.xml
包含在您的 war,以及查找并使用 jetty-quickstart.xml
(如果找到)
的运行时模块
最后,如果您正在使用资源罐 (WEB-INF/lib/*.jar!/META-INF/resources/
),请考虑在构建过程中将这些内容移出 WEB-INF/lib
并移至 war 中的正常位置(package
Maven 中的阶段)。这些很方便,但有许多您似乎不喜欢的副作用。 (还要考虑运行时资源解析冲突的问题)。
启动 Jetty 在我的 Web 应用程序开始加载之前有很长的延迟(8 秒)
13:50:10 [INFO] jetty-9.4.5.v20170502
13:50:18 [INFO] Scanning elapsed time=146ms
启用调试日志记录后,有两个有趣的步骤
提取依赖war-application,毕竟需要时间(3s)
10:03:13 [DEBUG] Extracting entry = null from jar file:[..]/application-1.0.war 10:03:16 [DEBUG] Unpacked overlay: jar:file:[..]/application-1.0.war!/ to file:[..]
以及以下4s延迟:
10:03:16 [DEBUG] Service loaders found in 0ms 10:03:20 [DEBUG] loaded interface javax.servlet.ServletContainerInitializer
我如何调试或影响造成超过 4 秒延迟的原因?
配置
pom.xml
<dependency>
<groupId>com.company</groupId>
<artifactId>application</artifactId>
<version>1.0</version>
<type>war</type>
</dependency>
[...]
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.5.v20170502</version>
<configuration>
<webApp>
<webInfIncludeJarPattern>empty</webInfIncludeJarPattern>
<containerIncludeJarPattern>empty</containerIncludeJarPattern>
</webApp>
</configuration>
</plugin>
web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.app.AnnotationConfig</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
[...]
</web-app>
您的网络应用程序比普通网络应用程序大(70MB WEB-INF/lib 罐子),但没有什么特别大的(我见过 800MB war 文件)
发生了一些可能导致速度变慢的事情。
- 解压 war 到 WebApp 临时目录
- 解压资源 jar (
WEB-INF/lib/*.jar!/META-INF/resources/
) 到 WebApp 临时目录 - Jar 字节码扫描(对于在
javax.servlet.ServletContainerInitializer
classes 上的@HandlesType
注释中声明的注释和类型)
如果您的文件系统很慢,那么以上任何一项都会减慢您的速度。
Note: the DEBUG logging of Jetty will tell you the timing of each of those (even breaking down the timing of bytecode scanning timing to the individual jar)
字节码扫描步骤是最常影响启动时间的地方。
不建议为 "empty" 配置 <containerIncludeJarPattern>
,这是 Servlet、JSP、Taglib 运行所必需的。
The containerIncludeJarPattern
default 只是 servlet / jsp / taglib jar。 (扫描需要几微秒)
<webInfIncludeJarPattern>
也不应该只是 "empty",它至少应该包括您的 WEB-INF/classes
内容(又名 .*/classes/.*
)。考虑将其设置为仅扫描您需要的那些 WEB-INF/lib
罐子。 (类似于 .*/lib/spring-.*\.jar$|.*/classes/.*
)
您的 WEB-INF/lib/*.jar
和 WEB-INF/classes
中的 classes 的字节大小实际上是无关紧要的。与时间更相关的是找到的文件数量(甚至是非 class 文件)。
如果您使用资源罐 (WEB-INF/lib/*.jar!/META-INF/resources/
),那么这是您启动缓慢的重要 penalty/source。
你能做什么:
从查看您的 DEBUG 日志开始,它会告诉您哪里有问题。
下一步,如果启动时间很重要,请研究使用 Jetty 的 quickstart
功能(这有 2 个部分,一个构建时组件,用于扫描和构建 jetty-quickstart.xml
包含在您的 war,以及查找并使用 jetty-quickstart.xml
(如果找到)
最后,如果您正在使用资源罐 (WEB-INF/lib/*.jar!/META-INF/resources/
),请考虑在构建过程中将这些内容移出 WEB-INF/lib
并移至 war 中的正常位置(package
Maven 中的阶段)。这些很方便,但有许多您似乎不喜欢的副作用。 (还要考虑运行时资源解析冲突的问题)。