Tomcat 性能调优

藏道书院 / 2023-08-20 / 原文

服务的性能好不好,主要是两个指标:QPS、TPS。

Tomcat 使用的也是 java 中的 NIO。

Tomcat 配置调优

Tomcat 也是 Java 程序,建议先看看 JDK1.8 中的 JVM 参数优化。

下面是对嵌入式 Tomcat:9.0.78 的配置:

server.port=8080
# 应用的访问路径
server.servlet.context-path=/

# http 是建立在 socket 上的,max-connections 和 accept-count 和 socket 有关。

# 设置 accept 队列(完全连接队列)的大小。
#
# 就是说 tcp 三次握手完成后,会将这个客户端连接放到 accept 队列,然后通过 accept() 方法获取到这些客户端连接,
# 当这个 accept 队列满了之后,新的 socket 连接就会等待一会,如果还是不能添加到 accept 队列,就会直接断开连接。
#
# max-connections 和 accept-count 看下面的 Acceptor 线程的作用。
server.tomcat.accept-count=100

# 最大连接数:服务端能支持多少个客户端同时连接。
server.tomcat.max-connections=8192


# 下面这两个就是对 tomcat 工作线程池的配置,指定最大线程数和最小线程数。
server.tomcat.threads.max=200
server.tomcat.threads.min-spare=10

# 连接超时,单位是毫秒。
#
# 当 socket 连接成功后,指定时间内 Read 不到浏览器发送的数据,就会关闭连接。
# 服务端接受完数据后,就需要应答(比如返回 200),如果在指定时间内没有把数据 Write 出去,也会关闭连接。
server.tomcat.connection-timeout=20000

三种不同功能的线程

  1. 一个调用 accept() 方法的线程:http-nio-{端口号}-Acceptor
  2. 一个调用 selector.select 方法的线程:http-nio-{端口号}-Poller
  3. 工作线程的线程池:http-nio-{端口号}-exec-{线程序号}
    工作线程数量就是配置的最大线程数。

Acceptor 线程的作用:

  1. 判断连接的请求有没有大于 max-connections,如果大于了就不会调用 accept() 方法了,等连接数小于了 max-connections 后才继续调用。
  2. 调用 accept() 方法来获取,已经连接成功的客户端(SocketChannel)。
    连接成功就是三次握手完成,可以相互通讯了。
  3. 将 SocketChannel 注册到 Selector 上,监听的是 SelectionKey.OP_READ 事件。

Poller 线程的作用:

  1. 调用 selector.select(1000) 方法获取,发生了 SelectionKey.OP_READ 事件的 SocketChannel。
  2. 将 SocketChannel 封装成一个任务,提交到工作线程的线程池里面。

mac 系统缓存

嵌入式 tomcat 在启动后,会生成一个基础目录在 /private/var/folders/34/qj8r8ggx205_mrvsg0tsr0sr0000gn/T 目录下,目录名字是 tomcat 开头,不需要可以删除。

参考资料

https://tomcat.apache.org/tomcat-9.0-doc/config/http.html

https://segmentfault.com/a/1190000008064162

https://juejin.cn/post/7130909498285228040