新聞中心
網(wǎng)絡(luò)質(zhì)量及網(wǎng)絡(luò)性能一直是企業(yè)與個(gè)人所關(guān)心的重點(diǎn),為此,許多網(wǎng)絡(luò)管理員和系統(tǒng)管理員通過(guò)不斷地研究和嘗試,試圖實(shí)現(xiàn)更好的網(wǎng)絡(luò)質(zhì)量服務(wù)(QoS)。在眾多的QoS技術(shù)中,Linux QoS 被認(rèn)為是一種簡(jiǎn)便易行的解決方案。本文將深入探討Linux QoS的實(shí)現(xiàn)機(jī)制,幫助讀者理解Linux QoS的優(yōu)勢(shì)和限制,幫助讀者更好地應(yīng)用Linux QoS技術(shù)。

一、Linux QoS的概述
QoS(Quality of Service)質(zhì)量服務(wù),是一種網(wǎng)絡(luò)技術(shù),通過(guò)對(duì)網(wǎng)絡(luò)流量進(jìn)行控制和調(diào)整,來(lái)提高網(wǎng)絡(luò)的性能。Linux QoS是一種基于Linux內(nèi)核實(shí)現(xiàn)的QoS技術(shù),通過(guò)對(duì)Linux內(nèi)核中的網(wǎng)絡(luò)流量進(jìn)行分類和控制,來(lái)實(shí)現(xiàn)各種QoS服務(wù)。
Linux QoS技術(shù)主要分類為三種:
(1)差異化服務(wù)(DiffServ),它是一種面向服務(wù)質(zhì)量的網(wǎng)絡(luò)架構(gòu),可提供QoS級(jí)別服務(wù),以便在網(wǎng)絡(luò)中向待分類流提供優(yōu)先級(jí)。當(dāng)網(wǎng)絡(luò)擁塞時(shí),這些流的優(yōu)先級(jí)將確定其在網(wǎng)絡(luò)資源分配中的優(yōu)先級(jí)。該技術(shù)通常用于有限帶寬情況下的網(wǎng)絡(luò)。
(2)集成服務(wù)(IntServ),它利用公共網(wǎng)絡(luò)的服務(wù)質(zhì)量特征來(lái)提供服務(wù)質(zhì)量。此技術(shù)用于高速網(wǎng)絡(luò)和網(wǎng)絡(luò)中存在連續(xù)保證帶寬的應(yīng)用。在幾乎沒(méi)有擁塞的情況下,該技術(shù)會(huì)分配足夠的帶寬給每一個(gè)QoS流。
(3) 策略性選擇服務(wù)(PSS),它是一個(gè)以策略為基礎(chǔ)的聯(lián)盟,在一個(gè)聯(lián)盟中的用戶可以憑借自己的策略來(lái)訪問(wèn)自己所需要的服務(wù)。這種技術(shù)在企業(yè)內(nèi)部網(wǎng)絡(luò)中經(jīng)常使用。
二、Linux QoS的實(shí)現(xiàn)方式
Linux QoS的實(shí)現(xiàn)方式主要包括三個(gè)方面:
(1)流量分類
Linux QoS的流量分類是通過(guò)將網(wǎng)絡(luò)中的流量進(jìn)行分類,并將其放入不同的隊(duì)列中,這些隊(duì)列可按照優(yōu)先級(jí)從高到低的順序進(jìn)行排列。Linux下的流量分類機(jī)制主要有基于 iptables 的流量分類和基于 tc 命令的流量分類。
(2)隊(duì)列調(diào)度
隊(duì)列調(diào)度是Linux QoS中用來(lái)調(diào)整流量的重要機(jī)制之一,其主要目的是對(duì)網(wǎng)絡(luò)流量進(jìn)行排隊(duì)、調(diào)度和按照一定的策略分配。隊(duì)列調(diào)度可實(shí)現(xiàn)不同流量的優(yōu)先級(jí)。
(3)流量控制
流量控制是Linux QoS的最后一個(gè)環(huán)節(jié),主要用于根據(jù)不同應(yīng)用程序的需求,對(duì)流量進(jìn)行限制、控制。通過(guò)流量控制機(jī)制,可確保網(wǎng)絡(luò)的正常運(yùn)行。
三、Linux QoS的應(yīng)用
(1)業(yè)務(wù)分級(jí)與限速
通過(guò)對(duì)網(wǎng)絡(luò)中的數(shù)據(jù)流進(jìn)行分類和限速,可以使得不同的業(yè)務(wù)擁有不同的優(yōu)先級(jí),從而降低只負(fù)荷造成的瓶頸,實(shí)現(xiàn)網(wǎng)絡(luò)的負(fù)載均衡。
(2)視頻流優(yōu)先級(jí)
在觀看視頻時(shí),如果網(wǎng)絡(luò)帶寬不足,會(huì)導(dǎo)致視頻的像素下降、畫(huà)面卡頓,用戶體驗(yàn)大打折扣。使用Linux QoS技術(shù),對(duì)視頻流的優(yōu)先級(jí)進(jìn)行提高,能夠使得視頻流在帶寬不足的情況下仍然能夠得到保證。
(3)游戲流優(yōu)先級(jí)
當(dāng)網(wǎng)絡(luò)有擁塞情況發(fā)生時(shí),游戲可能會(huì)因?yàn)榫W(wǎng)絡(luò)卡頓或丟包而影響游戲體驗(yàn)。通常來(lái)說(shuō),需要通過(guò)提高游戲的流量?jī)?yōu)先級(jí),讓重要數(shù)據(jù)包優(yōu)先傳輸,來(lái)保證網(wǎng)絡(luò)的高質(zhì)量和行暢。
四、Linux QoS的局限
盡管Linux QoS 在網(wǎng)絡(luò)帶寬管理和流量控制領(lǐng)域有很多優(yōu)秀的優(yōu)點(diǎn),但也存在一些局限性。主要體現(xiàn)在以下幾個(gè)方面:
(1)Linux QoS技術(shù)對(duì)于新晉管理員使用門檻較高,需要對(duì)Linux的網(wǎng)絡(luò)原理和Linux實(shí)現(xiàn)QoS的機(jī)制有著更深入的了解。
(2)流量分類對(duì)硬件層面有著更高的需求,需要更高速的網(wǎng)路交換機(jī)支持,來(lái)確保較高級(jí)別的服務(wù)質(zhì)量。
結(jié)論:
Linux QoS 的實(shí)現(xiàn)機(jī)制及其應(yīng)用場(chǎng)景是一個(gè)極為廣泛的話題,隨著網(wǎng)絡(luò)技術(shù)的變化和網(wǎng)絡(luò)性能的需求增加,Linux QoS 技術(shù)必然會(huì)有新的發(fā)展。潛在的研究和應(yīng)用價(jià)值是無(wú)限的,我們需要在不斷摸索和實(shí)踐的過(guò)程中,不斷發(fā)現(xiàn)和探討。
相關(guān)問(wèn)題拓展閱讀:
- 面試 linux 文件系統(tǒng)怎樣io到底層
- Linux下IPV4和IPV6的互操作性研究
面試 linux 文件系統(tǒng)怎樣io到底層
前言:本文主要講解LinuxIO調(diào)度層的三種模式:cfp、deadline和noop,并給出各自的優(yōu)化和適用場(chǎng)景建議。IO調(diào)度發(fā)生在Linux內(nèi)核的IO調(diào)度層。這個(gè)層次是針對(duì)Linux的整體IO層次體系來(lái)說(shuō)的。從read()或者write()系統(tǒng)調(diào)用的角度來(lái)說(shuō),Linux整體IO體系可以分為七層,它們分別是:VFS層:虛擬文件系統(tǒng)層。由于內(nèi)核要跟多種文件系統(tǒng)打交道,而每一種文件系統(tǒng)所實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)和相關(guān)方法都可能不盡相同,所以,內(nèi)核抽象了這一層,專門用來(lái)適配各種文件系統(tǒng),并對(duì)外提供統(tǒng)一操作接口。文件系統(tǒng)層:不同的文件系統(tǒng)實(shí)現(xiàn)自己的操作過(guò)程,提供自己特有的特征,具體不多說(shuō)了,大家愿意的話自己去看代碼即可。頁(yè)緩存層:負(fù)責(zé)真對(duì)page的緩存。通用塊層:由于絕大多數(shù)情況的io操作是跟塊設(shè)備打交道,所以Linux在此提供了一個(gè)類似vfs層的塊設(shè)備操作抽象層。下層對(duì)接各種不同屬性的塊設(shè)備,對(duì)上提供統(tǒng)一的BlockIO請(qǐng)求標(biāo)準(zhǔn)。IO調(diào)度層:因?yàn)榻^大多數(shù)的塊設(shè)備都是類似磁盤(pán)這樣的設(shè)備,所以有必要根據(jù)這類設(shè)備的特點(diǎn)以及應(yīng)用的不同特點(diǎn)來(lái)設(shè)置一些不同的調(diào)度算法和隊(duì)列。以便在不同的應(yīng)用環(huán)境下有針對(duì)性的提高磁盤(pán)的讀寫(xiě)效率,這里就是大名鼎鼎的Linux電梯所起作用的地方。針對(duì)機(jī)械硬盤(pán)的各種調(diào)度方法就是在這實(shí)現(xiàn)的。塊設(shè)備驅(qū)動(dòng)層:驅(qū)動(dòng)層對(duì)外提供相對(duì)比較高級(jí)的設(shè)備操作接口,往往是C語(yǔ)言的,而下層對(duì)接設(shè)備本身的操作方法和規(guī)范。塊設(shè)備層:這層就是具體的物理設(shè)備了,定義了各種真對(duì)設(shè)備操作方法和規(guī)范。有一個(gè)已經(jīng)整理好的,非常經(jīng)典,一圖勝千言:我們今天要研究的內(nèi)容主要在IO調(diào)度這一層。它要解決的核心問(wèn)題是,如何提高塊設(shè)備IO的整體性能?這一層也主要是針對(duì)機(jī)械硬盤(pán)結(jié)構(gòu)而設(shè)計(jì)的。眾所周知,機(jī)械硬盤(pán)的存儲(chǔ)介質(zhì)是磁盤(pán),磁頭在盤(pán)片上移動(dòng)進(jìn)行磁道尋址,行為類似播放一張唱片。這種結(jié)構(gòu)的特點(diǎn)是,順序訪問(wèn)時(shí)吞吐量較高,但是如果一旦對(duì)盤(pán)片有隨機(jī)訪問(wèn),那么大量的時(shí)間都會(huì)浪費(fèi)在磁頭的移動(dòng)上,這時(shí)候就會(huì)導(dǎo)致每次IO的響應(yīng)時(shí)間變長(zhǎng),極大的降低IO的響應(yīng)速度。磁頭在盤(pán)片上尋道的操作,類似電梯調(diào)度,實(shí)際上在最開(kāi)始的時(shí)期,Linux把這個(gè)算法命名為L(zhǎng)inux電梯算法,即:如果在尋道的過(guò)程中,能把順序路過(guò)的相關(guān)磁道的數(shù)據(jù)請(qǐng)求都“順便”處理掉,那么就可以在比較小影響響應(yīng)速度的前提下,提高整體IO的吞吐量。這就是我們?yōu)槭裁匆O(shè)計(jì)IO調(diào)度算法的原因。目前在內(nèi)核中默認(rèn)開(kāi)啟了三種算法/模式:noop,cfq和deadline。嚴(yán)格算應(yīng)該是兩種:因?yàn)橹环N叫做noop,就是空操作調(diào)度算法,也就是沒(méi)有任何調(diào)度操作,并不對(duì)io請(qǐng)求進(jìn)行排序,僅僅做適當(dāng)?shù)膇o合并的一個(gè)fifo隊(duì)列。目前內(nèi)核中默認(rèn)的調(diào)度算法應(yīng)該是cfq,叫做完全公平隊(duì)列調(diào)度。這個(gè)調(diào)度算法人如其名,它試圖給所有進(jìn)程提供一個(gè)完全公平的IO操作環(huán)境。注:請(qǐng)大家一定記住這個(gè)詞語(yǔ),cfq,完全公平隊(duì)列調(diào)度,不然下文就沒(méi)法看了。cfq為每個(gè)進(jìn)程創(chuàng)建一個(gè)同步IO調(diào)度隊(duì)列,并默認(rèn)以時(shí)間片和請(qǐng)求數(shù)限定的方式分配IO資源,以此保證每個(gè)進(jìn)程的IO資源占用是公平的,cfq還實(shí)現(xiàn)了針對(duì)進(jìn)程級(jí)別的優(yōu)先級(jí)調(diào)度,這個(gè)我們后面會(huì)詳細(xì)解釋。查看和修改IO調(diào)度算法的方法是:cfq是通用服務(wù)器比較好的IO調(diào)度算法選擇,對(duì)桌面用戶也是比較好的選擇。但是對(duì)于很多IO壓力較大的場(chǎng)景就并不是很適應(yīng),尤其是IO壓力集中在某些進(jìn)程上的場(chǎng)景。因?yàn)檫@種場(chǎng)景我們需要的滿足某個(gè)或者某幾個(gè)進(jìn)程的IO響應(yīng)速度,而不是讓所有的進(jìn)程公平的使用IO,比如數(shù)據(jù)庫(kù)應(yīng)用。deadline調(diào)度(最終期限調(diào)度)就是更適合上述場(chǎng)景的解決方案。deadline實(shí)現(xiàn)了四個(gè)隊(duì)列:其中兩個(gè)分別處理正常read和write,按扇區(qū)號(hào)排序,進(jìn)行正常io的合并處理以提高吞吐量。因?yàn)镮O請(qǐng)求可能會(huì)集中在某些磁盤(pán)位置,這樣會(huì)導(dǎo)致新來(lái)的請(qǐng)求一直被合并,可能會(huì)有其他磁盤(pán)位置的io請(qǐng)求被餓死。另外兩個(gè)處理超時(shí)read和write的隊(duì)列,按請(qǐng)求創(chuàng)建時(shí)間排序,如果有超時(shí)的請(qǐng)求出現(xiàn),就放進(jìn)這兩個(gè)隊(duì)列,調(diào)度算法保證超時(shí)(達(dá)到最終期限時(shí)間)的隊(duì)列中的請(qǐng)求會(huì)優(yōu)先被處理,防止請(qǐng)求被餓死。不久前,內(nèi)核還是默認(rèn)標(biāo)配四種算法,還有一種叫做as的算法(Anticipatoryscheduler),預(yù)測(cè)調(diào)度算法。一個(gè)高大上的名字,搞得我一度認(rèn)為L(zhǎng)inux內(nèi)核都會(huì)算命了。結(jié)果發(fā)現(xiàn),無(wú)非是在基于deadline算法做io調(diào)度的之前等一小會(huì)時(shí)間,如果這段時(shí)間內(nèi)有可以合并的io請(qǐng)求到來(lái),就可以合并處理,提高deadline調(diào)度的在順序讀寫(xiě)情況下的數(shù)據(jù)吞吐量。其實(shí)這根本不是啥預(yù)測(cè),我覺(jué)得不如叫撞大運(yùn)調(diào)度算法,當(dāng)然這種策略在某些特定場(chǎng)景差效果不錯(cuò)。但是在大多數(shù)場(chǎng)景下,這個(gè)調(diào)度不僅沒(méi)有提高吞吐量,還降低了響應(yīng)速度,所以內(nèi)核干脆把它從默認(rèn)配置里刪除了。畢竟Linux的宗旨是實(shí)用,而我們也就不再這個(gè)調(diào)度算法上多費(fèi)口舌了。1、cfq:完全公平隊(duì)列調(diào)度cfq是內(nèi)核默認(rèn)選擇的IO調(diào)度隊(duì)列,它在桌面應(yīng)用場(chǎng)景以及大多數(shù)常見(jiàn)應(yīng)用場(chǎng)景下都是很好的選擇。如何實(shí)現(xiàn)一個(gè)所謂的完全公平隊(duì)列(CompletelyFairQueueing)?首先我們要理解所謂的公平是對(duì)誰(shuí)的公平?從操作系統(tǒng)的角度來(lái)說(shuō),產(chǎn)生操作行為的主體都是進(jìn)程,所以這里的公平是針對(duì)每個(gè)進(jìn)程而言的,我們要試圖讓進(jìn)程可以公平的占用IO資源。那么如何讓進(jìn)程公平的占用IO資源?我們需要先理解什么是IO資源。當(dāng)我們衡量一個(gè)IO資源的時(shí)候,一般喜歡用的是兩個(gè)單位,一個(gè)是數(shù)據(jù)讀寫(xiě)的帶寬,另一個(gè)是數(shù)據(jù)讀寫(xiě)的IOPS。帶寬就是以時(shí)間為單位的讀寫(xiě)數(shù)據(jù)量,比如,100Mbyte/s。而IOPS是以時(shí)間為單位的讀寫(xiě)次數(shù)。在不同的讀寫(xiě)情境下,這兩個(gè)單位的表現(xiàn)可能不一樣,但是可以確定的是,兩個(gè)單位的任何一個(gè)達(dá)到了性能上限,都會(huì)成為IO的瓶頸。從機(jī)械硬盤(pán)的結(jié)構(gòu)考慮,如果讀寫(xiě)是順序讀寫(xiě),那么IO的表現(xiàn)是可以通過(guò)比較少的IOPS達(dá)到較大的帶寬,因?yàn)榭梢院喜⒑芏郔O,也可以通過(guò)預(yù)讀等方式加速數(shù)據(jù)讀取效率。當(dāng)IO的表現(xiàn)是偏向于隨機(jī)讀寫(xiě)的時(shí)候,那么IOPS就會(huì)變得更大,IO的請(qǐng)求的合并可能性下降,當(dāng)每次io請(qǐng)求數(shù)據(jù)越少的時(shí)候,帶寬表現(xiàn)就會(huì)越低。從這里我們可以理解,針對(duì)進(jìn)程的IO資源的主要表現(xiàn)形式有兩個(gè):進(jìn)程在單位時(shí)間內(nèi)提交的IO請(qǐng)求個(gè)數(shù)和進(jìn)程占用IO的帶寬。其實(shí)無(wú)論哪個(gè),都是跟進(jìn)程分配的IO處理時(shí)間長(zhǎng)度緊密相關(guān)的。有時(shí)業(yè)務(wù)可以在較少IOPS的情況下占用較大帶寬,另外一些則可能在較大IOPS的情況下占用較少帶寬,所以對(duì)進(jìn)程占用IO的時(shí)間進(jìn)行調(diào)度才是相對(duì)最公平的。即,我不管你是IOPS高還是帶寬占用高,到了時(shí)間咱就換下一個(gè)進(jìn)程處理,你愛(ài)咋樣咋樣。所以,cfq就是試圖給所有進(jìn)程分配等同的塊設(shè)備使用的時(shí)間片,進(jìn)程在時(shí)間片內(nèi),可以將產(chǎn)生的IO請(qǐng)求提交給塊設(shè)備進(jìn)行處理,時(shí)間片結(jié)束,進(jìn)程的請(qǐng)求將排進(jìn)它自己的隊(duì)列,等待下次調(diào)度的時(shí)候進(jìn)行處理。這就是cfq的基本原理。當(dāng)然,現(xiàn)實(shí)生活中不可能有真正的“公平”,常見(jiàn)的應(yīng)用場(chǎng)景下,我們很肯能需要人為的對(duì)進(jìn)程的IO占用進(jìn)行人為指定優(yōu)先級(jí),這就像對(duì)進(jìn)程的CPU占用設(shè)置優(yōu)先級(jí)的概念一樣。所以,除了針對(duì)時(shí)間片進(jìn)行公平隊(duì)列調(diào)度外,cfq還提供了優(yōu)先級(jí)支持。每個(gè)進(jìn)程都可以設(shè)置一個(gè)IO優(yōu)先級(jí),cfq會(huì)根據(jù)這個(gè)優(yōu)先級(jí)的設(shè)置情況作為調(diào)度時(shí)的重要參考因素。優(yōu)先級(jí)首先分成三大類:RT、BE、IDLE,它們分別是實(shí)時(shí)(RealTime)、更佳效果(BestTry)和閑置(Idle)三個(gè)類別,對(duì)每個(gè)類別的IO,cfq都使用不同的策略進(jìn)行處理。另外,RT和BE類別中,分別又再劃分了8個(gè)子優(yōu)先級(jí)實(shí)現(xiàn)更細(xì)節(jié)的QOS需求,而IDLE只有一個(gè)子優(yōu)先級(jí)。另外,我們都知道內(nèi)核默認(rèn)對(duì)存儲(chǔ)的讀寫(xiě)都是經(jīng)過(guò)緩存(buffer/cache)的,在這種情況下,cfq是無(wú)法區(qū)分當(dāng)前處理的請(qǐng)求是來(lái)自哪一個(gè)進(jìn)程的。只有在進(jìn)程使用同步方式(syncread或者syncwirte)或者直接IO(DirectIO)方式進(jìn)行讀寫(xiě)的時(shí)候,cfq才能區(qū)分出IO請(qǐng)求來(lái)自哪個(gè)進(jìn)程。所以,除了針對(duì)每個(gè)進(jìn)程實(shí)現(xiàn)的IO隊(duì)列以外,還實(shí)現(xiàn)了一個(gè)公共的隊(duì)列用來(lái)處理異步請(qǐng)求。當(dāng)前內(nèi)核已經(jīng)實(shí)現(xiàn)了針對(duì)IO資源的cgroup資源隔離,所以在以上體系的基礎(chǔ)上,cfq也實(shí)現(xiàn)了針對(duì)cgroup的調(diào)度支持。總的來(lái)說(shuō),cfq用了一系列的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)了以上所有復(fù)雜功能的支持,大家可以通過(guò)源代碼看到其相關(guān)實(shí)現(xiàn),文件在源代碼目錄下的block/cfq-iosched.c。1.1cfq設(shè)計(jì)原理在此,我們對(duì)整體數(shù)據(jù)結(jié)構(gòu)做一個(gè)簡(jiǎn)要描述:首先,cfq通過(guò)一個(gè)叫做cfq_data的數(shù)據(jù)結(jié)構(gòu)維護(hù)了整個(gè)調(diào)度器流程。在一個(gè)支持了cgroup功能的cfq中,全部進(jìn)程被分成了若干個(gè)contralgroup進(jìn)行管理。每個(gè)cgroup在cfq中都有一個(gè)cfq_group的結(jié)構(gòu)進(jìn)行描述,所有的cgroup都被作為一個(gè)調(diào)度對(duì)象放進(jìn)一個(gè)紅黑樹(shù)中,并以vdisktime為key進(jìn)行排序。vdisktime這個(gè)時(shí)間紀(jì)錄的是當(dāng)前cgroup所占用的io時(shí)間,每次對(duì)cgroup進(jìn)行調(diào)度時(shí),總是通過(guò)紅黑樹(shù)選擇當(dāng)前vdisktime時(shí)間最少的cgroup進(jìn)行處理,以保證所有cgroups之間的IO資源占用“公平”。當(dāng)然我們知道,cgroup是可以對(duì)blkio進(jìn)行資源比例分配的,其作用原理就是,分配比例大的cgroup占用vdisktime時(shí)間增長(zhǎng)較慢,分配比例小的vdisktime時(shí)間增長(zhǎng)較快,快慢與分配比例成正比。這樣就做到了不同的cgroup分配的IO比例不一樣,并且在cfq的角度看來(lái)依然是“公平“的。選擇好了需要處理的cgroup(cfq_group)之后,調(diào)度器需要決策選擇下一步的service_tree。service_tree這個(gè)數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)的都是一系列的紅黑樹(shù),主要目的是用來(lái)實(shí)現(xiàn)請(qǐng)求優(yōu)先級(jí)分類的,就是RT、BE、IDLE的分類。每一個(gè)cfq_group都維護(hù)了7個(gè)service_trees,其定義如下:其中service_tree_idle就是用來(lái)給IDLE類型的請(qǐng)求進(jìn)行排隊(duì)用的紅黑樹(shù)。而上面二維數(shù)組,首先之一個(gè)維度針對(duì)RT和BE分別各實(shí)現(xiàn)了一個(gè)數(shù)組,每一個(gè)數(shù)組中都維護(hù)了三個(gè)紅黑樹(shù),分別對(duì)應(yīng)三種不同子類型的請(qǐng)求,分別是:SYNC、SYNC_NOIDLE以及ASYNC。我們可以認(rèn)為SYNC相當(dāng)于SYNC_IDLE并與SYNC_NOIDLE對(duì)應(yīng)。idling是cfq在設(shè)計(jì)上為了盡量合并連續(xù)的IO請(qǐng)求以達(dá)到提高吞吐量的目的而加入的機(jī)制,我們可以理解為是一種“空轉(zhuǎn)”等待機(jī)制??辙D(zhuǎn)是指,當(dāng)一個(gè)隊(duì)列處理一個(gè)請(qǐng)求結(jié)束后,會(huì)在發(fā)生調(diào)度之前空等一小會(huì)時(shí)間,如果下一個(gè)請(qǐng)求到來(lái),則可以減少磁頭尋址,繼續(xù)處理順序的IO請(qǐng)求。為了實(shí)現(xiàn)這個(gè)功能,cfq在service_tree這層數(shù)據(jù)結(jié)構(gòu)這實(shí)現(xiàn)了SYNC隊(duì)列,如果請(qǐng)求是同步順序請(qǐng)求,就入隊(duì)這個(gè)servicetree,如果請(qǐng)求是同步隨機(jī)請(qǐng)求,則入隊(duì)SYNC_NOIDLE隊(duì)列,以判斷下一個(gè)請(qǐng)求是否是順序請(qǐng)求。所有的異步寫(xiě)操作請(qǐng)求將入隊(duì)ASYNC的servicetree,并且針對(duì)這個(gè)隊(duì)列沒(méi)有空轉(zhuǎn)等待機(jī)制。此外,cfq還對(duì)SSD這樣的硬盤(pán)有特殊調(diào)整,當(dāng)cfq發(fā)現(xiàn)存儲(chǔ)設(shè)備是一個(gè)ssd硬盤(pán)這樣的隊(duì)列深度更大的設(shè)備時(shí),所有針對(duì)單獨(dú)隊(duì)列的空轉(zhuǎn)都將不生效,所有的IO請(qǐng)求都將入隊(duì)SYNC_NOIDLE這個(gè)servicetree。每一個(gè)servicetree都對(duì)應(yīng)了若干個(gè)cfq_queue隊(duì)列,每個(gè)cfq_queue隊(duì)列對(duì)應(yīng)一個(gè)進(jìn)程,這個(gè)我們后續(xù)再詳細(xì)說(shuō)明。cfq_group還維護(hù)了一個(gè)在cgroup內(nèi)部所有進(jìn)程公用的異步IO請(qǐng)求隊(duì)列,其結(jié)構(gòu)如下:異步請(qǐng)求也分成了RT、BE、IDLE這三類進(jìn)行處理,每一類對(duì)應(yīng)一個(gè)cfq_queue進(jìn)行排隊(duì)。BE和RT也實(shí)現(xiàn)了優(yōu)先級(jí)的支持,每一個(gè)類型有IOPRIO_BE_NR這么多個(gè)優(yōu)先級(jí),這個(gè)值定義為8,數(shù)組下標(biāo)為0-7。我們目前分析的內(nèi)核代碼版本為L(zhǎng)inux4.4,可以看出,從cfq的角度來(lái)說(shuō),已經(jīng)可以實(shí)現(xiàn)異步IO的cgroup支持了,我們需要定義一下這里所謂異步IO的含義,它僅僅表示從內(nèi)存的buffer/cache中的數(shù)據(jù)同步到硬盤(pán)的IO請(qǐng)求,而不是aio(man7aio)或者linux的native異步io以及l(fā)ibaio機(jī)制,實(shí)際上這些所謂的“異步”IO機(jī)制,在內(nèi)核中都是同步實(shí)現(xiàn)的(本質(zhì)上馮諾伊曼計(jì)算機(jī)沒(méi)有真正的“異步”機(jī)制)。我們?cè)谏厦嬉呀?jīng)說(shuō)明過(guò),由于進(jìn)程正常情況下都是將數(shù)據(jù)先寫(xiě)入buffer/cache,所以這種異步IO都是統(tǒng)一由cfq_group中的async請(qǐng)求隊(duì)列處理的。那么為什么在上面的service_tree中還要實(shí)現(xiàn)和一個(gè)ASYNC的類型呢?這當(dāng)然是為了支持區(qū)分進(jìn)程的異步IO并使之可以“完全公平”做準(zhǔn)備嘍。實(shí)際上在最新的cgroupv2的blkio體系中,內(nèi)核已經(jīng)支持了針對(duì)bufferIO的cgroup限速支持,而以上這些可能容易混淆的一堆類型,都是在新的體系下需要用到的類型標(biāo)記。新體系的復(fù)雜度更高了,功能也更加強(qiáng)大,但是大家先不要著急,正式的cgroupv2體系,在Linux4.5發(fā)布的時(shí)候會(huì)正式跟大家見(jiàn)面。我們繼續(xù)選擇service_tree的過(guò)程,三種優(yōu)先級(jí)類型的service_tree的選擇就是根據(jù)類型的優(yōu)先級(jí)來(lái)做選擇的,RT優(yōu)先級(jí)更高,BE其次,IDLE更低。就是說(shuō),RT里有,就會(huì)一直處理RT,RT沒(méi)了再處理BE。每個(gè)service_tree對(duì)應(yīng)一個(gè)元素為cfq_queue排隊(duì)的紅黑樹(shù),而每個(gè)cfq_queue就是內(nèi)核為進(jìn)程(線程)創(chuàng)建的請(qǐng)求隊(duì)列。每一個(gè)cfq_queue都會(huì)維護(hù)一個(gè)rb_key的變量,這個(gè)變量實(shí)際上就是這個(gè)隊(duì)列的IO服務(wù)時(shí)間(servicetime)。這里還是通過(guò)紅黑樹(shù)找到servicetime時(shí)間最短的那個(gè)cfq_queue進(jìn)行服務(wù),以保證“完全公平”。選擇好了cfq_queue之后,就要開(kāi)始處理這個(gè)隊(duì)列里的IO請(qǐng)求了。這里的調(diào)度方式基本跟deadline類似。cfq_queue會(huì)對(duì)進(jìn)入隊(duì)列的每一個(gè)請(qǐng)求進(jìn)行兩次入隊(duì),一個(gè)放進(jìn)fifo中,另一個(gè)放進(jìn)按訪問(wèn)扇區(qū)順序作為key的紅黑樹(shù)中。默認(rèn)從紅黑樹(shù)中取請(qǐng)求進(jìn)行處理,當(dāng)請(qǐng)求的延時(shí)時(shí)間達(dá)到deadline時(shí),就從紅黑樹(shù)中取等待時(shí)間最長(zhǎng)的進(jìn)行處理,以保證請(qǐng)求不被餓死。這就是整個(gè)cfq的調(diào)度流程,當(dāng)然其中還有很多細(xì)枝末節(jié)沒(méi)有交代,比如合并處理以及順序處理等等。1.2cfq的參數(shù)調(diào)整理解整個(gè)調(diào)度流程有助于我們決策如何調(diào)整cfq的相關(guān)參數(shù)。所有cfq的可調(diào)參數(shù)都可以在/sys/class/block/sda/queue/iosched/目錄下找到,當(dāng)然,在你的系統(tǒng)上,請(qǐng)將sda替換為相應(yīng)的磁盤(pán)名稱。我們來(lái)看一下都有什么:這些參數(shù)部分是跟機(jī)械硬盤(pán)磁頭尋道方式有關(guān)的,如果其說(shuō)明你看不懂,請(qǐng)先補(bǔ)充相關(guān)知識(shí):back_seek_max:磁頭可以向后尋址的更大范圍,默認(rèn)值為16M。back_seek_penalty:向后尋址的懲罰系數(shù)。這個(gè)值是跟向前尋址進(jìn)行比較的。以上兩個(gè)是為了防止磁頭尋道發(fā)生抖動(dòng)而導(dǎo)致尋址過(guò)慢而設(shè)置的?;舅悸肥沁@樣,一個(gè)io請(qǐng)求到來(lái)的時(shí)候,cfq會(huì)根據(jù)其尋址位置預(yù)估一下其磁頭尋道成本。設(shè)置一個(gè)更大值back_seek_max,對(duì)于請(qǐng)求所訪問(wèn)的扇區(qū)號(hào)在磁頭后方的請(qǐng)求,只要尋址范圍沒(méi)有超過(guò)這個(gè)值,cfq會(huì)像向前尋址的請(qǐng)求一樣處理它。再設(shè)置一個(gè)評(píng)估成本的系數(shù)back_seek_penalty,相對(duì)于磁頭向前尋址,向后尋址的距離為1/2(1/back_seek_penalty)時(shí),cfq認(rèn)為這兩個(gè)請(qǐng)求尋址的代價(jià)是相同。這兩個(gè)參數(shù)實(shí)際上是cfq判斷請(qǐng)求合并處理的條件限制,凡事復(fù)合這個(gè)條件的請(qǐng)求,都會(huì)盡量在本次請(qǐng)求處理的時(shí)候一起合并處理。fifo_expire_async:設(shè)置異步請(qǐng)求的超時(shí)時(shí)間。同步請(qǐng)求和異步請(qǐng)求是區(qū)分不同隊(duì)列處理的,cfq在調(diào)度的時(shí)候一般情況都會(huì)優(yōu)先處理同步請(qǐng)求,之后再處理異步請(qǐng)求,除非異步請(qǐng)求符合上述合并處理的條件限制范圍內(nèi)。當(dāng)本進(jìn)程的隊(duì)列被調(diào)度時(shí),cfq會(huì)優(yōu)先檢查是否有異步請(qǐng)求超時(shí),就是超過(guò)fifo_expire_async參數(shù)的限制。如果有,則優(yōu)先發(fā)送一個(gè)超時(shí)的請(qǐng)求,其余請(qǐng)求仍然按照優(yōu)先級(jí)以及扇區(qū)編號(hào)大小來(lái)處理。fifo_expire_sync:這個(gè)參數(shù)跟上面的類似,區(qū)別是用來(lái)設(shè)置同步請(qǐng)求的超時(shí)時(shí)間。slice_idle:參數(shù)設(shè)置了一個(gè)等待時(shí)間。這讓cfq在切換cfq_queue或servicetree的時(shí)候等待一段時(shí)間,目的是提高機(jī)械硬盤(pán)的吞吐量。一般情況下,來(lái)自同一個(gè)cfq_queue或者servicetree的IO請(qǐng)求的尋址局部性更好,所以這樣可以減少磁盤(pán)的尋址次數(shù)。這個(gè)值在機(jī)械硬盤(pán)上默認(rèn)為非零。當(dāng)然在固態(tài)硬盤(pán)或者硬RAID設(shè)備上設(shè)置這個(gè)值為非零會(huì)降低存儲(chǔ)的效率,因?yàn)楣虘B(tài)硬盤(pán)沒(méi)有磁頭尋址這個(gè)概念,所以在這樣的設(shè)備上應(yīng)該設(shè)置為0,關(guān)閉此功能。group_idle:這個(gè)參數(shù)也跟上一個(gè)參數(shù)類似,區(qū)別是當(dāng)cfq要切換cfq_group的時(shí)候會(huì)等待一段時(shí)間。在cgroup的場(chǎng)景下,如果我們沿用slice_idle的方式,那么空轉(zhuǎn)等待可能會(huì)在cgroup組內(nèi)每個(gè)進(jìn)程的cfq_queue切換時(shí)發(fā)生。這樣會(huì)如果這個(gè)進(jìn)程一直有請(qǐng)求要處理的話,那么直到這個(gè)cgroup的配額被耗盡,同組中的其它進(jìn)程也可能無(wú)法被調(diào)度到。這樣會(huì)導(dǎo)致同組中的其它進(jìn)程餓死而產(chǎn)生IO性能瓶頸。在這種情況下,我們可以將slice_idle=0而group_idle=8。這樣空轉(zhuǎn)等待就是以cgroup為單位進(jìn)行的,而不是以cfq_queue的進(jìn)程為單位進(jìn)行,以防止上述問(wèn)題產(chǎn)生。low_latency:這個(gè)是用來(lái)開(kāi)啟或關(guān)閉cfq的低延時(shí)(lowlatency)模式的開(kāi)關(guān)。當(dāng)這個(gè)開(kāi)關(guān)打開(kāi)時(shí),cfq將會(huì)根據(jù)target_latency的參數(shù)設(shè)置來(lái)對(duì)每一個(gè)進(jìn)程的分片時(shí)間(slicetime)進(jìn)行重新計(jì)算。這將有利于對(duì)吞吐量的公平(默認(rèn)是對(duì)時(shí)間片分配的公平)。關(guān)閉這個(gè)參數(shù)(設(shè)置為0)將忽略target_latency的值。這將使系統(tǒng)中的進(jìn)程完全按照時(shí)間片方式進(jìn)行IO資源分配。這個(gè)開(kāi)關(guān)默認(rèn)是打開(kāi)的。我們已經(jīng)知道cfq設(shè)計(jì)上有“空轉(zhuǎn)”(idling)這個(gè)概念,目的是為了可以讓連續(xù)的讀寫(xiě)操作盡可能多的合并處理,減少磁頭的尋址操作以便增大吞吐量。如果有進(jìn)程總是很快的進(jìn)行順序讀寫(xiě),那么它將因?yàn)閏fq的空轉(zhuǎn)等待命中率很高而導(dǎo)致其它需要處理IO的進(jìn)程響應(yīng)速度下降,如果另一個(gè)需要調(diào)度的進(jìn)程不會(huì)發(fā)出大量順序IO行為的話,系統(tǒng)中不同進(jìn)程IO吞吐量的表現(xiàn)就會(huì)很不均衡。就比如,系統(tǒng)內(nèi)存的cache中有很多臟頁(yè)要寫(xiě)回時(shí),桌面又要打開(kāi)一個(gè)瀏覽器進(jìn)行操作,這時(shí)臟頁(yè)寫(xiě)回的后臺(tái)行為就很可能會(huì)大量命中空轉(zhuǎn)時(shí)間,而導(dǎo)致瀏覽器的小量IO一直等待,讓用戶感覺(jué)瀏覽器運(yùn)行響應(yīng)速度變慢。這個(gè)low_latency主要是對(duì)這種情況進(jìn)行優(yōu)化的選項(xiàng),當(dāng)其打開(kāi)時(shí),系統(tǒng)會(huì)根據(jù)target_latency的配置對(duì)因?yàn)槊锌辙D(zhuǎn)而大量占用IO吞吐量的進(jìn)程進(jìn)行限制,以達(dá)到不同進(jìn)程IO占用的吞吐量的相對(duì)均衡。這個(gè)開(kāi)關(guān)比較合適在類似桌面應(yīng)用的場(chǎng)景下打開(kāi)。target_latency:當(dāng)low_latency的值為開(kāi)啟狀態(tài)時(shí),cfq將根據(jù)這個(gè)值重新計(jì)算每個(gè)進(jìn)程分配的IO時(shí)間片長(zhǎng)度。quantum:這個(gè)參數(shù)用來(lái)設(shè)置每次從cfq_queue中處理多少個(gè)IO請(qǐng)求。在一個(gè)隊(duì)列處理事件周期中,超過(guò)這個(gè)數(shù)字的IO請(qǐng)求將不會(huì)被處理。這個(gè)參數(shù)只對(duì)同步的請(qǐng)求有效。slice_sync:當(dāng)一個(gè)cfq_queue隊(duì)列被調(diào)度處理時(shí),它可以被分配的處理總時(shí)間是通過(guò)這個(gè)值來(lái)作為一個(gè)計(jì)算參數(shù)指定的。公式為:time_slice=slice_sync+(slice_sync/5*(4-prio))。這個(gè)參數(shù)對(duì)同步請(qǐng)求有效。slice_async:這個(gè)值跟上一個(gè)類似,區(qū)別是對(duì)異步請(qǐng)求有效。slice_async_rq:這個(gè)參數(shù)用來(lái)限制在一個(gè)slice的時(shí)間范圍內(nèi),一個(gè)隊(duì)列最多可以處理的異步請(qǐng)求個(gè)數(shù)。請(qǐng)求被處理的更大個(gè)數(shù)還跟相關(guān)進(jìn)程被設(shè)置的io優(yōu)先級(jí)有關(guān)。1.3cfq的IOPS模式我們已經(jīng)知道,默認(rèn)情況下cfq是以時(shí)間片方式支持的帶優(yōu)先級(jí)的調(diào)度來(lái)保證IO資源占用的公平。高優(yōu)先級(jí)的進(jìn)程將得到的時(shí)間片長(zhǎng)度,而低優(yōu)先級(jí)的進(jìn)程時(shí)間片相對(duì)較小。當(dāng)我們的存儲(chǔ)是一個(gè)高速并且支持NCQ(原生指令隊(duì)列)的設(shè)備的時(shí)候,我們更好可以讓其可以從多個(gè)cfq隊(duì)列中處理多路的請(qǐng)求,以便提升NCQ的利用率。此時(shí)使用時(shí)間片的分配方式分配資源就顯得不合時(shí)宜了,因?yàn)榛跁r(shí)間片的分配,同一時(shí)刻最多能處理的請(qǐng)求隊(duì)列只有一個(gè)。這時(shí),我們需要切換cfq的模式為IOPS模式。切換方式很簡(jiǎn)單,就是將slice_idle=0即可。內(nèi)核會(huì)自動(dòng)檢測(cè)你的存儲(chǔ)設(shè)備是否支持NCQ,如果支持的話cfq會(huì)自動(dòng)切換為IOPS模式。另外,在默認(rèn)的基于優(yōu)先級(jí)的時(shí)間片方式下,我們可以使用ionice命令來(lái)調(diào)整進(jìn)程的IO優(yōu)先級(jí)。進(jìn)程默認(rèn)分配的IO優(yōu)先級(jí)是根據(jù)進(jìn)程的nice值計(jì)算而來(lái)的,計(jì)算方法可以在manionice中看到,這里不再?gòu)U話。2、deadline:最終期限調(diào)度deadline調(diào)度算法相對(duì)cfq要簡(jiǎn)單很多。其設(shè)計(jì)目標(biāo)是:在保證請(qǐng)求按照設(shè)備扇區(qū)的順序進(jìn)行訪問(wèn)的同時(shí),兼顧其它請(qǐng)求不被餓死,要在一個(gè)最終期限前被調(diào)度到。我們知道磁頭對(duì)磁盤(pán)的尋道是可以進(jìn)行順序訪問(wèn)和隨機(jī)訪問(wèn)的,因?yàn)閷さ姥訒r(shí)時(shí)間的關(guān)系,順序訪問(wèn)時(shí)IO的吞吐量更大,隨機(jī)訪問(wèn)的吞吐量小。如果我們想為一個(gè)機(jī)械硬盤(pán)進(jìn)行吞吐量?jī)?yōu)化的話,那么就可以讓調(diào)度器按照盡量復(fù)合順序訪問(wèn)的IO請(qǐng)求進(jìn)行排序,之后請(qǐng)求以這樣的順序發(fā)送給硬盤(pán),就可以使IO的吞吐量更大。但是這樣做也有另一個(gè)問(wèn)題,就是如果此時(shí)出現(xiàn)了一個(gè)請(qǐng)求,它要訪問(wèn)的磁道離目前磁頭所在磁道很遠(yuǎn),應(yīng)用的請(qǐng)求又大量集中在目前磁道附近。導(dǎo)致大量請(qǐng)求一直會(huì)被合并和插隊(duì)處理,而那個(gè)要訪問(wèn)比較遠(yuǎn)磁道的請(qǐng)求將因?yàn)橐恢辈荒鼙徽{(diào)度而餓死。deadline就是這樣一種調(diào)度器,能在保證IO更大吞吐量的情況下,盡量使遠(yuǎn)端請(qǐng)求在一個(gè)期限內(nèi)被調(diào)度而不被餓死的調(diào)度器。
Linux下IPV4和IPV6的互操作性研究
作為向下一代互聯(lián)網(wǎng)絡(luò)協(xié)議過(guò)渡的重要步驟 國(guó)際的IPv 試驗(yàn)網(wǎng) bone在 年成立扒胡滑了 現(xiàn)在 bone已經(jīng)擴(kuò)展到全球 多個(gè)國(guó)家和地區(qū) 成為IPv 研究者 開(kāi)發(fā)者和實(shí)踐者的主要平臺(tái) CERNET國(guó)家網(wǎng)絡(luò)中心于 年 月加入 bone 同年 月成為其骨干網(wǎng)成員 電子科大作為教育網(wǎng)的西南主節(jié)點(diǎn) 在得到Nokia的IPv 路由器之后 積極參與IPv 技術(shù)研究 我們先查閱研究了大多數(shù)與IPv 有關(guān)的RFC文檔和相關(guān)技術(shù)資料 并且在此基礎(chǔ)上進(jìn)行了很多網(wǎng)絡(luò)實(shí)驗(yàn) 該文先簡(jiǎn)單闡述了IPV 的必要性和IPV 到IPV 升級(jí)轉(zhuǎn)換的機(jī)制 然后詳細(xì)闡明了在Linux操作系統(tǒng)下進(jìn)行的IPv 網(wǎng)絡(luò)實(shí)驗(yàn)及其結(jié)論 并附有相關(guān)參考文獻(xiàn)書(shū)目 一 使用IPv 的必要性現(xiàn)在運(yùn)行的因特網(wǎng)協(xié)議IPv 存在其固有的局限性 一是地址問(wèn)題 IPv 的地址只有 位 這意味著總的地址數(shù)大約是 億 并且還有許多地址是不可用的 按照目前網(wǎng)絡(luò)的發(fā)春臘展趨勢(shì) 到 和 年之間IPv 的地址就會(huì)耗盡 必須用另一種地址方案來(lái)替代它 二是IPv 提供的服務(wù)局限性 IPv 盡它的更大努力來(lái)傳送信息包 但是它不會(huì)保證提供給上層的服務(wù)是可靠的 沒(méi)有QoS(服務(wù)質(zhì)量)的概念 這些問(wèn)題都是IPv 的薄弱環(huán)節(jié) 致命弱點(diǎn) 另外因特網(wǎng)不斷提出對(duì)移動(dòng)性 安全性以及多媒體業(yè)務(wù)的支持等問(wèn)題 IPv 都無(wú)法解決 這樣就迫使我們必須引入下一帶因特網(wǎng)協(xié)議 IPv 二 IPv 和IPv 的互操作要將現(xiàn)在的IPV 網(wǎng)絡(luò)升級(jí)到IPV 網(wǎng)絡(luò) 不可能所有的機(jī)器在同時(shí)啟用IPV 協(xié)議棧 配置好IPV 地址 安裝好IPV 應(yīng)用程序 所以必須實(shí)現(xiàn)IPV 網(wǎng)絡(luò)與IPV 網(wǎng)絡(luò)之間的互操作及平滑升級(jí)機(jī)制 IPv 到IPv 的升級(jí)轉(zhuǎn)換機(jī)制的首要條件是允許IPv 和IPv 主機(jī)互操作 其次是在相互依賴性很小的情況下使IPv 的主機(jī)和路由器能在因特網(wǎng)中快速發(fā)展 第三是轉(zhuǎn)換對(duì)端用戶 系統(tǒng)管理員和網(wǎng)絡(luò)實(shí)施者來(lái)說(shuō)易于理解和執(zhí)行 IPv 轉(zhuǎn)換機(jī)制是一套主機(jī)和路由器執(zhí)行的協(xié)議機(jī)制 有一套定址和配置的操作指導(dǎo)方案 盡可能減少轉(zhuǎn)換過(guò)程中造成的破壞 IPv 轉(zhuǎn)換機(jī)制的主要目標(biāo)如下 · 可增加的升級(jí)和擴(kuò)展性:單個(gè)IPv 的主機(jī)和路由器可在不需要其它的主機(jī)和路由器同時(shí)升級(jí)的情況下單獨(dú)升級(jí)成IPv 新的IPv 主機(jī)和路由器可以后再一臺(tái)臺(tái)的安裝成IPv ·最小的升級(jí)依賴性 將主機(jī)升級(jí)成IPv 的唯一先決條件是域名服務(wù)器必須先升級(jí)以處理IPv 地址記錄 ·方便的尋址 當(dāng)IPv 的主機(jī)和路由器升級(jí)到IPv 后 他們必須繼續(xù)用原來(lái)的地址 他們不需要指定新的地址 管理者不需制定新的地址分配方案 ·很低的啟動(dòng)開(kāi)銷 將IPv 系統(tǒng)升級(jí)成IPv 很少或幾乎不需要準(zhǔn)備工作 IPv 轉(zhuǎn)換機(jī)制確保IPv 主機(jī)能和任何因特網(wǎng)上的IPv 通信 直到IPv 被淘汰 并在那時(shí)允許在小范圍內(nèi)互相通信 這個(gè)特征保護(hù)了用戶已經(jīng)在IPv 上的巨大投入并使得IPv 不會(huì)將IPv 孤立 基于以上原因 IPv 主機(jī)和路由器上與Ipv 主機(jī)和路由器現(xiàn)在廣泛采用了如下兩種互操作的機(jī)制 隧道技術(shù)和雙IP協(xié)議棧技做衡術(shù)A.隧道技術(shù)隧道提供了一種利用IPv 路由基礎(chǔ)上傳輸IPv 包的方法 隧道應(yīng)用于下面幾種應(yīng)用中 路由器到路由器 主機(jī)到路由器 主機(jī)到主機(jī)和路由器到主機(jī) 路由器到路由器和主機(jī)到路由器隧道技術(shù)都是將IPv 包傳到路由器 隧道的終點(diǎn)是中間路由器 必須將IPv 包解出 并且轉(zhuǎn)發(fā)到它的目的地 隧道終點(diǎn)的地址必須由配置隧道節(jié)點(diǎn)的配置信息獲得 這種類型的隧道稱作人工配置隧道 當(dāng)利用隧道到達(dá)IPv 的主干網(wǎng)時(shí) 如果一個(gè)在IPv 網(wǎng)絡(luò)和IPv 網(wǎng)絡(luò)邊界的IPv /IPv 路由器的IPv 地址已知時(shí) 那么隧道的端點(diǎn)可以配置為這個(gè)路由器 這個(gè)隧道的配置可以被寫(xiě)進(jìn)路由表中作為 缺省路由 這就是說(shuō)所有IPv 目的地址符合此路由的都可以使用這條隧道 這種隧道就是默認(rèn)配置的隧道 主機(jī)到主機(jī)和路由器到主機(jī)隧道技術(shù)都是將IPv 包傳到主機(jī)的 可以用IPv 包的信息獲得終點(diǎn)地址 隧道入口創(chuàng)建一個(gè)IPv 封裝頭并傳送包 隧道出口解包 去掉IPv 頭 更新IPv 頭 處理IPv 包 隧道入口節(jié)點(diǎn)需要保存隧道信息如MTU等 如果用于目的節(jié)點(diǎn)的IPv 地址是與IPv 兼容的地址 隧道的IPv 地址可以自動(dòng)從IPv 地址繼承下來(lái) 因此也就不需要人工配置 這種隧道也就稱為自動(dòng)隧道 IPv 兼容的IPv 地址格式如下B.雙IP協(xié)議棧方式雙協(xié)議棧方式包括提供IPv 和IPv 協(xié)議棧的主機(jī)和路由器 雙協(xié)議棧工作方式的簡(jiǎn)單描述如下 ·如果應(yīng)用程序使用的目的地址是IPv 地址 那么將使用IPv 協(xié)議棧 ·如果應(yīng)用程序使用的目的地址是兼容IPv 的IPv 地址 那么IPv 就封裝到IPv 中 ·如果目的地址是另一種類型的IPv 地址 那么就使用IPv 地址 可能封裝在默認(rèn)配置的隧道中 雙協(xié)議棧的缺省IP包發(fā)送算法為 a 如果IP包的目的地址是IPv 地址 如果目的站點(diǎn)在可達(dá)鏈路上 直接發(fā)送 如果目的站點(diǎn)不可達(dá) 要么送往在線路由器 要么不可達(dá) b 如果IP包的目的地址是IPv 兼容的IPv 地址 如果目的站點(diǎn)在可達(dá)鏈路上 直接發(fā)送IPv 包 如果目的站點(diǎn)處于off link ( )如果有可達(dá)IPv 路由器 則封裝在IPv 包中發(fā)往IPv 路由器 ( )如果有可達(dá)IPv 路由器 則不封裝 直接發(fā)送 ( )如果沒(méi)有可達(dá)路由器 則不可達(dá) c 如果IP包的目的地址是純IPv 地址 如果目的站點(diǎn)在 可達(dá)鏈路上 直接發(fā)送IPv 包 如果目的站點(diǎn)處于off link ( )如果有可達(dá)IPv 路由器 則直接發(fā)送到路由器 ( 如果目的地通過(guò)手動(dòng)隧道可達(dá) 并且鏈路上有可達(dá)IPv 路由器 則封裝成IPv 包 目的IP地址為隧道終點(diǎn)地址 鏈路地址為可達(dá)路由器的鏈路地址 ( )否則為不可達(dá) d 在線/離線的確定 IPv 使用子網(wǎng)掩碼確定 IPv 使用鄰居發(fā)現(xiàn)協(xié)議 兩者共同使用的是 如果目的地址是IPv 地址 則使用 RFC 比較兩者的掩碼 如果目的地址是IPv 兼容的IPv 地址 則使用低 位目的地址的子網(wǎng)掩碼比較 如果是 IPv 純地址 則使用鄰居發(fā)現(xiàn)協(xié)議 三 Linux下IPv 網(wǎng)絡(luò)研究實(shí)驗(yàn)我們?cè)谘芯苛舜罅縄Pv 協(xié)議(主要的IPv RFC文檔)之后 進(jìn)行了一系列的IPv 研究實(shí)驗(yàn) 現(xiàn)詳細(xì)敘述如下 .Pv 研究實(shí)驗(yàn)平臺(tái)的選擇在國(guó)內(nèi)有幾所大學(xué)已經(jīng)或正在進(jìn)行IPv 實(shí)驗(yàn)研究 并且建立了CERNET IPv 實(shí)驗(yàn)床 我們?cè)谂cCERNET IPv 實(shí)驗(yàn)床的老師和同學(xué)取得聯(lián)系并進(jìn)行了交流 實(shí)驗(yàn)床網(wǎng)絡(luò)中心最初的組網(wǎng)是通過(guò)主機(jī)配置FreeBSD來(lái)完成的 年開(kāi)始用的是FreeBSD 現(xiàn)在是FreeBSD 都有 此外有些科研人員也開(kāi)始采用linux進(jìn)行實(shí)驗(yàn) 路由器現(xiàn)在采用的是Nokia的IP 還有FreeBSD+Mrtd的主機(jī) 電子科大作為教育網(wǎng)西南地區(qū)的主節(jié)點(diǎn) 也得到了Nokia捐贈(zèng)的IPv 路由器 在此基礎(chǔ)之上 我們通過(guò)分析比較研究各種操作系統(tǒng) 最后選定用linux作為IPv 主機(jī)和路由器研究實(shí)驗(yàn)平臺(tái) 具體原因如下 A. Linux作為開(kāi)放的操作系統(tǒng) 其原代碼完全公開(kāi) 具有很強(qiáng)的靈活性 現(xiàn)在有很多自由軟件聯(lián)盟為L(zhǎng)inux免費(fèi)開(kāi)發(fā)如件 故Linux具有很強(qiáng)的生命力和活力 而其他大部分由個(gè)別公司開(kāi)發(fā)的操作系統(tǒng) 一方面原代碼不公開(kāi) 無(wú)法根據(jù)自己的要求修改內(nèi)核 其公司的發(fā)展的興衰 很大程度上影響該操作系統(tǒng)的發(fā)展 B. Linux操作系統(tǒng)很先進(jìn) 一直跟蹤關(guān)注網(wǎng)絡(luò)的發(fā)展 用Linux組建Internet網(wǎng)絡(luò) 建立網(wǎng)站 進(jìn)行網(wǎng)絡(luò)開(kāi)發(fā)研究 都是很好的選擇 并且其內(nèi)核從 開(kāi)始 就已經(jīng)開(kāi)始支持IPv 技術(shù)了 這等于就為我們提供了IPv 協(xié)議棧原代碼 我們可以利用其共享代碼做IPv 的研究開(kāi)發(fā) .Linux主機(jī)IPv 協(xié)議支持技術(shù)研究在選定了實(shí)驗(yàn)平臺(tái)之后 我們就著手進(jìn)行一系列的IPv 實(shí)驗(yàn) 主要針對(duì)在已大量安裝了IPv 的主機(jī)和路由器情況下 如何成功地兼容地升級(jí)到IPv 如何運(yùn)用在IPv 主機(jī)和路由器上 與Ipv 主機(jī)和路由器成功互操作 以及如何建立配置IPv 主機(jī)和路由器 在進(jìn)行IPv 實(shí)驗(yàn)之前 我們根據(jù)網(wǎng)上查詢資料及對(duì)Linux內(nèi)核分析 研究了如何建立IPv 主機(jī) 包括安裝協(xié)議棧 網(wǎng)絡(luò)工具及網(wǎng)絡(luò)程序 現(xiàn)以Redhat Linux為例 詳細(xì)說(shuō)明其具體步驟如下 A.支持IPv 協(xié)議的新內(nèi)核的編譯要讓操作系統(tǒng)支持IPv 就要安裝IPv 協(xié)議棧 Redhat 的內(nèi)核為 版本 可支持IPv 但是安裝缺省不支持 由于協(xié)議棧在操作系統(tǒng)中是處于核心地位的 必須重新編譯新的內(nèi)核才能安裝上新的協(xié)議棧 其具體步驟如下 )以root身份登陸 進(jìn)入源碼所在的目錄 cd /usr/src/linux )運(yùn)行 make clean 清除一些可能過(guò)期的中間代碼 ) 然后配置內(nèi)核選項(xiàng) make menuconfig 或者 make xmenuconfig運(yùn)行make menuconfig后 將下面的支持IPv 的選項(xiàng)選上 其他內(nèi)核選項(xiàng)請(qǐng)根據(jù)系統(tǒng)的具體情況作出符合系統(tǒng)的選擇 Code maturity level optionsPrompt for development and/or inplete code/drivers Yes Neorking optionsPacket socket yesUnix domain socketsyesTCP/IP neorkingyesThe IPv protocolyesIPv : enable EUI token format yesIPv : disable provider based address yes File systems/ procfilesy lishixinzhi/Article/program/Oracle/202311/17046
關(guān)于linux qos 實(shí)現(xiàn)機(jī)制的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
新聞標(biāo)題:深入了解LinuxQoS的實(shí)現(xiàn)機(jī)制(linuxqos實(shí)現(xiàn)機(jī)制)
本文地址:http://m.5511xx.com/article/coddsjg.html


咨詢
建站咨詢
