封面图片

编程

聊聊Spring Boot集成的Tomcat网络连接

我们在面试回答一些高并发的解决方案,或者需要开发高并发应用的时候都会涉及到应用程序的网络连接配置问题。Web容器Tomcat的配置项对于整个高并发项目来说是其中重要的一环。


重要的配置参数

Spring Boot项目的Tomcat的重要的几个参数配置都在server.tomcat下面。

1server: 2 tomcat: 3 max-connections: 8192 4 accept-count: 100 5 thread: 6 max: 200 7 min-spare: 10

其中tomcat默认的最大连接数是8192,等待连接队列是100。工作线程最大是200,最小是10。

这些参数是什么意思,它们又是如何影响并发请求性能的呢?

背景知识

理解这些参数之前,先让我们熟悉一下评价高并发应用性能的一个指标QPS。

QPS:queries per second,指的是每秒的请求数。请求数越高,并发性能越强。

这里一个请求可以被看做一个独立的客户端。连接指的就是客户端和服务端建立的通信通道。

长连接就是保持这个通道存在一段时间,客户端发送的多个请求都使用同一个连接。

现在来看tomcat的几个参数。

max-connections

最大连接数就是客户端可以和应用程序之间可以建立的最大连接。客户端发送请求,应用程序去处理请求,都需要在客户端和应用端建立连接,连接建立之后才能对请求进行处理。正常情况下,一个请求都会对应一个连接,请求处理完成后,连接就断开,处理下个请求的时候就会建立一个新的连接。这是常见的短连接的情况,也就是http1.0。当nginx作为客户端访问应用程序接口时,默认使用的就是短连接,一个请求一个连接,这个可以设置成长连接。

当连接变成长连接之后,同一连接就可以处理多个请求。那么长连接模式下,理论上QPS是会提高一些的,因为它减少了连接建立的时间。长连接有一个保持时间,就是当同一客户端在这个时间段内没有新的请求,连接就会进入time_wait状态。那么使用长连接虽然减少了建立连接的时间,但是因为长连接一直存在,占据了一定的资源,当不使用时,又没有及时释放,对服务器的资源是一种浪费。这个时候就需要去修改一些服务器参数去调整这个time_wait状态下的连接了。

如果把应用程序提供服务看做一个餐厅,比如海底捞。那么最大连接数就是这家海底捞餐厅最多可以服务的食客数量。

accept-count

accpet-count指的是连接等待队列。

当同一时间请求数超过设置的最大连接数之后,新的请求就会放进连接等待队列。

这个就相当于海底捞外面排队的人数。

thread.max

thread.max指的是最大工作线程。

请求通过连接被接受后,需要线程去处理请求,并将处理结果返回。线程可以循环遍历处理多个连接的请求。所以一般情况下工作线程都大大小于连接数。

工作线程通过CPU核心去执行指令,所以线程的配置要考虑到服务器的CPU的性能。

工作线程就可以看做海底捞餐厅的配菜员,当餐厅人数爆满,就需要所有配餐员都参与到配菜工作中。当餐厅就餐人数减少,不需要这么多配餐员时,这些配餐员就可以休息或者下班回家。这个时候,餐厅只需要保证有少数几个配餐员来满足就餐需要就可以。这个就相当于最小工作线程。

min-spare

min-spare指的是最小工作线程,也就是系统处在空闲状态下时,或者请求量很小时的工作线程数,这些线程会常驻系统,来处理请求。

请求超时时间

其他需要说明的一个参数,请求超时时间。当应用程序已经满负荷运作,已经达到最大连接,等待队列已经满了。或者虽然连接已经建立了,请求也被应用程序接受了,但是应用程序因为资源占用高,或许接口处理速度慢,导致长时间数据没有返回,超过了请求设置的超时时间。则客户端就会发送断开连接的请求。如果已经建立连接,在服务端的连接状态里查看就是close_wait。这个是需要特别关注的。

拿海底捞举例就是2种情况,第一种是外面排队也已经满了,新的想吃饭的人在店外徘徊了一段时间,看看有没有位置空出来。还有一种情况就是已经在等位,或者等待配餐员送餐了,但等了很久都没结果,就离开了。

以上的配置参数可以在spring-boot-autoconfigure包的spring-configuration-metadata.json中查看。

总结

纸上得来终觉浅,我们可以通过搭建环境去测试各个参数的作用,比如写一个简单的测试接口,配置参数为不同的值,使用JMeter工具去进行测试。自己动手做一遍,体会会更深入。当然,tomcat除了以上几个重要的配置参数外,还有其他的参数,这些参数在上面提到的json文件中都有描述。对于网络编程来说,涉及的知识点很多,有服务器方面的,有web容器方面的,计算机网络模型等,需要把这些知识块串联起来看,就更容易理解其中的知识点。这是一个循序渐进的过程,也会是一个来回往复的过程,也需要理论结合实践,这就是学习。当你把知识拼图都拼的差不多了,就会有一种掌控的感觉。

2023年09月28日
在初学者眼中,世界充满了可能;专家眼中,世界大都已经既定。--铃木俊隆