Open zxn-git opened 5 years ago
1、motan提供了打印分步耗时的trace日志的机制,不过需要你自己在程序中打开、关闭开关来控制。开关名:MotanConstants.REQUEST_TRACK_LOG_SWITCHER
打开trace日志后性能可能会略受影响,建议临时打开使用,使用完后关闭开关。
2、如果单机整体有几百个链接还好,一般不会有什么问题。如果一个server端提供的service有几十个,也可以考虑适当合并一下,减少单机导出的service数量。 如果是client端整体依赖了几十service的话,没有什么问题。可以考虑对qps低的service配置链接数,例如minClientConnection=1,maxClientConnection=3。
对于传输数据较大的service,可以考虑使用motan2协议导出服务,并设置mingzSize来开启gzip压缩。mingzSize是开启压缩的阈值,单位是byte。一般5k以上的数据都会有非常明显的压缩效果。
我们所有的service打在一个jar包中,一个jar包部署在一台server上。一共有10多台server服务,然后通过motan都注册在zk client也是一个大的web项目,也有10多台client服务,每个client都会轮询这10多个server发请求 所以我看了下,我们每个server都会有10000左右的tcp长连接,一台client大概500多tcp,一个service大概5-10个? 这个需要优化吗 因为现在有超时问题500ms,看着不像是代码问题,换成高配的机器(16核32G)会好些,当然我们每台server的线程数也在10000左右 所以我有点怀疑2点 1 是client向server发送请求时存在网络延迟(发送的数据会卡在client缓存里,足够量的时候再刷新到网络),我们网络目前肯定不是瓶颈。 2 是我们线程数太多了,8核cpu虽然跑不到50%,但是因为线程太多切换的开销导致性能并不能提上去
我们高峰期,一台server qps在2000左右,超时500ms的访问占到0.1%
1W线程对8核的cpu来说还是太勉强了:) server端这些service是公用端口了吗?如果不同service的protocol配置相同的话,可以把不同的service按重要程度划分为几个端口,相同端口的service配置上shareChannel=true可以共享端口,一个端口上导出的serivce共用一个线程池
另外,server端1W个链接都是rpc的?client端使用的netty4模块吗?netty4模块比较适合链接数较小的场景,client端可以只针对qps较高的service设置最少链接数。比如minClientConnection=5
嗯,1w多的连接都是rpc的,而且如果加client机器的话还会增加 我们所有server公用的一个端口,目前shareChannel=true有这个配置,按照你说的拆分多个端口我们可以尝试下,这样的话是不是每个端口的maxWorkerThread也可以调小一些(目前配置的3000) 你说的设置最小连接数我看看也可以调整下 我们目前用的motan版本是0.2.1,没找到在哪配置了netty的版本
建议
motan-transport-netty
改为motan-transport-netty4
minClientConnection=5
,请求量小的service配置minClientConnection=2
。 样例如下,不同的服务引用不同的basicreferer就可以了 <motan:protocol id="motan_few_connetion" name="motan" minClientConnection="2" ...../>
<motan:protocol id="motan_more_connetion" name="motan" minClientConnection="5"...../>
<motan:basicReferer id="basicService1" protocol="motan_few_connetion" ..../>
<motan:basicReferer id="basicService2" protocol="motan_more_connetion" ...../>
好的,谢谢!我先把版本升上去。那还有必要划分出多个端口吗?
一般可以根据业务隔离性来规划,例如核心服务与非核心服务使用不同端口