服务端架构:Springboot web工程,mybatis连接数据库,c3p0连接池连接数据库。
测试工具:jmeter
单线程访问(单客户端)
总访问次数:289,803次,返回81631次,耗时8分50秒。并发量546次/秒
问题描述:
16300次后卡顿
32000次后卡顿
48000次后卡顿
65294次后卡顿
81631次后卡顿
...
响应时序图
问题现象:接口周期性的连不上。
10客户端同时访问(同时开启10个线程)
总访问次数:281,714次,返回81631次,耗时8分50秒。并发量531次/秒
问题描述:
16023次后卡顿
32281次后卡顿
48551次后卡顿
64842次后卡顿
81128次后卡顿
...
响应时序图
问题现象:可以发现客户端数量不影响测试结果。
更换连接数据库池的中间件,c3p0改成druid连接池
单线程访问(单客户端)
总访问次数:269,896次,返回81655次,耗时8分50秒。并发量509次/秒
问题描述:
16121次后卡顿
32251次后卡顿
48486次后卡顿
64784次后卡顿
81655次后卡顿
可以发现不同的连接池不影响测试结果。
修改连接池最大连接数20改成200
问题描述:
17307次后卡顿
33629次后卡顿
48486次后卡顿
64784次后卡顿
82631次后卡顿
真正的原因:window的tcp连接太多,由于大量的TIME_WAIT连接未被释放,导致占用的端口资源一直未被回收,出现了缓冲区空间不足的问题,应用也总是自动断线。
解决方案:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
“MaxUserPort”=dword:0000fffe
“TcpTimeWaitDelay”=dword:0000005 (缩短为5秒)