服务器性能参数
Tomcat连接参数
http连接过程
http底层以TCP IP协议实现,通过建立socket套接字进行通信。tomcat启动后,会等待客户端进行连接,连接成功后发送和接收数据,在一段时间没有数据收发后(connectionTimeout设置),就自动断开。
浏览器客户端同tomcat服务器的连接通常会设置成长连接(Header里设置keep-alive),只要空闲时间不超过connectionTimeout就不会释放。但每次请求和响应又是瞬时的发送和返回数据,因此每次请求可以看成瞬时连接。
tomcat连接建立处理和释放示意图:
bio模式建立连接后则到线程池中取出一个线程来处理该连接,直到该连接释放才释放线程,如果没有可用线程,则阻塞等待。
nio模式建立连接后会将该连接放到一个队列中(多路复用器),当连接中有请求时就到线程池中取出一个线程来处理(由Poller到队列中抓取请求),处理完后释放线程。
可以看出在TCP长连接多请求的场景中,bio模式的连接数不能超过线程池的最大线程数(maxThreads),而nio的连接数则可以远大于maxThreads。
连接参数配置
tomcat线程数等性能参数在Connector标签中配置
,如:
<Connector port="80" acceptCount="3" maxThreads="2" maxConnections="10" protocol="org.apache.coyote.http11.Http11NioProtocol " connectionTimeout="20000"
redirectPort="8443" />
配置中的参数含义:
maxConnections:最大连接数,也就是客户端同tomcat建立的最大socket连接数。注意连接建立以后不一定马上开始处理,也会排队等待。只有开始处理以后才可能占用线程。
maxThreads:tomcat的处理线程数,连接建立以后,tomcat需要开线程调用java逻辑(servlet等)处理客户请求,这里就是配置能开的最大线程数。
采用bio方式时,每个连接从开始处理到断开都会一直占用一个线程。采用nio方式,只有开始处理连接时,它会将连接注册到一个多路复用器上,等待该连接有请求时才启动线程来处理,请求处理完后释放线程,即使连接没有断开,也不会一直占用一个线程。bio模式在连接没有请求时也会占用线程,会浪费资源。
最终结果就是并发量很大的情况下处理同样多的连接,采用bio时会有很多线程因为连接没释放而闲置(线程也会占用内存),而nio则可以充分利用线程,更大程度压榨CPU,让线程忙碌起来,同时也避免闲置的线程占用内存,用同样的线程数和内存处理更多请求。
注意:只有在长连接情况下(实际中浏览器也基本都是长连接,都采用HTTP1.1以上协议),nio模式性能才明显比bio高,如果都是短连接,则每次请求结束就立即释放连接,连接没有闲置状态, nio模式的优势也无法体现。但短连接的每次请求都需要建立和释放连接,开销非常大。
maxConnections配置数量:
bio和nio模式中,maxConnections应该大于等于maxThreads,否则实际线程数无法达到maxThreads,因为bio和nio最多为每个处理中的连接开一个线程,而maxConnections比maxThreads小则线程数无法达到maxThreads。
bio方式通常只配置maxThreads,而不配置maxConnections,默认等于 maxThreads,因为可以同时处理的连接最大就为maxThreads,如果maxConnections配置比maxThreads大,则多余的连接获取不到线程也无法处理,只能等待,完全可以把已建立并且等待处理中的这些多余连接配置到acceptCount中去。如果maxConnections比maxThreads小,则等同于将maxThreads降为跟maxConnections相同的效果。
nio模式配置maxConnections则有意义,因为它可以同时处理的连接比maxThreads大很多,连接都被放到了多路复用器里(一个队列中),配置较大的maxConnections以后可以用很少的线程同时处理很多连接。(nio的maxConnections不配置时默认为10000个)。
acceptCount:等待连接的数量,还未建立连接的客户端排队等待的数量,超出该数量就给客户端返回连接失败。
protocol:设置bio、nio、apr,分别为:
org.apache.coyote.http11.Http11Protocol:bio,同步阻塞
org.apache.coyote.http11.Http11NioProtocol:nio,同步非阻塞
org.apache.coyote.http11.Http11AprProtocol:apr,异步非阻塞
bio模式在tomcat8中已经废弃,建议使用nio或者apr
connectionTimeout:连接空闲时超过改时间就自动断开。
port:端口
测试:
tomcat配置:
<Connector port="80" acceptCount="3" maxThreads="2" maxConnections="10" protocol="org.apache.coyote.http11.Http11Protocol" connectionTimeout="20000"
redirectPort="8443" />
程序中让线程sleep 10秒
然后用jemeter在1秒内开30个线程调用测试:
测试输出:
可以看出开了2个线程,每隔10秒打印一次,跟maxThreads="2"maxThreads=2配置的一致。
jmeter结果:
13个成功,17个失败。
反映了acceptCount="3",maxConnections="10"配置,建立连接的数量加上排队数量为13个,其余17个请求被直接拒绝。
本来想测试将maxThreads设置为1,bio模式下开启keepalive让服务器被一个浏览器长时间占用连接的情况:
配置:
<Connector
port="80"
acceptCount="10000"
maxThreads="1"
protocol="org.apache.coyote.http11.Http11Protocol"
connectionTimeout="10000"
redirectPort="8443" />
由于tomcat内部做了优化,当使用线程数达到maxThreads的75%时,会自动关闭keepalive。因此该测试的效果不佳。
tomcat上的maxThreads、maxConnections等配置参数是根据服务器的内存、cpu等情况配置成合适的数量,最大化使用服务器性能,如果服务器就一个应用,则maxThreds、maxConnections等可以配置到尽量占满服务器内存以重复利用服务器资源,如果服务器有多个应用,则要根据情况调整每个应用的maxThreads等参数,一般情况下maxThreads配置到1000左右,maxConnections配置到10000左右可满足要求。
tomcat的配置参数并不能解决服务器性能瓶颈。服务器的性能受制于多种因素,如程序的复杂度(消耗cpu的程度)、数据库瓶颈、文件io瓶颈等,如果这些瓶颈已经达到,则再增大tomcat线程数等配置也无法提高吞吐量。tomcat参数只会因为配置过小,没有充分发挥服务器的内存、cpu等性能而成为瓶颈。因此只要tomcat参数不要配置过小,就不会成为瓶颈。
服务器性能通常使用吞吐量来量化(单位时间如1秒钟处理的请求数量),当测试接口没有任何处理逻辑,cpu、内存、io等消耗接近于0的空方法,此时吞吐量受制于tomcat参数配置和服务器的内存,这也是一种理想状态,实际中一般不可能达到,而是各种优化策略所追求的目标。如果这种情况还不能满足吞吐量要求,就只能增加服务器内存等硬件了。
并发量是指服务器同时处理的请求个数,并发量不能直接衡量服务器性能,而需要加上处理时间才行,如:2000个并发请求在2秒钟时间内得到响应。
通常影响接口响应时间的是网络、接口调用(调用其他接口)、io(数据库读写、文件读写等)、cpu计算等,需要先找到性能瓶颈再加以优化。
数据库连接参数
数据库经常成为性能瓶颈,优化数据库是提高系统吞吐量的重点。
通常连接数据库会采用连接池,避免频繁创建和释放连接,减少开销同时统一管理连接数量。
连接池连接参数:
springboot默认会采用tomcat的dbcp连接池,可以进行连接数配置,如:
当连接池的连接被使用完,无法获取到新连接使用时,会提示如下错误:
mysql服务器连接参数
连接数
同时mysql本身也可以对连接数量进行配置:
sudo vim /etc/my.cnf
(windows在mysql安装目录的my.ini)
# mysql总的最大连接数量,默认100,一般设置到500-1000
set-variable=max_connections=1000
# 每个用户的最大连接数量
set-variable=max_user_connections=500
# 连接无操作的闲置时间,达到以后会断开连接
set-variable=wait_timeout=200
修改以后需要重启mysql服务生效
sudo service mysqld restart
超过了用户最大连接数max_user_connections时会提示:
超过最大连接数max_connections时,会提示:
增大连接数可以在一定程度上提高数据库吞吐量,但并发量越大,响应时间也越长:
如:
1个并发:
响应时间
2个并发:
响应时间
3个并发:
响应时间:
5个并发:
响应时间:
50个并发:
响应时间:
浙公网安备 33010602011771号