一、SpringBoot 内置 Tomcat 对请求数的设置
1、maxThreads
:最大线程数
每一次HTTP请求到达Web服务,tomcat都会创建一个线程来处理该请求,那么最大线程数决定了Web服务容器可以同时处理多少个请求。
maxThreads 默认 200,建议增加,但增加线程是有成本的,更多的线程,不仅仅会带来更多的线程上下文切换成本,而且意味着带来更多的内存消耗。JVM中默认情况下在创建新线程时会分配大小为 1M 的线程栈,所以,更多的线程异味着需要更多的内存。
线程数的经验值为:
- 1核CPU + 2g内存,线程数经验值200;
- 2核CPU + 4g内存,线程数经验值400;
- 4核CPU + 8g内存,线程数经验值800。
2、accept-count
:最大等待数
当所有的请求处理线程都在使用时,所能接收的连接请求的队列的最大长度。当队列已满时,任何的连接请求都将被拒绝。accept-count 的默认值为 100。
详细的来说就是,当调用 HTTP 请求数达到 tomcat 的最大线程数时,还有新的 HTTP 请求到来,这时 tomcat 会将该请求放在等待队列中,这个 acceptCount 就是指能够接受的最大等待数,默认100。如果等待队列也被放满了,这个时候再来新的请求就会被tomcat拒绝(connection refused)。
3、maxConnections
:最大连接数
这个参数是指在同一时间,tomcat 能够接受的最大连接数。对于 Java 的阻塞式 BIO,默认值是 maxthreads 的值;如果在 BIO 模式使用定制的 Executor 执行器,默认值将是执行器中 maxthreads 的值。对于 Java 新的 NIO 模式,maxConnections 默认值是10000。
对于 windows上APR/native IO 模式,maxConnections 默认值为 8192,这是出于性能原因,如果配置的值不是1024的倍数,maxConnections 的实际值将减少到1024的最大倍数。 如果设置为-1,则禁用maxconnections功能,表示不限制tomcat容器的连接数。 maxConnections和accept-count的关系为:当连接数达到最大值maxConnections后,系统会继续接收连接,但不会超过acceptCount的值。
二、TPS 与 QPS
1、TPS
TPS(Transactions Per Second),意思是每秒事务数。一个事务是指客户端向服务器发送请求然后服务器做出反应的过程,具体的事务定义,可以是一个接口、多个接口、一个业务流程等等。以单接口定义为事务举例,每个事务包括了如下3个过程:
- 向服务器发请求;
- 服务器自己的内部处理(包含应用服务器、数据库服务器等);
- 服务器返回结果给客户。
如果每秒能够完成 N 次以上3个过程,TPS 就是 N。
TPS 是软件测试结果的测量单位。我们在进行服务性能压测时,接口层面最常关注的是最大 TPS 以及接口响应时间,个人理解 TPS 可以指一组逻辑相关的请求,而服务整体处理能力取决于处理能力最低模块的TPS值。
2、QPS
QPS(Queries Per Second),意思是每秒查询数。指一台服务器每秒能够响应的查询次数,用于衡量特定的查询服务器在规定时间内所处理流量多少,主要针对专门用于查询的服务器的性能指标,比如 dns,它不包含复杂的业务逻辑处理,比如数据库中的每秒执行查询 sql 的次数。
QPS 只是一个简单查询的统计显然,不能描述增删改等操作,显然它不够全面,所以不建议用 QPS 来描述系统整体的性能;
QPS 基本类似于 TPS,但是不同的是,对于一个事务访问,会形成一个 T;但一次 T 中,可能产生多次对服务器的请求,服务器对这些请求,就可计入 QPS 之中。
QPS 的计算公式: QPS = req/sec = 请求数/秒
3、TPS 与 QPS 的区别
- 如果是对一个查询接口压测,且这个接口内部不会再去请求其它接口,那么 TPS = QPS,否则,TPS ≠ QPS
- 如果是容量场景,假设 N 个接口都是查询接口,且这个接口内部不会再去请求其它接口,QPS = N * TPS