在這種情況下,CPU的負(fù)載主要來自以下幾個(gè)方面:協(xié)議的定時(shí)驅(qū)動(dòng)、用戶的配置驅(qū)動(dòng)、外部事件的驅(qū)動(dòng)。其中,外部事件的驅(qū)動(dòng)最為隨機(jī),無法預(yù)料。典型的外部事件包括端口的連接/斷開(Up/Down),媒體訪問控制(MAC)地址消息的上報(bào)(包括學(xué)習(xí)、老化、遷移等),CPU通過直接存儲(chǔ)器存取(DMA)收到包,CPU通過DMA發(fā)包等。
在以上所列的外部事件中,又以CPU通過DMA收到包之后的處理最為復(fù)雜。因?yàn)閿?shù)據(jù)包由低層上送到上層軟件時(shí),各協(xié)議的處理動(dòng)作千差萬別,可能會(huì)涉及到發(fā)包、端口操作、批量的表操作等。所以,只有處理好CPU的收發(fā)包的相關(guān)問題,才能使相關(guān)的上層協(xié)議正常交互,從而使第三層交換機(jī)穩(wěn)定、高效地運(yùn)行。
可能涉及到的問題
以下就CPU收發(fā)包可能涉及的各個(gè)方面分別說明,下面的分析都基于典型的CPU收發(fā)包機(jī)制:CPU端口分隊(duì)列,通過DMA接收,采用環(huán)形隊(duì)列等。
CPU的負(fù)載與收包節(jié)奏控制
根據(jù)第三層交換機(jī)處理數(shù)據(jù)包的能力,決定單位時(shí)間上送到CPU的包的個(gè)數(shù);決定了單位時(shí)間上送多少個(gè)包給CPU后,再考慮上送數(shù)據(jù)包的節(jié)奏,假設(shè)通過評(píng)估,確定了單位時(shí)間上送CPU數(shù)據(jù)包的上限,例如每秒x個(gè)數(shù)據(jù)包。
(1)勻速上報(bào)CPU
數(shù)據(jù)包勻速上報(bào)CPU時(shí),對(duì)CPU隊(duì)列的沖擊較小,而且對(duì)CPU隊(duì)列的緩沖能力要求不高,CPU隊(duì)列不必做得很大。
(2)突發(fā)(Burst)方式上報(bào)CPU
交換芯片(采用ASIC)一側(cè)的硬件接收隊(duì)列和DMA內(nèi)存空間中的環(huán)形隊(duì)列,一起賦予了第三層交換機(jī)一定的緩沖能力(針對(duì)上送CPU的數(shù)據(jù)包)。利用這個(gè)緩沖能力,我們可以把控制周期適當(dāng)放長(zhǎng),并設(shè)定控制的粒度(單位控制周期內(nèi)CPU收?qǐng)?bào)個(gè)數(shù)的上限),采用類似于電路中負(fù)反饋的機(jī)制動(dòng)態(tài)地使能和關(guān)閉CPU收包功能。這樣就在宏觀上實(shí)現(xiàn)了對(duì)數(shù)據(jù)包上送CPU速率的控制。另外,如果交換芯片(采用ASIC)支持基于令牌桶算法的CPU端口出方向流量監(jiān)管或整形功能[2-3],且監(jiān)管或整形的最小閾值可以滿足CPU限速的需要,則可以利用這個(gè)功能控制數(shù)據(jù)包上送CPU的節(jié)奏,減小CPU的負(fù)載。這樣軟件的處理就簡(jiǎn)化了很多。
CPU端口隊(duì)列的長(zhǎng)度規(guī)劃
如果僅考慮第三層交換機(jī)CPU端口的緩沖能力,CPU端口隊(duì)列當(dāng)然是越長(zhǎng)越好,但是必須兼顧對(duì)其他功能以及性能的影響。針對(duì)不同的ASIC芯片,需要具體問題具體分析。
零拷貝
零拷貝是指在整個(gè)數(shù)據(jù)包的處理過程中,使用指針做參數(shù),不進(jìn)行整個(gè)數(shù)據(jù)包的拷貝。這樣可以大大提高CPU的處理效率。使用零拷貝后,會(huì)一定程度上降低軟件處理的靈活性,我們會(huì)面臨到這樣的問題:如果協(xié)議棧需要更改一個(gè)數(shù)據(jù)包的內(nèi)容,會(huì)直接在接收緩存(buffer)上修改,但是如果需要在數(shù)據(jù)包中刪除或添加字段(例如添加或刪除一層標(biāo)簽(tag)),即數(shù)據(jù)包的長(zhǎng)度需要變化時(shí),應(yīng)該如何處理。
添加或刪除字段,必然會(huì)導(dǎo)致數(shù)據(jù)包頭一側(cè)或包尾一側(cè)的位置發(fā)生移動(dòng),如果包尾一側(cè)移動(dòng),問題比較簡(jiǎn)單,只要數(shù)據(jù)包總長(zhǎng)度不超過buffer邊界即可。由于通常此類操作都靠近包頭的位置,如果包頭一側(cè)移動(dòng),效率會(huì)比較高,所以協(xié)議棧在處理時(shí)可能更傾向于在包頭一側(cè)移動(dòng),這時(shí)就需要驅(qū)動(dòng)在分配 buffer時(shí)做一些處理:
(1)接收數(shù)據(jù)包時(shí),頭指針不能指向buffer邊界,需要向后偏移一定裕量,同時(shí)單個(gè)buffer的大小也必須兼顧到最大傳送單元(MTU)和該裕量。
(2)釋放數(shù)據(jù)包時(shí)buffer首指針需要作歸一化處理
目前第三層交換機(jī)涉及到的外部中斷主要由交換芯片產(chǎn)生,交換芯片主要的外部中斷包括DMA操作(如收到包、發(fā)包結(jié)束、新地址消息等等)和一些出錯(cuò)消息。如果中斷請(qǐng)求過于頻繁,中斷服務(wù)程序(ISR)和其他進(jìn)程之間頻繁地上下文切換會(huì)消耗大量CPU時(shí)間。如果有持續(xù)大量的中斷請(qǐng)求,CPU會(huì)始終處于繁忙狀態(tài),各種協(xié)議得不到足夠的調(diào)度時(shí)間,從而導(dǎo)致協(xié)議狀態(tài)機(jī)超時(shí)等嚴(yán)重故障。為了避免事件觸發(fā)頻率不可控的問題,可以使用輪詢機(jī)制,通常的做法是用 CPU定時(shí)器觸發(fā)原先由外部中斷觸發(fā)的ISR,由于定時(shí)器觸發(fā)的間隔是固定的,所以ISR執(zhí)行的頻率得到了控制,避免了上述的問題。
輪詢和外部中斷相比,只是節(jié)奏可控(外部中斷的節(jié)奏取決于外部事件發(fā)生的頻率,CPU不可控)。但是,輪詢也有其不可避免的缺點(diǎn)——響應(yīng)慢。不能滿足某些實(shí)時(shí)性要求較高的功能。另外,人們會(huì)發(fā)現(xiàn)用ping命令檢測(cè)第三層交換機(jī)3層接口大包時(shí),使用輪詢方式的第三層交換機(jī)比使用中斷方式的第三層交換機(jī)的時(shí)延明顯要大。如果能通過某種機(jī)制,避免持續(xù)、大量的中斷請(qǐng)求,則既可以保證CPU不會(huì)過于繁忙,又保留了中斷實(shí)時(shí)處理的優(yōu)點(diǎn)。
典型的會(huì)產(chǎn)生大量中斷事件的行為是CPU接收數(shù)據(jù)包和MAC地址消息上報(bào)。以收包為例,在前面“CPU負(fù)載與收包節(jié)奏控制”部分提到的 Burst方式就是根據(jù)實(shí)時(shí)的流量,控制接收DMA的開關(guān),這樣就達(dá)到了使中斷源受控的目的,這種類似負(fù)反饋的機(jī)制可以很好的避免持續(xù)的中斷事件上報(bào) CPU。
總之,輪詢控制簡(jiǎn)單,但實(shí)時(shí)性較差;中斷實(shí)時(shí)性好,但是使所有的中斷源受控有一定難度。在系統(tǒng)初始設(shè)計(jì)階段,我們需要綜合考慮需求以及芯片對(duì)外部事件的處理方式,來決定采用中斷或者輪詢方式,或者兩者兼用。
隨著以太網(wǎng)相關(guān)技術(shù)的發(fā)展,交換芯片和網(wǎng)絡(luò)處理器的處理能力不斷被提升;相比之下,數(shù)據(jù)交換設(shè)備中CPU處理性能的提升程度遠(yuǎn)遠(yuǎn)不及交換芯片和網(wǎng)絡(luò)處理器;同時(shí)數(shù)據(jù)交換設(shè)備支持的業(yè)務(wù)種類也在不斷增加,對(duì)CPU承載的業(yè)務(wù)量也有了更高的要求。在這種情況下,交換設(shè)備容量以及支持業(yè)務(wù)種類的大幅提升和有限的CPU資源之間的矛盾會(huì)日益凸顯。因此,做好CPU和交換芯片以及網(wǎng)絡(luò)處理器接口的緩沖管理、隊(duì)列調(diào)度以及流量監(jiān)管,合理利用CPU資源,是保證數(shù)據(jù)交換設(shè)備安全、穩(wěn)定運(yùn)行的前提,也是目前及將來數(shù)據(jù)交換設(shè)備開發(fā)的重要課題。
相關(guān)推薦:2010年計(jì)算機(jī)軟件水平考試時(shí)間安排通知北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |