fengjiachun/Jupiter

Netty 相关问题请教

hank-whu opened this issue · 2 comments

看 Jupiter 源码的时候我觉得你对 Netty 的研究比我深入得多,现在遇到两个没研究明白的 Netty 问题想向你请教一下。

  1. 使用自定义的 DefaultThreadFactory 性能会发生下降。
    这个是在我的 Window 10 机器上测出来的,没找到合理的解释,看代码也觉得本质上没差别。
    不过结果就是差了个20%左右
    netty/netty#7538

  2. 多 Channel 只在大消息体场景下性能才比单 Channel 性能好。
    比如我的测试项目 rpc-benchmark 中,只有 listUser 这一项多 Channel 才比单 Channel 性能高。
    这个违反直觉,不论什么情况都应该是跟 CPU 数量相同的 Channel 性能最高才对。

下面都是猜测哈

第一个问题: 把线程优先级的参数加上并设置为最高优先级试试? DefaultThreadFactory(NioEventLoopGroup.class, Thread.MAX_PRIORITY)

第二个问题: 一般理论上确实是Channel跟CPU核心数相同或略大于CPU核心数性能更好些, 你遇到了小数据包单Channel性能更好, 应该也没有差距很大吧? 猜测是不是这样:
你的测试场景是同步阻塞调用, 这个测试方式我认为小数据包场景其实瓶颈都会在客户端(客户端阻塞等待响应), 这就导致了客户端发送数据能力受限, 所以反过来推测服务端其实应该会很轻松的, 再加上服务端处理小数据包本身就没什么CPU的开销(你对反序列化也有zero-copy的优化, 就更不占用CPU时间片了), 所以虽然单Channel同一时刻只能利用一个核, 但不会对吞吐造成什么影响, 因为远远没达到服务端处理能力的极限

上面的解释主要靠猜测, 没验证过, 也不一定对, 哈哈, 很佩服你的钻研能力, 你要有新发现也分享下给我

好吧,确实很难解释,我自己再思考一下