潘慕晗 劉云
摘要:隨著科學(xué)技術(shù)的發(fā)展,嵌入式系統(tǒng)對(duì)于大數(shù)據(jù)量高速率的存儲(chǔ)要求越來(lái)越高,因此,該文提出一種用于嵌入式系統(tǒng)的高速存儲(chǔ)系統(tǒng)模塊。它作為一個(gè)獨(dú)立模塊存在于整個(gè)系統(tǒng)中,為系統(tǒng)中的所有成員提供文件服務(wù),是通過(guò)SRIO以及網(wǎng)絡(luò)進(jìn)行通信以及數(shù)據(jù)交互。
關(guān)鍵詞:嵌入式;存儲(chǔ)系統(tǒng);高速存儲(chǔ)
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)35-0021-02
隨著嵌入式的發(fā)展,越來(lái)越多的嵌入式平臺(tái)對(duì)于存儲(chǔ)性能的要求也越來(lái)越高。大數(shù)據(jù)量的存儲(chǔ),高速率的讀寫(xiě)已經(jīng)成為越來(lái)越多嵌入式用戶的基本需求了。在嵌入式領(lǐng)域,串行Rapid IO(簡(jiǎn)稱SRIO)作為一種高可靠、高性能、基于包交換的新一代高速互聯(lián)技術(shù),已經(jīng)成為嵌入式系統(tǒng)互聯(lián)的最佳選擇之一。在嵌入式領(lǐng)域,很多產(chǎn)品都是在一個(gè)相對(duì)復(fù)雜的環(huán)境(震動(dòng)、噪音等)下工作,老式的機(jī)械硬盤(pán)無(wú)法在這種環(huán)境下工作,而由NAND組成的固態(tài)盤(pán)克服了這些缺點(diǎn),所以本文介紹的存儲(chǔ)系統(tǒng),就是通過(guò)SRIO進(jìn)行互聯(lián),本地采用NAND陣列進(jìn)行數(shù)據(jù)存儲(chǔ),以實(shí)現(xiàn)高速的讀寫(xiě)。而用戶在編程的過(guò)程中,只需要調(diào)用編程API即可,屏蔽了底層的協(xié)議以及數(shù)據(jù)傳輸。
1 存儲(chǔ)系統(tǒng)
存儲(chǔ)系統(tǒng)為用戶提供遠(yuǎn)程的文件訪問(wèn)服務(wù),其基本功能有文件的讀寫(xiě)、文件的創(chuàng)建以及刪除、文件系統(tǒng)的格式化、服務(wù)的連接與斷開(kāi)等。存儲(chǔ)系統(tǒng)和用戶之間采用請(qǐng)求-應(yīng)答的模式進(jìn)行通信,用戶向存儲(chǔ)系統(tǒng)發(fā)送請(qǐng)求,而存儲(chǔ)系統(tǒng)則執(zhí)行用戶的請(qǐng)求,對(duì)本地的文件進(jìn)行操作并將操作的結(jié)果以及數(shù)據(jù)返還給用戶。系統(tǒng)對(duì)外有2種通信鏈路,分別是千兆以太網(wǎng)以及SRIO。以太網(wǎng)在系統(tǒng)中用作協(xié)議的傳輸,SRIO則用作數(shù)據(jù)傳輸,通過(guò)這種方式將數(shù)據(jù)與協(xié)議進(jìn)行分離,同時(shí)確保SRIO只進(jìn)行單純的數(shù)據(jù)傳輸從而提高SRIO的傳輸速率。
存儲(chǔ)系統(tǒng)的對(duì)外通信功能由以太網(wǎng)和SRIO組成,其本地存儲(chǔ)功能是由NAND陣列和文件系統(tǒng)組成。NAND陣列是通過(guò)PCIe與系統(tǒng)互連的。NAND陣列作為存儲(chǔ)介質(zhì)的優(yōu)勢(shì)在于其容量大、性價(jià)比高、沒(méi)有機(jī)械特性(可以在震動(dòng)環(huán)境下工作)。文件系統(tǒng)用于管理NAND陣列,為系統(tǒng)提供文件管理服務(wù)。
2 系統(tǒng)實(shí)現(xiàn)
存儲(chǔ)系統(tǒng)可以分為2各部分來(lái)實(shí)現(xiàn),本地文件系統(tǒng)和服務(wù)程序。
本地文件系統(tǒng)在實(shí)現(xiàn)過(guò)程中,主要有2方面的考慮,NAND驅(qū)動(dòng)以及文件系統(tǒng)的類型選擇。一個(gè)大容量的存儲(chǔ)系統(tǒng),其容量應(yīng)該在10TB以上,對(duì)于這個(gè)容量并不是所有的文件系統(tǒng)都可以支持的。本文選擇使用Linux下的EXT4文件系統(tǒng),該文件系統(tǒng)可以支持的容量達(dá)到1EB,而文件大小也由16TB。采用該文件系統(tǒng),在后期可以對(duì)系統(tǒng)的容量進(jìn)行較大的擴(kuò)充,同時(shí)對(duì)于大型文件的支持也是相當(dāng)不錯(cuò)。
擁有了一個(gè)文件系統(tǒng)后,則是考慮如何接收用戶的請(qǐng)求并將用戶的請(qǐng)求轉(zhuǎn)換為本地操作,這就是服務(wù)程序。服務(wù)程序的功能是將用戶的請(qǐng)求轉(zhuǎn)換為本地操作并將操作結(jié)果以及數(shù)據(jù)傳輸給用戶。服務(wù)程序需要關(guān)注的2個(gè)方面,分別是通信和數(shù)據(jù)傳輸。用戶與存儲(chǔ)系統(tǒng)通信時(shí),是請(qǐng)求-應(yīng)答的模式。這種模式下,存儲(chǔ)系統(tǒng)完成本地的初始化后,就開(kāi)始被動(dòng)地等待用戶請(qǐng)求,一旦接收到用戶的請(qǐng)求就開(kāi)始工作。
圖1示了服務(wù)程序的基本流程,服務(wù)程序從接收到一個(gè)連接請(qǐng)求,到服務(wù)結(jié)束的基本流程。主線程在程序中的角色,是請(qǐng)求的接收者與分發(fā)者,從外部接收請(qǐng)求,將請(qǐng)求的內(nèi)容分發(fā)給子線程來(lái)處理,主線程不處理請(qǐng)求。而子線程則是請(qǐng)求的執(zhí)行者,完成用戶的請(qǐng)求,當(dāng)請(qǐng)求執(zhí)行完,子線程也就結(jié)束消亡了。
在服務(wù)程序運(yùn)行的過(guò)程中,需要保證各個(gè)子線程之間使用的資源是互斥的。以避免出現(xiàn)讀寫(xiě)不一致、SRIO發(fā)送失敗的情況。
下面對(duì)單用戶以及多用戶的情況進(jìn)行分析。
單用戶連接時(shí),系統(tǒng)資源都被該用戶所占有,并不會(huì)有其他用戶或程序來(lái)?yè)屨假Y源,所以單用戶情況下系統(tǒng)在邏輯上不會(huì)有問(wèn)題。
當(dāng)有多個(gè)用戶連接時(shí),服務(wù)程序中將有多個(gè)子線程。當(dāng)他們不操作同一個(gè)文件時(shí),這些子線程是獨(dú)立運(yùn)行的。如果有2個(gè)用戶同時(shí)打開(kāi)某個(gè)文件時(shí),其中有個(gè)用戶必然會(huì)打開(kāi)失敗。那么該用戶只能等待這個(gè)文件被關(guān)閉后再打開(kāi),這時(shí)子線程會(huì)通知用戶文件打開(kāi)失敗。這樣子線程對(duì)于文件的操作是互斥的。
再考慮2個(gè)子線程同時(shí)向用戶發(fā)送數(shù)據(jù)的情況,這時(shí)必然發(fā)生資源搶占的問(wèn)題。因此要為SRIO發(fā)送創(chuàng)建一個(gè)信號(hào)量,所有需要使用SRIO的子線程都必須先獲取該信號(hào)量,才能使用SRIO來(lái)發(fā)送數(shù)據(jù)。這樣做,在所有子線程都需要使用SRIO發(fā)送數(shù)據(jù)時(shí),會(huì)使得多數(shù)子線程進(jìn)入等待,但SRIO速率高,子線程的等待時(shí)間不會(huì)過(guò)長(zhǎng),應(yīng)該在可以接受的范圍內(nèi)。所以對(duì)于SRIO發(fā)送,采用一個(gè)信號(hào)量來(lái)互斥多個(gè)子線程的操作。
可以看出,在單用戶和多用戶的情況下,通過(guò)信號(hào)量以及一些特殊的限制使得系統(tǒng)資源對(duì)于用戶都是互斥的。當(dāng)一個(gè)用戶占有了該資源后,其他用戶無(wú)法獲取該資源,只能等待該資源被釋放后,才能獲得。
圖2雙方通信的包格式,其中用戶ID用于區(qū)別不同的用戶,是存儲(chǔ)系統(tǒng)分配給用戶的;包屬性是保留字段;命令字用于表示用戶請(qǐng)求的類型或者系統(tǒng)回應(yīng)的類型;參數(shù)是命令字的后續(xù)部分。本通信協(xié)議是建立在tcp/ip協(xié)議之上,因此協(xié)議在傳輸過(guò)程中的可靠性不需要系統(tǒng)考慮。
擁有了通信協(xié)議后,考慮存儲(chǔ)系統(tǒng)的數(shù)據(jù)傳輸。數(shù)據(jù)傳輸?shù)膮f(xié)議是SRIO,而在SRIO中傳輸模式中,速率最高的是DIO/DMA(Direct IO/Direct Memory Access),所以本文采用這種模式來(lái)進(jìn)行數(shù)據(jù)傳輸。在DIO/DMA模式下,SRIO傳輸數(shù)據(jù)是直接向?qū)Ψ降膬?nèi)存中寫(xiě)入數(shù)據(jù),這就需要在模塊初始化的時(shí)候?qū)?nèi)存進(jìn)行一定的規(guī)劃,以避免數(shù)據(jù)混亂。在內(nèi)存規(guī)劃時(shí),主要是考慮為不同的用戶分配不同的內(nèi)存空間,對(duì)不同用戶的數(shù)據(jù)進(jìn)行隔離以保證數(shù)據(jù)的正確性以及安全性。
在存儲(chǔ)系統(tǒng)工作中,數(shù)據(jù)傳輸應(yīng)該是占據(jù)了大部分的時(shí)間,所以在系統(tǒng)實(shí)現(xiàn)時(shí),應(yīng)該盡可能的取出一些不必要的操作,以保證數(shù)據(jù)傳輸?shù)恼加斜?。存?chǔ)系統(tǒng)在處理讀文件操作時(shí),讀出的數(shù)據(jù)應(yīng)該是考慮對(duì)齊的問(wèn)題,以避免SRIO發(fā)送時(shí)的2次拷貝。
3 系統(tǒng)瓶頸
存儲(chǔ)系統(tǒng)的瓶頸主要表現(xiàn)在存儲(chǔ)總?cè)萘恳约白x寫(xiě)速率上。存儲(chǔ)總?cè)萘靠梢酝ㄟ^(guò)增加NAND芯片的容量以及數(shù)量來(lái)改善。
存儲(chǔ)系統(tǒng)的讀寫(xiě)速率瓶頸,主要有三方面,硬件傳輸速率的限制、軟件數(shù)據(jù)轉(zhuǎn)發(fā)的速率、網(wǎng)絡(luò)通信延遲造成的速率降低。
1) 硬件傳輸速率的限制是由PCIe的速率以及SRIO的速率決定的,兩者中速率較慢的成為瓶頸;
2) 軟件轉(zhuǎn)發(fā)的速率是指文件讀寫(xiě)過(guò)程中需要將數(shù)據(jù)寫(xiě)入到內(nèi)存中才能傳輸,例如存儲(chǔ)系統(tǒng)從文件系統(tǒng)中讀出一段數(shù)據(jù),它不會(huì)直接通過(guò)SRIO發(fā)送,而是先存放在內(nèi)存中,再通過(guò)SRIO發(fā)送,這樣就使得文件在讀寫(xiě)過(guò)程需要更多的時(shí)間;
3) 網(wǎng)絡(luò)通信的延時(shí)一般都在幾十微秒以上,如果在文件讀寫(xiě)過(guò)程中,存在較多的協(xié)議通信,必然會(huì)造成整體的速率降低。
對(duì)于存儲(chǔ)系統(tǒng)的讀寫(xiě)速率瓶頸,除了硬件造成的瓶頸是軟件無(wú)法改善的,其余2個(gè)都可以通過(guò)一定的手段進(jìn)行改善。
1) 軟件轉(zhuǎn)發(fā)速率,可以通過(guò)一個(gè)二級(jí)流水線加快轉(zhuǎn)發(fā)的速度。當(dāng)內(nèi)存中寫(xiě)入的數(shù)據(jù)達(dá)到了一次的傳輸量后,就開(kāi)始傳輸同時(shí)繼續(xù)寫(xiě)入,形成一個(gè)二級(jí)的流水線。這種模式需要2個(gè)并行的線程來(lái)支持,并且只對(duì)數(shù)據(jù)量較大的情況適用。而該存儲(chǔ)系統(tǒng)就是為大數(shù)據(jù)量的存儲(chǔ)而設(shè)計(jì)的,所以采用該方式對(duì)于提高性能有一定的幫助。
2) 減少在整個(gè)服務(wù)過(guò)程中的通信次數(shù),例如文件的讀寫(xiě),盡量在一次操作中完成,而不是將一批數(shù)據(jù)分多次讀寫(xiě)。
4 總結(jié)
本文介紹了一種用于大數(shù)據(jù)量的存儲(chǔ)系統(tǒng),分析了其基本的工作機(jī)理,以及瓶頸所在,并提出了相應(yīng)的解決方案。在下一步工作中,將會(huì)使用SRIO來(lái)傳輸通信協(xié)議,以解決網(wǎng)絡(luò)延遲的問(wèn)題。
參考文獻(xiàn):
[1] 陳智育.嵌入式系統(tǒng)中的Flash文件系統(tǒng)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2002(7).
[2] 董明,劉加,劉潤(rùn)生.適宜于嵌入式多媒體應(yīng)用的Flash文件系統(tǒng)[J].電子技術(shù)應(yīng)用,2002(6).
[3] 沈莉.PVFS文件系統(tǒng)及在集群系統(tǒng)中的應(yīng)用[J].高性能計(jì)算技術(shù),2005(7).