优化Linux 流控协议

简介

本文介绍Linux 流控协议算法,以及优化的一些基础知识


 

tc 介绍

tc , Linux Advanced Routing & Traffic Control, Linux高级路由和流量控制的名词,qdisc,queuing discipline 是数据包的排队规则

实时查看当前的排队规则 /proc/sys/net/core/default_qdisc

对应的sysctl设置 net.core.default_qdisc

 

默认的排队规则是:pfifo_fast

它是一个简单的先进先出的排队规则。

 

bbr 算法一般推荐用fq (公平队列), 那么还有没有其他更好的算法呢?

 

我们来看看cake算法

cake 算法

cake 算法,又名:Common Applications Kept Enhanced, Cake的基本设计目标是简单。这是通过将许多功能集成到一个qdisc中来实现的,从而得到:

 

功能组件之间的信息共享,提高了延迟性能。

消除了消息传递开销(提高了吞吐量性能),并且消除了qdiscs之间的非托管队列。

与使用现有qdiscs构建等效功能相比,通用用例的配置大大简化。

 

在逻辑上,Cake被设计成几层功能:

 

整形器:

 

采用缺陷整流算法,而不是桶算法

 

优先队列:

 

Cake默认情况下提供四种流量类别,名义上与802.11e和801.2p提供的四种类别相对应。但是,Diffserv代码点(DSCP)和流量类别之间的精确映射是不同的。按名义优先级的升序排列:

 

批量,无带宽阈值

尽力而为,带宽阈值为15⁄16

视频,带宽阈值为3⁄4

语音,具有1⁄4带宽阈值

 

流隔离:

这是Cake的原始核心,继承了fq_codel的流隔离方案的基本设计。它由5元组流标识符上的哈希函数组成,用于将数据包分发到大量队列,以及类似于“ DRR +”的方案:http://www.researchgate.net/profile/Mike_MacGregor/publication/3867218_Deficits_for_bursty_latency- critical_flows_DRR / links / 54a20b700cf256bf8baf7c61.pdf,以选择要服务的队列。为每个流量类别提供了一组单独的队列和DRR +状态。

 

Cake的DRR ++方案使用了两个活动队列列表。新活动的队列放置在“新流”列表中,该列表比“旧流”列表具有严格的优先级。维修后,队列总是放在“旧流”列表中。维修时发现为空的队列将从活动列表中删除。假设对延迟敏感的流量可能是稀疏的,则这种相对简单的方案自然优先于“稀疏”流而不是“大量”流。

 

Cake对fq_codel的一个主要增强是用8路集关联版本替换了普通哈希函数。普通哈希很容易受到“生日问题”的影响,假设表中的哈希是高质量的哈希,当表的使用率达到表大小的平方根(32个流(1024个队列))时,哈希冲突的可能性将达到50%。我们还发现哈希函数fq_codel所依赖的不是最佳的。

 

在集关联哈希中,队列集分为8种方式的集。使用最后分配给它们的流标识符来标记这些方式,从而可以检测到哈希冲突,并且可以避免在同一组中有其他方式可用的情况;或者已经被标记为正确的流程,或者为空且无效。这类似于CPU中集关联缓存的工作方式。

流量质量管理:

Cake使用CoDel AQM的变体,为每个流隔离队列实例化。再次从fq_codel继承了这种安排,但随后对其进行了修改以提高性能

 

流量包管理

除了四个主要层之外,为方便起见,这里还对许多其他功能进行了分组:

 

最大队列长度(以字节为单位)(不是数据包)是基于整形器带宽动态计算的。

队列溢出是通过从最长队列的开头删除来处理的。活动队列列表用于优化搜索时间。

下行数据包封装既可以考虑为固定开销,也可以考虑为ATM信元量化。

在适当的时候,将GRO / GSO聚集体剥成单个MTU大小的数据包。过度激进的聚合可大大改善以太网硬件上的流隔离。

使用cake算法

 

修改/etc/sysctl.conf

net.core.default_qdisc = cake

 

服务端和客户端都可以分别修改,然后应用生效

 

sysctl -p

 

或者重启系统生效

 

总结

cake的算法比fq算法,复杂了许多,因为要解决的问题更多了。更多的设计和实现,让它在某些时候,效率和性能要比fq要好,虽然不能总是击败 fq,但是可以体验一下。

分类: Linux/Unix 标签: Linux cake 发布于: 2020-12-26 19:17:06, 点击数: