优化涉及的连接相关配置

前言

以前总以为压测TPS上不去,是垃圾回收没配好或者Redis性能评测。为了提高TPS,试了多个垃圾回收的优化配置、也把缓存全改成本地缓存,但是TPS还是上不去。
最后发现其实是连接和线程池都没配置好。

小孩子不吃饭,胃口再大也长不高。

排泄不正常,会长痘痘的

tomcat配置

#最大线程数(指的是处理业务的线程)
server.tomcat.threads.max
#最小线程数(空闲时依旧不关闭)
server.tomcat.threads.min-spare-
#队列长度
server.tomcat.accept-count
#最大连接数
server.tomcat.max-connections
#连接建立的超时时间
server.tomcat.connection-timeout

解释:
threads.max 默认200,如果设置过大,消耗系统资源,例如栈空间。上下文切换频繁也会导致业务卡顿。如果设置太小,又没法充分利用CPU的处理能力。
一般来说,互联网应用多属于IO密集型,CPU消耗并不在业务服务器而是Mysql、Redis这些服务,所以在内存运行的前提下是可以设置大点。服务如果内存不足以创建更多连接,可以用-Xss配置线程栈空间大小,从而创建更多线程。

max-connections 默认值8192,可创建连接的最大数,连接数超出这个值后,系统还能接受新连接,但是不创建(接收但是不发送SYN-ACK
),从客户端的角度看就是请求卡在连接的阶段,只有当前连接数小于max-connections 时,才继续创建新连接。可以运行创建比处理线程数还多的连接,但是连接会占用文件句柄,如果tomcat的连接数过多了导致当前服务访问其他服务的连接创建不了。

accept-count 默认值100,连接数超出max-connections ,还能再接受新连接的数量是这个值,请求连接的数量超出这个值,会丢弃连接 。在客户端看到就是连接不可用

连接池配置(数据库和redis)

#空闲时的最大连接数
maxIdle
#最大连接数,一般设置为可能的请求数量
maxActive
#获取连接的最大等待
maxWait
#配置略去部分前缀

Redis连接池的maxActive和Redis的maxclients设置大些,redis是单线程,没有上下文切换的问题,多创建连接可以获得更好的性能。但是也不是无限增大,因为连接都是需要占用文件句柄的

RabbitMq连接工厂配置 (其实也是连接池)

有两种模式 CONNECTION模式和CHANNEL模式

前者会同时缓存Connection和Channel,后者只会缓存Channel。

RabbitMq是用到tcp复用,但是在并发较高的情况下,单连接也会出现瓶颈

#可以设置可以缓存的channel
cache.channel.size
#可以设置缓存可以缓存的连接
cache.connection.size
#配置略去部分前缀

Http Client 连接池

有两个地方
如果项目中用了ApacheHttpClient:
#最大连接数
feign.httpclient.max-connections
#每个地址的最大连接数
feign.httpclient.max-connections-per-route

如果没有ApacheHttpClient:
#最大连接数
ribbon.MaxTotalHttpConnections
#每个地址的最大连接数
ribbon.MaxConnectionsPerHost

Hystrix 线程池

hystrix.threadpool.default.coreSize
hystrix.threadpool.default.maximumSize

当然,如果下游接口响应很快(比如全是走redis或者内存),用Hystrix线程池隔离的方式,线程的上下文切换消耗的时间也是需要考虑的,尤其高并发下。这时可以采用信号量隔离的方法。(需要支持“超时”时,依旧需要启动一个HystrixTimer线程)
#支持信号量
hystrix.command.default.execution.isolation.strategy=SEMAPHORE
#信号量模式下默认的最大请求数
hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests=1000

备注:default是修改默认的策略,线上可以指定GroupKey或者commandKey去配置

Linux操作系统

Linux创建连接依赖于文件句柄,设置最大文件句柄可以创建更多连接
在 /etc/security/limits.conf 加入

  • soft nofile 65536
  • hard nofile 65536

TIME_WAIT 数量过多

压测时查看time_wait 数量
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

如发现系统存在大量TIME_WAIT状态的连接,这些连接也占用文件句柄,通过调整内核参数解决:
编辑文件/etc/sysctl.conf,加入以下内容:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

然后执行 /sbin/sysctl -p 让参数生效
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改FIN-WAIT-1、FIN-WAIT-2、TIME-WAIT的TIMEOUT时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值