仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 728|回复: 13
打印 上一主题 下一主题

[其他Linux] Linux设计Linux 收集仓库的列队机制仓酷云

[复制链接]
冷月葬花魂 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:21:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
每一个开发团队都对他的发行版做过测试后放出的.那些国际知名的大品牌更是如此。
在任何收集仓库或设备中,数据包的行列都长短常主要。这些行列使得不在统一时候加载的模块可以互相通讯,而且能进步收集功能,同时也会直接影响到收集延时的是非。本文章经由过程论述IP数据包在Linux收集中的列队机制,来注释两个成绩:


  • BQL一类新特征是怎样减小收集延时的。
  • 怎样把持已减小延时后的缓存。
上面这张图(和它的变形)将会在文中不休的呈现,用以申明详细的观点。

figure1
驱动行列(环形缓存区)
驱动行列位于IP数据栈和网卡间接。驱动行列利用先辈先出算法,并经由过程环形缓存区完成—能够临时把环形缓存区当作一个流动巨细的缓存器。这个行列中不含任何来自包(分组)的数据,间接介入列队的是形貌符(descriptor)。这些形貌符指向“内核套接字缓存”(socketkernelbuffers,简写为SKBs),SKB中含有在全部内核处置过程当中都要利用的数据包。

figure2
进进驱动行列的数据,来自IP数据栈,在IP数据栈里一切的IP数据包都要举行列队。这些数据包能够从当地取得,当某个网卡在收集中充任路由器时,数据包也能够从网卡上吸收,找到路由后再收回往。从IP数据栈中进进驱动行列的数据包,先由硬件使之出列,再经由过程数据总线发送到网卡上,以举行传输。
驱动行列的用途在于,只需体系无数据必要传输时,数据可以即刻被传送到网卡举行实时传输。大抵意义就是,驱动行列给了IP数据栈一个列队的中央,经由过程硬件来对数据举行分歧时的列队。完成这个功效的另外一种做法是,只需当物理传输前言筹办好传输数据时,网卡便即刻向IP数据栈请求数据。可是由于对IP数据栈的数据请求,不成能即刻失掉响应,以是这类举措会华侈失落大批可贵的传输资本,使吞吐量响应地下降。另有另外一种恰好相反的举措—在IP数据栈筹办好要传输的数据包后,举行守候,直到物理传输前言做好传输数据的筹办为止。可是这类做法一样也不睬想,由于在守候时IP数据栈被闲置,没有举措做其余事情。
栈中的超年夜数据包
多半网卡都有最年夜传输单元(MTU),用来暗示可以被物理前言传输的最年夜帧数。以太网的默许MTU为1500字节,也有一些撑持JumboFrames的以太网MTU可以到达9000多字节的。在IP数据栈中,MTU同时也是数据包传输的极限巨细。好比,有个使用必要向TCP接口授送2000字节的数据,这时候,IP数据栈就必需创立两个数据包来传送它,由于单个MTU小于2000字节。以是在举行较年夜数据的传输时,MTU假如绝对较小,那末大批数据包就会被创立出来,而且它们都要在物理前言上传输到驱动行列中。
为了不由于MTU巨细限定而呈现的大批数据包,Linux内查对传输巨细举行了多项优化:TCP段装卸(TCPsegmentationoffload,简称TSO),UDP碎片装卸(UDPfragmentationoffload,简称UFO)和范例化段装卸(genericsegmentationoffload,简称GSO)。这些优化举措,使得IP数据栈可以创立比MTU更年夜的数据包。关于IPv4来讲,优化后可以创立出最年夜含65536的数据包,而且这些数据包和MTU巨细的数据包一样可以进进驱动行列列队。在利用TSO和UFO优化时,由网卡将较年夜的数据包拆分红可以传输的小数据包。关于没有该硬件拆分功效的网卡,GSO优化可以经由过程软件来完成不异的功效,在数据包进进驱动行列前敏捷完成数据包拆分。
我在后面提过,驱动行列中能包括形貌符的数目是必定的(但形貌符能够指向分歧巨细的数据包)。以是,TSO,UFO和GSO等优化措施将数据包增年夜,也不完整是件功德,由于这些优化也会使驱动行列中举行列队的字节数增年夜了很多。图象3是一个与图象2的对照图。

figure3
固然接上去我要将重点放在传输路径(transmitpath)上了,可是这里仍是要再夸大一下,Linux在数据吸收端一样有相似TSO、UFO和GSO的优化措施。这些吸收端优化措施一样也能将每一个数据包的巨细限定增年夜。详细来讲,范例吸收装卸(genericreceiveoffload,简称GRO)使网卡可以将吸收到的多少数据包兼并成一个年夜数据包后,再传给IP数据栈。在传送数据包时,GRO能将原始数据包重组,使之切合IP数据包首尾毗连的属性。GRO一样也会带来反作用:较年夜的数据包在传送时,大概会被拆分红了多少较小的数据包,这时候,就会有多个数据包在统一数据流中同时举行列队。较年夜的数据包假如产生了如许的“微拆分”(microburst),会对数据流之间的延时发生倒霉影响。
饿逝世和延时
固然设置驱动行列—即在IP数据栈和硬件网卡间列队,十分便当,但如许做也带来“饿逝世和延时”的成绩。
当网卡入手下手从驱动行列中取数据包时,假如刚好这时候驱动行列为空行列,那末硬件实在就得到了一次传输数据的时机,也就将体系的吞吐量下降了。我们把这类情形叫做“饿逝世”(starvation)。必要注重的是,假如驱动行列为空,而此时体系又没无数据必要传输时,则不克不及称为“饿逝世”—-这是体系的一般情形。怎样制止“饿逝世”是一个很庞大的成绩,由于IP数据栈将数据包传进驱动行列的历程,和硬件网卡从驱动行列中取数据包的历程经常不是同时产生的。加倍糟的是,这两个历程间的距离工夫很不断定,经常跟着体系负载和收集接口物理介质等内部情况而变更。好比说,在一个十分忙碌的体系中,IP数据栈就很少无机会能把数据包到场到驱动行列缓存中,此时,极可能在驱动行列对更多半据包列队前,网卡就已从驱动行列中取数据了。因而,假如驱动行列能变得更年夜的话,呈现“饿逝世”的概率就会失掉减小,而且体系吞吐量会响应进步。
固然较年夜的行列可以包管高吞吐量,可是行列变年夜的同时,大批的延时情形也会呈现。

figure4
在图象4中,单个带宽较年夜的TCP段几近把驱动行列占满,我们把它称为“块(拦阻)交通流”(bulktrafficflow)(蓝色部分)。在最初举行列队的,是来自VoIP或游戏的“交互数据流”(黄色部分)。像VoIP或游戏一类的交互式使用,一样平常会在流动的工夫距离抵达时,发送较小的数据包。这对延时长短常敏感的。而且这时候,传输带宽较年夜的数据,会使包传送率(packetrate)增高并且会发生更年夜的数据包。较高的包传送率会很快占满行列缓存,进而拦阻交互性数据包的传输。为了进一步申明这类情形,我们先做出以下假定:


  • 收集接口的传输速度为5Mbit/sec(5000000bits/sec)。
  • 每一个“块交通流”中的数据包(分组)巨细为1500bytes(或12000bits)。
  • 每一个“交互交通流”中的数据包(分组)巨细为500bytes。
  • 驱动行列共能包容128个形貌符。
  • 如今有127个“块(拦阻)”数据包,和1个交互数据包最初举行列队。
127个数据传输终了时,交互数据包才干举行传输。在以上假定下,将一切127个块数据包传输终了共必要(127*12,000)/5,000,000=0.304秒(以每ping盘算延时则为304毫秒)。如许的延时完整没法满意交互式使用的需求,而且这个工夫中还没有包括完成一切传输所需的工夫—由于我们只盘算了完成127个块数据包传输的工夫罢了。之前我曾提到过,在驱动行列中,数据包(分组)的巨细在TSO等优化下可以凌驾1500bytes。以是这也让延时成绩变得更严峻了。
由凌驾划定巨细的缓存而引发的较年夜延时,也被称为Bufferbloat。在ControllingQueueDelay和theBufferbloat中对这个成绩有更具体的论述。
综上所述,为驱动行列选择准确的巨细是一个Goldilocks成绩—不克不及定的太年夜由于会有延时,也不克不及定的太小由于吞吐量会下降。
字节行列限定(BQL)
字节行列限定(BQL)是比来在linux内核(>3.3.0)中呈现的新特征,它能为驱动行列主动分派符合的巨细以办理后面提到过的成绩。BQL机制在将数据包举行列队时,会主动盘算以后体系下,可以制止饿逝世所需的最小驱动行列缓存巨细,再决意是不是对数据包举行列队。如前文所述,举行列队的数据越少,对数据包的最年夜延时也越小。
必要注重的是,驱动行列的实践巨细并没有被BQL改动。BQL只是限定了以后时候可以举行列队的数据几(以字节盘算)罢了。任何凌驾巨细限定的那一部分数据,城市被BQL反对在驱动行列以外。BQL机制会在以下两个事务产生时启动:

  • 数据包进进驱动行列列队时。
  • 经由过程物理介质的传输已完成时。
上面是简化后的BQL算法。LIMIT指的是BQL盘算出来的限定值。
1
2
3
4
5
6
****
**Afteraddingpacketstothequeue
****
ifthenumberofqueuedbytesisoverthecurrentLIMITvaluethen
disablethequeueingofmoredatatothedriverqueue

注重,举行列队的数据巨细能够凌驾LIMIT,由于数据在举行LIMIT反省之前,就已列队了。由于十分年夜的字节,可以经由过程TSO、UFO和GSO优化,一次性举行列队,以是就形成了举行列队数据过年夜的成绩。假如你加倍器重延时,大概你会将这些优化特征往撤除。文章前面有先容往除的举措。
BQL机制的第二阶段,在硬件完成传输了今后启动。
1
2
3
4
5
6
7
8
9
10
11
12
13
****
**Whenthehardwarehascompletedsendingabatchofpackets
**(Referredtoastheendofaninterval)
****
ifthehardwarewasstarvedintheinterval
increaseLIMIT
elseifthehardwarewasbusyduringtheentireinterval(notstarved)andtherearebytestotransmit
decreaseLIMITbythenumberofbytesnottransmittedintheinterval
ifthenumberofqueuedbytesislessthanLIMIT
enablethequeueingofmoredatatothebuffer

如代码所示,BQL次要是在测试体系此时是不是呈现了饿逝世。假如呈现了饿逝世,则LIMIT会增添,以使更多半据可以出来行列举行列队。假如体系在测试工夫内一向都非常忙碌,并且仍有字节在等着传进行列中,则此时行列太年夜了,以后体系不必要这么年夜的行列,以是LIMIT会减小,以把持延时。
上面举一个实例,来匡助人人了解BQL是怎样把持用于列队的数据巨细的。在我的个中一个服务器上,默许的驱动行列巨细是256个形貌符。由于以太网MTU巨细为1500bytes,以是此时驱动行列能对256*1,500=384,000bytes举行列队(假如利用TSO、GSO则列队字节会更多)。可是,BQL此时盘算出的LIMIT值为3012bytes。以是,BQL年夜年夜限定了可以进进行列的数据巨细。
有关BQL十分风趣的一点,可以从B—byte这个字母看出来。跟驱动行列的巨细和其他数据包行列的巨细单元分歧,BQL以byte(字节)为单元举行操纵。这是由于字节的数量,与其在物理介质上传输所需工夫,有十分间接的干系。而数据包和形貌符的数量与该工夫则干系不年夜,由于数据包和形貌符的巨细都是纷歧样的。
BQL经由过程将列队数据的巨细举行限定,使之坚持在能制止饿逝世呈现的最小值,来削减收集延时。BQL另有一个主要的特征,它能使底本在驱动行列中举行列队(利用FIFO算法列队)的数据包,转移到“列队原则”(queueingdiscipline(QDisc))下去举行列队。QDisc可以完成比FIFO庞大很多的列队算法战略。下一大节将重点先容Linux的QDisc机制。
列队原则(QDisc)
我们已懂得到,驱动行列只是复杂的先进先出行列,它不克不及未来自分歧数据流的包辨别开来。如许的计划能使网卡驱动软件变得玲珑而且有更高的效力。必要注重的是,一些加倍先辈的以太网和无线网卡能够撑持多种互相自力的传送行列,可是它们实践上都长短常相似的先辈先出行列罢了。体系中更高层卖力在个中选择一种行列举行利用。
夹在IP数据栈和驱动行列两头的,是列队原则(QDisc)层(见Figure1),它卖力完成Linux内核中的(数据传输)交通办理功效,好比交通分类,优先级别和速度协商。QDisc层的设置比起其他层要加倍坚苦一些。要懂得QDisc层,必需懂得三个十分主要的观点:列队划定规矩,类和过滤器。
列队原则(QDisc)是Linux对交通行列的笼统,可是比“先进先出”要庞大一些。经由过程收集接口,QDisc能自力地举行庞大的行列办理,而不必要改动IP数据栈大概网卡驱动的运转形式。每一个收集接口城市默许被设为pfifo_fastQDisc,pfifo_fastQDisc在TOS的基本上,完成了复杂的三带优先机制(threebandprioritizationscheme)。固然是默许机制,可是这其实不代表它是最好的机制,由于pfifo_fastQDisc的行列深度很年夜(鄙人面txqueuelen中会有注释),而且它也不克不及辨别分歧数据流。
第二个和QDisc严密相干的观点是类。单个QDisc能经由过程完成分歧类,对数据中的分歧部分举行分歧处置。比方,层级暗示桶(theHierarchicalTokenBucket(HTB))QDisc,能利用户设置500Kbps和300Kbps的类,而且把持数据使之进进用户但愿其进进的类中。并非一切QDisc都完成这类功效,我们一样平常把可以如许分类的QDisc称为——可分类的QDiscs。
过滤器(也叫分类器)是一种分类的机制,用来将数据分类到特定QDisc或类中。过滤器的品种良多,它们的庞大度也都不不异。u32是个中最一般也最简单利用的一种。如今还没有针对u32的文档,可是你能够在这里找到一个例子oneofmyQoSscripts。
在LARTCHOWTOandthetcmanpages,你能够懂得到更多关于QDiscs、类和过滤器的细节。
传输层和列队原则间的缓存
你大概已注重到了,在本来的图例中,列队原则层之上就没无数据包的行列了。这意味着收集数据栈要末间接把数据包放进列队原则中,要末把数据包推回它的上一层(好比套接字缓存的情形),假如这时候行列已满的话。接上去一个很分明的成绩是,当栈有良多数据包要发送的时分该怎样办?当TCP的堵塞窗口很年夜,大概某个使用正在疾速发送UDP数据包时,就会呈现要发送良多数据包的情形。关于只要一个行列的QDisc来讲,相似成绩在图例4中就已呈现过了。这里的成绩是,一个带宽很年夜大概包速度很年夜的数据流会把行列里的一切空间占满,形成数据包丧失和延时的成绩。更糟的是,如许极可能会使另外一个缓存发生,进而发生一个运动行列(standingqueue),形成更严峻的延时并使TCP的RTT和堵塞窗口的盘算呈现成绩。因为Linux默许利用唯一一个行列的pfifo_fastQDisc(由于年夜多半数据流的TOS=0),以是如许的成绩十分罕见。
Linux3.6.0(2012-09-30)呈现后,Linux内核增添了TCP小行列(TCPsmallqueue)的机制,用于办理该成绩。TCP小行列对每一个TCP数据流中,可以同时介入列队的字节数做出了限定。如许会发生意想不到的感化,能使内核将数据推回本来的使用,使得使用能更无效地优先处置写进套接字的哀求。今朝(2012-12-28),除TCP以外的其他传输协定的单个数据流,仍是有大概堵塞QDsic层的。
另外一种能部分化决传输层堵塞的举措,是利用有很多行列的QDsic层,最好是对每个数据流都能有一个行列。SFQ和fq_codel的QDsic都可以很好地办理这个成绩,使每一个数据流都分到一个行列。
怎样把持Linux中的行列长度
驱动行列
关于以太网设备,能够用ethtool命令来把持行列长度。ethtool供应底层的接口数据,并能把持IP数据栈和驱动的各类特征。
-g可以将驱动行列的参数展现出来:
1
2
3
4
5
6
7
8
9
10
11
12
[root<ahref="http://www.jobbole.com/members/alpha/"rel="nofollow">@alpha</a>net-next]#ethtool-geth0
Ringparametersforeth0:
Pre-setmaximums:
RX:16384
RXMini:0
RXJumbo:0
TX:16384
Currenthardwaresettings:
RX:512
RXMini:0
RXJumbo:0
TX:256

