基础级别
1. Tomcat的线程池如何配置?主要参数有哪些?
答案:
Tomcat使用Executor(线程池)来处理请求。线程池配置直接影响并发处理能力和资源使用。
核心配置参数:
xml
<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="200"
minSpareThreads="25"
maxIdleTime="60000"
prestartminSpareThreads="true"/>
<Connector port="8080"
protocol="HTTP/1.1"
executor="tomcatThreadPool"/>
参数详解:
- maxThreads (默认200) - 最大线程数,决定最大并发处理能力
- minSpareThreads (默认25) - 最小空闲线程数
- maxIdleTime (默认60000ms) - 线程空闲超时时间
- prestartminSpareThreads (默认false) - 是否在启动时创建线程
调优建议:
根据硬件资源: maxThreads = CPU核心数 × 2 到 CPU核心数 × 4
根据业务特点:
- CPU密集型: maxThreads = CPU核心数 + 1
- I/O密集型: maxThreads = CPU核心数 × 2 或更多
源码位置: java/org/apache/catalina/core/StandardThreadExecutor.java
2. 如何为Tomcat配置JVM参数以优化性能?
答案:
基础配置:
bash
JAVA_OPTS="-Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
G1 GC配置(推荐):
bash
JAVA_OPTS="-Xms4g -Xmx4g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=16m"
完整生产环境配置:
bash
JAVA_OPTS="
-server
-Xms8g -Xmx8g -Xmn3g
-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+DisableExplicitGC
-Xlog:gc*:file=/var/log/tomcat/gc.log:time
-XX:+HeapDumpOnOutOfMemoryError
"
内存大小建议:
| 应用规模 | 堆内存 | 元空间 |
|---|---|---|
| 小型 | 1-2GB | 256MB |
| 中型 | 2-4GB | 512MB |
| 大型 | 4-8GB | 1GB |
3. 如何优化Tomcat的静态资源处理性能?
答案:
1. 启用DefaultServlet缓存:
xml
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>cacheMaxSize</param-name>
<param-value>102400</param-value>
</init-param>
<init-param>
<param-name>cacheTTL</param-name>
<param-value>60000</param-value>
</init-param>
</servlet>
2. 启用Gzip压缩:
xml
<Connector port="8080"
protocol="HTTP/1.1"
compression="on"
compressionMinSize="1024"
compressibleMimeType="text/html,text/xml,text/css,text/javascript"/>
3. 使用Nginx反向代理:
nginx
location ~* \.(jpg|css|js)$ {
root /var/www/static;
expires 30d;
}
性能提升: 启用缓存可改善50-80%响应时间,Gzip可节省60-80%带宽
源码位置: java/org/apache/catalina/servlets/DefaultServlet.java
中级级别
4. 如何优化数据库连接池配置?
答案:
Tomcat JDBC Pool:
xml
<Resource name="jdbc/MyDB"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mydb"
username="root"
password="password"
initialSize="10"
maxActive="100"
maxIdle="50"
minIdle="10"
maxWait="10000"
testOnBorrow="true"
validationQuery="SELECT 1"/>
HikariCP(推荐):
xml
<Resource name="jdbc/MyDB"
type="javax.sql.DataSource"
factory="com.zaxxer.hikari.HikariJNDIFactory"
jdbcUrl="jdbc:mysql://localhost:3306/mydb"
username="root"
password="password"
minimumIdle="10"
maximumPoolSize="100"/>
连接池大小计算: 最优连接数 = ((核心数 × 2) + 有效磁盘数)
性能对比:
| 连接池 | 性能 | 稳定性 |
|---|---|---|
| HikariCP | 最优 | 优秀 |
| Tomcat JDBC | 良好 | 优秀 |
源码位置: java/org/apache/tomcat/jdbc/pool/DataSource.java
5. Tomcat的Connector有哪些性能相关配置?
答案:
xml
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="200"
acceptCount="100"
connectionTimeout="20000"
maxConnections="10000"
compression="on"
keepAliveTimeout="60000"
maxKeepAliveRequests="100"/>
关键参数:
- acceptCount - 请求队列长度(默认100)
- maxConnections - 最大连接数(NIO默认10000)
- connectionTimeout - 连接超时(默认20000ms)
- keepAliveTimeout - Keep-Alive超时
- compression - HTTP压缩
高并发场景配置:
xml
<Connector port="8080"
maxThreads="500"
acceptCount="500"
maxConnections="20000"
compression="on"/>
源码位置: java/org/apache/coyote/http11/AbstractHttp11Protocol.java
高级级别
6. 如何使用APR提升Tomcat性能?
答案:
APR(Apache Portable Runtime)使用本地代码,可显著提升I/O性能。
安装APR (Linux):
bash
sudo apt-get install libapr1-dev libssl-dev
cd $CATALINA_HOME/bin
tar xzf tomcat-native.tar.gz
cd tomcat-native-*-src/native
./configure --with-apr=/usr/bin/apr-1-config \
--with-java-home=$JAVA_HOME
make && sudo make install
配置APR Connector:
xml
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="500"
maxConnections="20000"
compression="on"/>
性能对比:
| I/O模型 | 吞吐量 | 延迟 | CPU使用 |
|---|---|---|---|
| NIO | 150% | 80% | 中 |
| APR | 200% | 60% | 低 |
验证APR: 查看启动日志中的 "Loaded APR based Apache Tomcat Native library"
源码位置: java/org/apache/coyote/http11/Http11AprProtocol.java
7. 如何进行Tomcat性能监控?
答案:
1. JMX监控:
bash
CATALINA_OPTS="
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
"
使用JConsole连接: service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi
关键MBean:
Catalina:type=ThreadPool- 线程池状态Catalina:type=GlobalRequestProcessor- 请求统计java.lang:type=Memory- 内存使用
2. AccessLog性能记录:
xml
<Valve className="org.apache.catalina.valves.AccessLogValve"
pattern="%h %t "%r" %s %b %D"
directory="logs"/>
%D 显示请求处理时间(毫秒)
3. 关键性能指标:
| 指标 | 目标值 |
|---|---|
| 响应时间 | <200ms |
| 吞吐量 | >1000 req/s |
| 错误率 | <0.1% |
| CPU使用率 | <70% |
8. 如何进行Tomcat压力测试?
答案:
使用Apache Bench:
bash
ab -n 10000 -c 100 http://localhost:8080/app/
参数: -n 总请求数, -c 并发数
使用JMeter:
xml
<ThreadGroup>
<stringProp name="ThreadGroup.num_threads">100</stringProp>
<stringProp name="ThreadGroup.ramp_time">10</stringProp>
<stringProp name="ThreadGroup.duration">300</stringProp>
</ThreadGroup>
关键指标分析:
- 响应时间分布 - P50, P95, P99
- 吞吐量曲线 - 找到最大吞吐量点
- 错误率 - 监控5xx错误
调优流程:
- 建立基准测试
- 单一变量调优
- 记录性能变化
- 重复测试验证