内核均匀发包的问题

内核均匀发包的问题


在这里插入图片描述

背景

在PK 过程中,发现某厂商使用每n ms 发送一些报文的现象,与我们突发的机制相比,优势是没有丢包(4G 环境下),遂被要求实现一个类似均匀发包的机制,

过程

  1. 由于之前没有任何内核相关经验,读代码、设计算法(把连续发送改成条件发送,令牌算法?)
    发包只懂send 函数,于是从send 接口 开始读代码,https://elixir.bootlin.com/linux/v4.16.18/source/include/linux/hrtimer.h#L45,好在内核的模块话做的很好,在tcp_output.c 中找到 tcp_write_xmit 发送函数,同时看到所谓的cwnd 和 swnd 的条件控制是否发送,
    感觉找到第一个修改点、发送一定报文后,break;那么何时重置条件呢?定时器,搜索定时器,找到一个timer定时器,低精度的。
  2. 以上两部分,好像都比较简单,在实现定时器的时候决定还是搜索一下,于是 找到 “温州皮鞋厂”(印象比较深刻)的两篇博文 《彻底实现pacing 普通版》、《彻底实现pacing 高精度版》,我的思路不就是和这里面一样,遂信心愈增,并决定搜索一下pacing 实现均匀发包
  3. https://blog.csdn.net/dog250/article/details/54424629
    https://blog.csdn.net/dog250/article/details/54424751
    https://blog.csdn.net/dog250/article/details/80025939
  4. 找到一个4.13 的SO_MAX_PACING_RATE 的,可以不依赖BBR 也实现pacing,并在github上找到 ATS 的 新增特性,据说可以配合FQ减少丢包率,在nginx上添加后,本来以为可以匀速发包,但是发现与BBR一样,最开始的一个包无法控制匀速;https://patchwork.ozlabs.org/patch/762899/
  5. 再次实现高精度定时器版本 hrtimer,定时处理函数,重置令牌 并restart 定时器。测试发现,当客户端与服务端rtt 200ms 时,令牌设置为每3ms 3个mss, 结果200ms 一个rtt 只发送了3个mss ,理论上要发送200 个mss,怀疑重置令牌后,没有再触发tcp_write_xmit,重置没有用。
  6. 修改版本 在定时处理函数中调用tcp_write_xmit, 系统崩溃,在中断处理中执行 “丝袜装榴莲”
  7. 4.16 版本中 给hrtimer 增加了一个软中断触发机制, 使用HRTIMER_MODE_REL_PINNED_SOFT ,参考tcp_kick_pace 调用write 依然出现崩溃,是重复重启定时器的原因?https://fortunapflege.de/Xenomai/ipipe/commit/98ecadd4305d8677ba77162152485798d47dcc85?view=parallel
  8. 使用tasklet 队列,但是不能复用 tsq,只能在tsq 为空的时候 执行插入和schedule (待尝试)

3ms 均匀发包一定是内核算法吗,tc 限流或者是单纯网卡压力大?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值