线程池相关
参数默认值
/**
* 最大线程数
*/
private int maxThreads = 200;
/**
* 初始化线程数, 核心线程数
*/
private int minSpareThreads = 10;
相关类:
org.springframework.boot.autoconfigure.web.ServerProperties.Tomcat
执行的策略
当提交任务数> minSpareThreads, 创建新线程执行;
当提交任务数>maxThreads, 任务才会被添加阻塞队列中.
1. 入口方法:
org.apache.tomcat.util.net.AbstractEndpoint#createExecutor
2. 线程池任务执行最终也是调JDK的execute方法:
org.apache.tomcat.util.threads.ThreadPoolExecutor#execute(java.lang.Runnable, long, java.util.concurrent.TimeUnit)
关键代码: if (isRunning(c) && workQueue.offer(command))
3. tomcat自定义阻塞队列TaskQueue, 重写了offer方法:
org.apache.tomcat.util.threads.TaskQueue#offer
关键代码: parent.getPoolSize()
注意:tomcat的线程池不是直接用的JDK的线程池。
查看tomcat的当前线程数
- jstack 进程id | grep http-nio: 需要注意线程的状态, 是waiting, 还是runnable
"http-nio-7001-Acceptor-0" #105 daemon prio=5 os_prio=0 tid=0x00007f951dd89000 nid=0x6f runnable [0x00007f940b7ad000]
"http-nio-7001-ClientPoller-1" #104 daemon prio=5 os_prio=0 tid=0x00007f951da26800 nid=0x6e runnable [0x00007f940b7ee000]
"http-nio-7001-ClientPoller-0" #103 daemon prio=5 os_prio=0 tid=0x00007f951dd8b000 nid=0x6d runnable [0x00007f940b82f000]
"http-nio-7001-exec-10" #102 daemon prio=5 os_prio=0 tid=0x00007f951d18c800 nid=0x6c waiting on condition [0x00007f940b870000]
"http-nio-7001-exec-9" #101 daemon prio=5 os_prio=0 tid=0x00007f951d18a800 nid=0x6b waiting on condition [0x00007f940b8b1000]
"http-nio-7001-exec-8" #100 daemon prio=5 os_prio=0 tid=0x00007f951d188000 nid=0x6a waiting on condition [0x00007f940b8f2000]
"http-nio-7001-exec-7" #99 daemon prio=5 os_prio=0 tid=0x00007f951de27800 nid=0x69 waiting on condition [0x00007f940b933000]
"http-nio-7001-exec-6" #98 daemon prio=5 os_prio=0 tid=0x00007f951de25800 nid=0x68 waiting on condition [0x00007f940b974000]
"http-nio-7001-exec-5" #97 daemon prio=5 os_prio=0 tid=0x00007f951ccae800 nid=0x67 waiting on condition [0x00007f940b9b5000]
"http-nio-7001-exec-4" #96 daemon prio=5 os_prio=0 tid=0x00007f951ccac800 nid=0x66 waiting on condition [0x00007f940b9f6000]
"http-nio-7001-exec-3" #95 daemon prio=5 os_prio=0 tid=0x00007f951ccaa800 nid=0x65 waiting on condition [0x00007f940ba37000]
"http-nio-7001-exec-2" #94 daemon prio=5 os_prio=0 tid=0x00007f951c82d000 nid=0x64 waiting on condition [0x00007f940ba78000]
"http-nio-7001-exec-1" #93 daemon prio=5 os_prio=0 tid=0x00007f951d758000 nid=0x63 waiting on condition [0x00007f940bab9000]
- 使用arthas查看, thread -all | grep http-nio[arthas@1]$ thread -all | grep http-nio
114 http-nio-7004-exec-1 main 5 WAITING 0.0 0.000 0:0.083 false true
115 http-nio-7004-exec-2 main 5 WAITING 0.0 0.000 0:0.068 false true
116 http-nio-7004-exec-3 main 5 WAITING 0.0 0.000 0:0.020 false true
117 http-nio-7004-exec-4 main 5 WAITING 0.0 0.000 0:0.025 false true
118 http-nio-7004-exec-5 main 5 WAITING 0.0 0.000 0:0.191 false true
119 http-nio-7004-exec-6 main 5 WAITING 0.0 0.000 0:0.023 false true
120 http-nio-7004-exec-7 main 5 WAITING 0.0 0.000 0:0.014 false true
121 http-nio-7004-exec-8 main 5 WAITING 0.0 0.000 0:0.021 false true
122 http-nio-7004-exec-9 main 5 WAITING 0.0 0.000 0:0.021 false true
123 http-nio-7004-exec-10 main 5 WAITING 0.0 0.000 0:0.033 false true
124 http-nio-7004-ClientPoller-0 main 5 RUNNABLE 0.0 0.000 0:5.360 false true
125 http-nio-7004-ClientPoller-1 main 5 RUNNABLE 0.0 0.000 0:5.578 false true
126 http-nio-7004-Acceptor-0 main 5 RUNNABLE 0.0 0.000 0:0.037 false true
连接池相关
参数默认值
/**
* server最大accpet的连接数, 超过后还可以接收acceptCount个连接
*/
private int maxConnections = 10000;
/**
* server接收连接达到最大值时,还可以继续接收多少个连接
*/
private int acceptCount = 100;
参数详细介绍
- 最大连接数:基于AQS来实现的。
相关类: org.apache.tomcat.util.threads.LimitLatch
初始化的入口: org.apache.tomcat.util.net.AbstractEndpoint#initializeConnectionLatch
- acceptCount: 最终设置的是serversocket的backlog, 也就是tcp的全连接队列。
初始化的入口: org.apache.tomcat.util.net.NioEndpoint#initServerSocket
注意: tomcat的NIO用的不是Netty。
查看tcp全连接队列命令
- 查看tcp全连接队列使用情况:ss -lnt | grep 端口
State Recv-Q Send-Q
LISTEN 0 100
Recv-Q:队列当前值。
Send-Q:队列的最大值(acceptCount)。
- 查看tcp全连接队列是否溢出:netstat -s | egrep 'listen|LISTEN'
101 times the listen queue of a socket overflowed: 全连接队列溢出数
284 SYNs to LISTEN sockets dropped:半连接队列溢出数