weibocom / motan

A cross-language remote procedure call(RPC) framework for rapid development of high performance distributed services.
Other
5.89k stars 1.78k forks source link

监控网络消耗的时间 #813

Open zxn-git opened 5 years ago

zxn-git commented 5 years ago
  1. 我想知道有没有什么配置能监控网络传输所花费的时间,从请求发出到接到请求的这个时间。
  2. 我们现在每台server和每台client保持500个tcp长连接,数据传输收发100M以内,这个连接是不是有点多,因为每个service都会保持5-10个长连接,我们有几十个service!这个需要怎么优化?
rayzhang0603 commented 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以上的数据都会有非常明显的压缩效果。

zxn-git commented 5 years ago

我们所有的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%,但是因为线程太多切换的开销导致性能并不能提上去

zxn-git commented 5 years ago

我们高峰期,一台server qps在2000左右,超时500ms的访问占到0.1%

rayzhang0603 commented 5 years ago

1W线程对8核的cpu来说还是太勉强了:) server端这些service是公用端口了吗?如果不同service的protocol配置相同的话,可以把不同的service按重要程度划分为几个端口,相同端口的service配置上shareChannel=true可以共享端口,一个端口上导出的serivce共用一个线程池

rayzhang0603 commented 5 years ago

另外,server端1W个链接都是rpc的?client端使用的netty4模块吗?netty4模块比较适合链接数较小的场景,client端可以只针对qps较高的service设置最少链接数。比如minClientConnection=5

zxn-git commented 5 years ago

嗯,1w多的连接都是rpc的,而且如果加client机器的话还会增加 我们所有server公用的一个端口,目前shareChannel=true有这个配置,按照你说的拆分多个端口我们可以尝试下,这样的话是不是每个端口的maxWorkerThread也可以调小一些(目前配置的3000) 你说的设置最小连接数我看看也可以调整下 我们目前用的motan版本是0.2.1,没找到在哪配置了netty的版本

rayzhang0603 commented 5 years ago

建议

  1. 升级到最新版本1.1.3
  2. 把netty升级到netty4。方法:把pom依赖中的motan-transport-netty改为motan-transport-netty4
  3. client端把请求量大的service配置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" ...../>
zxn-git commented 5 years ago

好的,谢谢!我先把版本升上去。那还有必要划分出多个端口吗?

rayzhang0603 commented 5 years ago

一般可以根据业务隔离性来规划,例如核心服务与非核心服务使用不同端口