美文网首页
修复 netty 高水位溢出问题记录

修复 netty 高水位溢出问题记录

作者: 苏黎世黄昏 | 来源:发表于2021-07-12 15:55 被阅读0次

导数据时频繁出现maybe write overflow的问题,在这种状态下能持续地运行一段时间,但是过一会leader就会stepped down。下图是在公司的机器上模拟出来的,通过自己构造的多属性(30多个)数据集,能重现这个问题。

查询sofa-rpc的issue,再次找到了这个https://github.com/sofastack/sofa-rpc/issues/551

原因
RPC在写出数据的时候,会检测当前的ChannelOutboundBuffer的大小,如果超过了WRITE_BUFFER_HIGH_WATER_MARK(默认64K),就会限流,报write overflow的异常。
这个是为了保护客户端,防止无界的ChannelOutboundBuffer被打爆,导致资源耗尽。
通常情况下,网络有问题,导致写出失败;或者下游压力太大,不能处理这么多网络包的时候会出现这样的异常。

解决办法:
建议首先排查网络环境(网卡打满也是一种)
网络环境没问题的情况下,看下是否是流量过大,导致下游处理不过来。,如果是这种,可能意味着,这就是压测的瓶颈了。可以评估下游扩容,性能优化等方式来解决。
如果确实认为64k 也不够用. 可以自行调整

-Dbolt.netty.buffer.low.watermark
-Dbolt.netty.buffer.high.watermark
值自己算一下,默认是32*1024 和64*1024

我决定先自己验证一下到底是网络的问题还是下游处理能力的问题,怎么验证呢?让follower节点的状态机应用日志的部分执行空方法,不写数据到rocksdb,这样leader和follower之间就只有rpc通信,也就是同步日志的部分了。

经测试证明,只有rpc通信的时候是服务非常稳,没有报错,说明就是下游处理不过来了。

将水位的限制调大。

https://github.com/zhoney/hugegraph/pull/45/ 在自己造的数据集上能持续导入了,虽然在导入了几个小时后还是会有busy 异常,但是目前已经持续导入了8个多小时了,相比于昨天自测时稳定了许多。

主要改动点如下:

  1. 优化follower的状态机代码,将解压缩反序列化部分也交给store-backend线程来做,提高follower的处理吞吐量;
  2. 调高bolt rpc的高水位限制,此前是2M,现在是20M,调整后没有出现过write overflow的异常;
  3. raft node在busy的时候所有到达的grizzly线程先睡眠一会(睡眠时间加上了随机性),再抛出异常,算是进一步的优化限流;
  4. loader导数据的时候将batch size调为200,也算是限流的措施;
  5. 将raft log保存在机械盘上,试图让写raft日志率先成为瓶颈,而不要让压力到应用状态机那儿。
raft.path=raft-log
raft.election_timeout=10000
raft.snapshot_interval=3600
raft.backend_threads=56
raft.queue_size=16384
raft.queue_publish_timeout=60
raft.apply_batch=1
raft.rpc_threads=80
raft.rpc_connect_timeout=3000
raft.stepdown_when_vote_timeout=true
raft.use_replicator_pipeline=true

raft.rpc_buf_low_water_mark=10485760
raft.rpc_buf_high_water_mark=20971520
#raft.follower.dry_run=true

参考:

  1. https://github.com/sofastack/sofa-rpc/issues/551
  2. https://github.com/sofastack/sofa-rpc/issues/557

相关文章

  • 修复 netty 高水位溢出问题记录

    导数据时频繁出现maybe write overflow的问题,在这种状态下能持续地运行一段时间,但是过一会lea...

  • Netty的高低水位

    假如我们的底层使用Netty作为网络通信框架,业务流程在将业务数据发送到对端之前,实际先要将数据发送到Netty的...

  • netty工程经验tips

    netty服务端高低水位设置配合channelWritabilityChanged设置autoRead做到保护 n...

  • Mac 问题修复记录

    1. Jupyter notebook 在 Anaconda 更新后无法打开 参考办法:github+最新版jup...

  • TG:Note

    PC端实现首页新闻简介溢出隐藏: 省略CSS处理 修复img跟着p同时移了2em问题:$(document).re...

  • netty通信框架

    Netty入门教程——认识Netty彻底理解Netty,这一篇文章就够了 Netty特点 并发高 传输快 封装好 ...

  • oracle高水位线

    参考资料:https://www.cnblogs.com/linjiqin/archive/2012/01/15/...

  • 高水位线处理

    1. 查询高水位情况 查询块大小 查询10G水位线上的对象 2. 清理分区表 移动分区表 删除分区表 3. 移动表...

  • 2018-12-27

    获得更多训练示例:修复高方差 尝试较小的特征集:修复高方差 添加特征:修复高偏差 添加多项式特征:修复高偏差 减少...

  • Java面试题集二

    今日面试又遇到了一些题目,先记录下来 1、netty怎么处理粘包问题 netty底层走的是TCP协议,传输的是字节...

网友评论

      本文标题:修复 netty 高水位溢出问题记录

      本文链接:https://www.haomeiwen.com/subject/xkzrpltx.html