从下面能够看出,网卡驱动默许在传输行列中有256个形貌符。后面我们提到过,为了免缓存丢包等情形,应当减小驱动行列的巨细,这同时也能减小延时。引进BQL后,就没有需要再往调剂驱动行列的巨细了(下文中有设置BQL的先容)。
ethtool也能用于调剂优化特征,如TSO、UFO和GSO。-k指令能展现呈现在卸货(offload)形态,-K能调剂这些形态。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[dan<ahref="http://www.jobbole.com/members/alpha/"rel="nofollow">@alpha</a>~]$ethtool-keth0
Offloadparametersforeth0:
rx-checksumming:off
tx-checksumming:off
scatter-gather:off
tcp-segmentation-offload:off
udp-fragmentation-offload:off
generic-segmentation-offload:off
generic-receive-offload:on
large-receive-offload:off
rx-vlan-offload:off
tx-vlan-offload:off
ntuple-filters:off
receive-hashing:off

由于TSO,GSO,UFO和GRO年夜年夜增添了可以介入列队的字节数,假如比拟于吞吐量你更在乎延时的话,你就应当禁用这些优化。一样平常来讲禁用这些优化,不会使你感应CPU和吞吐量收到了影响,除非你的体系要处置的数据率很年夜。
字节行列限定(BQL)
BQL算法可以自我顺应,以是应当没甚么需要往常常调剂它。可是,假如你很存眷最年夜在低码率上的最年夜延时的话,大概你会想要比现有LIMIT更年夜的下限值。在/sys的目次中能够找到设置BQL的文件,目次的详细地点取决于网卡的地位和名字。在我的服务器上,eth0的目次是:
1
/sys/devices/pci0000:00/0000:00:14.0/net/eth0/queues/tx-0/byte_queue_limits

内里的文件有:


  • hold_time:修正LIMIT间的工夫(millisecond为单元)。
  • inflight:介入列队但没有发送的字节数。
  • limit:BQL盘算出的LIMIT值。假如该网卡不撑持BQL机制,则为0。
  • limit_max:可以修正的LIMIT最年夜值。调低该值能减小延时。
  • limit_min:可以修正的LIMIT最小值。调高该值能增年夜吞吐量。
为可以介入列队的字节数设置一个下限,改一下limit_max文件就好了:
1
echo"3000">limit_max

