已经解决了这个问题,这个是出现在canal 1.0.25 (Otter 4.2.15) 上的。 主要的问题是 SocketChannel 类中 使用ByteBuf cache = PooledByteBufAllocator.DEFAULT.directBuffer(1024 * 1024); 作为数据buff,当新建连接且数据量比较大的时候,这个cache size 会急剧扩大,再配合 public void writeCache(ByteBuf buf) { synchronized (lock) { cache.discardReadBytes();// 回收内存 cache.writeBytes(buf); } } 方法中的 cache.discardReadBytes(); 使得系统在做无意义的memory copy 操作,使得一个工作核打满,并且writeCache速度极慢。
我们自己重写了 SocketChannel 内部的cache 实现,解决问题了。
看了Canal 的 1.0.26-preview-3的代码,这一块变动挺大,没有用过,不知道是否解决了问题。
原提问者GitHub用户Winwinter
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。