Linux内核QoS实现机制.doc
《Linux内核QoS实现机制.doc》由会员分享,可在线阅读,更多相关《Linux内核QoS实现机制.doc(22页珍藏版)》请在咨信网上搜索。
1、Linux内核QoS实现机制1. QoS介绍QoS(Quality of Service)即服务质量。对于网络业务,服务质量包括传输的带宽、传送的时延、数据的丢包率等。在网络中可以通过保证传输的带宽、降低传送的时延、降低数据的丢包率以及时延抖动等措施来提高服务质量。网络资源总是有限的,只要存在抢夺网络资源的情况,就会出现服务质量的要求。服务质量是相对网络业务而言的,在保证某类业务的服务质量的同时,可能就是在损害其它业务的服务质量。例如,在网络总带宽固定的情况下,如果某类业务占用的带宽越多,那么其他业务能使用的带宽就越少,可能会影响其他业务的使用。因此,网络管理者需要根据各种业务的特点来对网络资
2、源进行合理的规划和分配,从而使网络资源得到高效利用。流量控制包括以下几种方式:n SHAPING(限制)当流量被限制,它的传输速率就被控制在某个值以下。限制值可以大大小于有效带宽,这样可以平滑突发数据流量,使网络更为稳定。shaping(限制)只适用于向外的流量。n SCHEDULING(调度)通过调度数据包的传输,可以在带宽范围内,按照优先级分配带宽。SCHEDULING(调度)也只适于向外的流量。n POLICING(策略)SHAPING用于处理向外的流量,而POLICIING(策略)用于处理接收到的数据。n DROPPING(丢弃)如果流量超过某个设定的带宽,就丢弃数据包,不管是向内还是
3、向外。2. 内核实现过程图表 1 流量控制过程绿色部分就是Linux内核实现的QoS模块,其中ingress policing 是处理输入数据包的,而output queueing 则是处理输出数据包的。2.1. Ingress实现机制Ingress QOS在内核的入口点有两个,但是不能同时启用,这取决于内核编译选项。当打开了CONFIG_NET_CLS_ACT(from 2.6.8 release still available on 2.6.39 release)时,入口点在src/net/core/dev.c的netif_receive_skb函数中;当没有打开CONFIG_NET_CL
4、S_ACT,而是打开了CONFIG_NET_CLS_POLICE (from 2.6.9 release to 2.6.24, thus this is an obsolete configuration)和CONFIG_NETFILTER时,就会在netfilter的PREROUTING钩子点处调用ing_hook函数。图表 2 ingress策略实现当filter中有规则时,遍历规则表,寻找与skb-mark(由ebtables或iptables来配置)相匹配的表项,如果找到了则会进一步调用tcf_exts_exec函数对扩展的action进行处理。图表 3 FW分类器实现过程2.2. E
5、gress实现机制系统在注册网络设备时会在register_netdevice函数中调用dev_init_scheduler函数注册一个qdisc的接口,它是一个特殊的qdisc,不做任何处理。当创建好设备,用ifconfig up命令把设备拉起后,会调用到内核的src/net/core/dev.c中的dev_open函数,在dev_open函数中又会调用到src/net/sched/sch_generic.c中的dev_activate函数,给设备配置默认的root qdisc处理机制:pfifo_fast。图表 4 以prio qdisc为例的egress初始化过程出口队列调度的入口点在s
6、rc/net/core/dev.c的dev_queue_xmit函数中,通过q = rcu_dereference(dev-qdisc)可以获取到设备上root qdisc的指针q(struct Qdisc *)。在下面的处理过程中并没有判断q是否为NULL,这就说明设备上一定会存在egress qdisc,这一点和ingress是不同的,一个设备上可以没有ingress qdisc,即dev- qdisc_ingress指针一般是NULL,除非通过tc qdisc命令配置了ingress qdisc。图表 5 以htb+pfifo qdisc为例的egress处理流程3. 内核与TC的交互3
7、.1. 交互方式Netlink3.2. 内核处理接口n Qdisc和class交互接口tc qdisc和tc clsss配置命令对应的配置函数在src/net/sched/sch_api.c的pktsched_init函数中进行了初始化注册,由subsys_initcall函数对系统进行申明,该函数在linux系统初始化的时候会被调用到。代码片断如下:if (link_p) link_pRTM_NEWQDISC-RTM_BASE.doit = tc_modify_qdisc;link_pRTM_DELQDISC-RTM_BASE.doit = tc_get_qdisc;link_pRTM_GE
8、TQDISC-RTM_BASE.doit = tc_get_qdisc;link_pRTM_GETQDISC-RTM_BASE.dumpit = tc_dump_qdisc;link_pRTM_NEWTCLASS-RTM_BASE.doit = tc_ctl_tclass;link_pRTM_DELTCLASS-RTM_BASE.doit = tc_ctl_tclass;link_pRTM_GETTCLASS-RTM_BASE.doit = tc_ctl_tclass;link_pRTM_GETTCLASS-RTM_BASE.dumpit = tc_dump_tclass;n filter交互
9、接口tc filter配置命令对应的配置函数在src/net/sched/cls_api.c的tc_filter_init函数中进行了初始化注册,该函数也会在系统初始化的时候被调用到。代码片段如下:if (link_p) link_pRTM_NEWTFILTER-RTM_BASE.doit = tc_ctl_tfilter;link_pRTM_DELTFILTER-RTM_BASE.doit = tc_ctl_tfilter;link_pRTM_GETTFILTER-RTM_BASE.doit = tc_ctl_tfilter;link_pRTM_GETTFILTER-RTM_BASE.dum
10、pit = tc_dump_tfilter;3.3. TC与netlink交互的数据格式Netlink数据头部+tc消息头部n Netlink头部struct msg_to_kernel /*自定义消息首部,它仅包含了netlink的消息首部*/ struct nlmsghdr hdr;struct nlmsghdr _u32 nlmsg_len; /* Length of message */ _u16 nlmsg_type; /* Message type*/ _u16 nlmsg_flags; /* Additional flags */ _u32 nlmsg_seq; /* Seque
11、nce number */ _u32 nlmsg_pid; /* Sending process PID */;n TC数据头部:struct tcmsg unsigned chartcm_family;unsigned chartcm_pad1;unsigned shorttcm_pad2;inttcm_ifindex;_u32tcm_handle;_u32tcm_parent;_u32tcm_info;4. TC规则4.1. 流量控制模型图表 6 流量控制实现模型4.2. 流量控制处理对象流量的处理由三种对象控制,它们是:qdisc(排队规则)、class(类别)和filter(过滤器)。
12、4.2.1. QdiscQDisc(排队规则)是queueing discipline的简写,它是理解流量控制(traffic control)的基础。无论何时,内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的qdisc(排队规则)把数据包加入队列。然后,内核会尽可能多地从qdisc里面取出数据包,把它们交给网络适配器驱动模块。最简单的QDisc是pfifo它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。不过,它会保存网络接口一时无法处理的数据包。QDISC分为无类队列(CLASSLESS QDisc)和分类队列(CLASSFUL QDISC)类别。使用中
13、,无类队列只能作为叶子节点出现,而分类队列作为双亲节点出现,不能作为叶子节点出现。4.2.1.1. 无类队列a) Pfifo_fast默认参数,先进先出的队列,内核参照数据包的TOS标记,将数据包分为3个频道。如果在0频道有数据包等待发送,1频道的包就不会被处理,1频道和2频道之间的关系也是如此。n TOS字段说明:TOS字段的4个bit定义:二进制十进制意义10008最小延迟 (md) 01004最大throughput (mt) 00102最大可靠性 (mr) 00011最小成本 (mmc) 00000正常服务图表 7 TOS值与频道的对应b) TBF只允许以不超过事先设定的速率到来的数据
14、包通过,但可能允许短暂突发流量超过设定值。3种情景:1) 数据流以等于令牌流的速率到达TBF。这种情况下,每个到来的数据包都能对应一个令牌,然后无延迟地通过队列。2) 数据流以小于令牌流的速度到达TBF。通过队列的数据包只消耗了一部分令牌,剩下的令牌会在桶里积累下来,直到桶被装满。剩下的令牌可以在需要以高于令牌流速率发送数据流的时候消耗掉,这种情况下会发生突发传输。3) 数据流以大于令牌流的速率到达TBF。这意味着桶里的令牌很快就会被耗尽。导致TBF中断一段时间,称为“越限”。如果数据包持续到来,将发生丢包。n 参数选项: limit/latency:limit确定最多有多少数据(字节数)在队
15、列中等待可用令牌。你也可以通过设置latency参数来指定这个参数,latency参数确定了一个包在TBF中等待传输的最长等待时间。后者计算决定桶的大小、速率和峰值速率。 burst/buffer/maxburst:桶的大小,以字节计。这个参数指定了最多可以有多少个令牌能够即刻被使用。通常,管理的带宽越大,需要的缓冲器就越大。在Intel体系上,10兆bit/s的速率需要至少10k字节的缓冲区才能达到期望的速率。如果你的缓冲区太小,就会导致到达的令牌没有地方放(桶满了),这会导致潜在的丢包。 Mpu:一个零长度的包并不是不耗费带宽。比如以太网,数据帧不会小于64字节。Mpu(Minimum P
16、acket Unit,最小分组单位)决定了令牌的最低消耗。 Rate:速度操纵杆,参见上面的limits。 Peakrate:如果有可用的令牌,数据包一旦到来就会立刻被发送出去,就象光速一样。那可能并不是你希望的,特别是你有一个比较大的桶的时候。峰值速率可以用来指定令牌以多块的速度被删除。用书面语言来说,就是:释放一个数据包,但后等待足够的时间后再释放下一个。我们通过计算等待时间来控制峰值速率。然而,由于UNIX定时器的分辨率是10毫秒,如果平均包长10k bit,我们的峰值速率被限制在了1Mbps。 mtu/minburst:但是如果你的常规速率比较高,1Mbps的峰值速率对我们就没有什么价
17、值。要实现更高的峰值速率,可以在一个时钟周期内发送多个数据包。最有效的办法就是:再创建一个令牌桶!n 配置范例:# tc qdisc add dev ppp0 root tbf rate 220kbit latency 50ms burst 1540c) SFQSFQ(Stochastic Fairness Queueing,随机公平队列)是公平队列算法家族中的一个简单实现。它的精确性不如其它的方法,但是它在实现高度公平的同时,需要的计算量却很少。SFQ的关键词是“会话”(或称作“流”) ,主要针对一个TCP会话或者UDP流。流量被分成相当多数量的FIFO队列中,每个队列对应一个会话。数据按照
18、简单轮转的方式发送, 每个会话都按顺序得到发送机会。n 参数选项: Perturb:多少秒后重新配置一次散列算法。如果取消设置,散列算法将永远不会重新配置(不建议这样做)。10秒应该是一个合适的值。 Quantum:一个流至少要传输多少字节后才切换到下一个队列。却省设置为一个最大包的长度(MTU的大小)。不要设置这个数值低于MTU!n 配置范例:# tc qdisc add dev ppp0 root sfq perturb 10d) p|bfifo使用最简单的qdisc,纯粹的先进先出。只有一个参数:limit,用来设置队列的长度,pfifo是以数据包的个数为单位;bfifo是以字节数为单位
19、。n 参数选项 Limit:规定了队列的长度。对于bfifo用字节计,对于pfifo用包的个数计。缺省值就是网卡的txqueuelen个包那么长(参见pfifo_fast那一章),对于bfifo就是txqueuelen*mtu个字节。e) redred是Random Early Detection(随机早期探测)的简写。如果使用这种QDISC,当带宽的占用接近于规定的带宽时,系统会随机地丢弃一些数据包。它非常适合高带宽应用。为了使用RED,你必须确定三个参数:min、max和burst。Min设置了队列达到多少字节时开始进行丢包,Max是一个软上限,让算法尽量不要超过,burst设置了最多有多
20、少个数据包能够突发通过。4.2.1.2. 分类队列a) HTBHTB是Hierarchy Token Bucket的缩写。通过在实践基础上的改进,它实现了一个丰富的连接共享类别体系。使用HTB可以很容易地保证每个类别的带宽,虽然它也允许特定的类可以突破带宽上限,占用别的类的带宽。HTB可以通过TBF(Token Bucket Filter)实现带宽限制,也能够划分类别的优先级。n 参数选项 Rate:限速; Burst:令牌桶的大小; Ceil:上行限速,用于满带宽时对总带宽的占有比; Prio:配置优先级;b) CBQCBQ是Class Based Queueing(基于类别排队)的缩写。它
21、实现了一个丰富的连接共享类别结构,既有限制(shaping)带宽的能力,也具有带宽优先级管理的能力。带宽限制是通过计算连接的空闲时间完成的。空闲时间的计算标准是数据包离队事件的频率和下层连接(数据链路层)的带宽。n CBQ常规参数: Avpkt:平均包大小,以字节计。计算maxidle时需要,maxidle从maxburst得出。 Bandwidth:网卡的物理带宽,用来计算闲置时间。 Cell:一个数据包被发送出去的时间可以是基于包长度而阶梯增长的。一个800 字节的包和一个806字节的包可以认为耗费相同的时间。也就是说它设置时间粒度。通常设置为8,必须是2的整数次幂。 Maxburst:这
22、个参数的值决定了计算maxidle所使用的数据包的个数。在avgidle跌落到0之前,这么多的数据包可以突发传输出去。这个值越高,越能够容纳突发传输。你无法直接设置maxidle的值,必须通过这个参数来控制。 Minburst:如前所述,发生越限时CBQ会禁止发包。实现这个的理想方案是根据事先计算出的闲置时间进行延迟之后,发一个数据包。然而,UNIX的内核一般来说都有一个固定的调度周期(一般不大于10ms),所以最好是这样:禁止发包的时间稍长一些,然后突发性地传输minburst个数据包,而不是一个一个地传输。等待的时间叫做offtime。从大的时间尺度上说,minburst值越大,整形越精确
23、。但是,从毫秒级的时间尺度上说,就会有越多的突发传输。 Minidle:如果avgidle值降到0,也就是发生了越限,就需要等待,直到avgidle的值足够大才发送数据包。为避免因关闭链路太久而引起的以外突发传输,在avgidle的值太低的时候会被强制设置为minidle的值。参数minidle的值是以负微秒记的。所以10代表avgidle被限制在-10us上。 Mpu:最小包尺寸,因为即使是0长度的数据包,在以太网上也要生成封装成64字节的帧,而需要一定时间去传输。为了精确计算闲置时间,CBQ需要知道这个值。 Rate:期望中的传输速率n WRR(weighted round robin,加
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 内核 QoS 实现 机制
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。