甚么是txqueuelen?
在后面我们已提到了减小网卡传输行列巨细的感化。以后的行列巨细可以经由过程ip和ifconfig命令取得。可是使人狐疑地是,两个命令失掉的行列长度分歧:
<p>1
2
3
4
5
6
7
8
9
10
[dan<ahref="http://www.jobbole.com/members/alpha/"rel="nofollow">@alpha</a>~]$ifconfigeth0
eth0Linkencap:EthernetHWaddr00:18:F3:51:44:10
inetaddr:69.41.199.58Bcast:69.41.199.63Mask:255.255.255.248
inet6addr:fe80::218:f3ff:fe51:4410/64Scope:Link
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXpackets:435033errors:0dropped:0overruns:0frame:0
TXpackets:429919errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RXbytes:65651219(62.6MiB)TXbytes:132143593(126.0MiB)
<p>
飘飘悠悠 该用户已被删除
沙发
发表于 2015-1-20 20:56:58 | 只看该作者
首先Linux是开源的,这也是最主要的原因,想学windows,Unix,对不起我们没源代码。也正是因为这样,Linux才能够像滚雪球一样越滚越大,发展到现在这种规模。
乐观 该用户已被删除
板凳
发表于 2015-1-24 16:01:27 | 只看该作者
了解Linux的网络安全,系统的安全,用户的安全等。安全对于每位用户,管理员来说是非常重要的。
灵魂腐蚀 该用户已被删除
地板
发表于 2015-1-25 09:39:44 | 只看该作者
这也正是有别的OS得以存在的原因,每个系统都有其自身的优点。?
5#
发表于 2015-1-26 17:15:57 | 只看该作者
Linux高手更具有鼓励新手的文化精神。如何在Linux社区获得帮助,需要说明的是你要有周全的思考,准备好你的问题,不要草率的发问。
柔情似水 该用户已被删除
6#
发表于 2015-2-4 17:10:18 | 只看该作者
首先Linux是开源的,这也是最主要的原因,想学windows,Unix,对不起我们没源代码。也正是因为这样,Linux才能够像滚雪球一样越滚越大,发展到现在这种规模。
老尸 该用户已被删除
7#
发表于 2015-2-8 20:40:53 | 只看该作者
眼看这个学期的Linux课程已经告一段落了,我觉得有必要写一遍心得体会来总结一下这学期对着门课程的学习。
第二个灵魂 该用户已被删除
8#
发表于 2015-2-16 05:01:19 | 只看该作者
上课传授的不仅仅是知识,更重要的是一些道理,包括一些做人的道理,讲课时也抓住重点,循序渐进,让同学理解很快;更可贵的是不以你过去的成绩看问题.
再现理想 该用户已被删除
9#
发表于 2015-3-4 23:59:20 | 只看该作者
这种补充有助于他人在邮件列表/新闻组/论坛中搜索对你有过帮助的完整解决方案,这可能对他们也很有用。
只想知道 该用户已被删除
10#
发表于 2015-3-6 16:13:10 | 只看该作者
我们这一代90后,从小接触的是windows98,家里条件好的自己有电脑装的是2000,后来又有了XP,上大学时又有了win7。
山那边是海 该用户已被删除
11#
发表于 2015-3-10 08:05:57 | 只看该作者
编程学习及开发,Linux是免费,开源的操作系统,并且可开发工具相当多,如果您支持自由软件,一定要同广大热爱自由软件人士一同为其不懈努力。
爱飞 该用户已被删除
12#
发表于 2015-3-10 12:59:06 | 只看该作者
为什么要学Linux呢?每个人都有不同的看法,下面我说说自己的感想吧。?
小女巫 该用户已被删除
13#
发表于 2015-3-17 07:11:36 | 只看该作者
这也正是有别的OS得以存在的原因,每个系统都有其自身的优点。?
透明 该用户已被删除
14#
发表于 2015-3-24 01:34:42 | 只看该作者
清楚了解网络的基础知识,特别是在Linux下应用知识,如接入internet等等。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-1 21:29

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表