,,,
(許繼電氣技術中心,許昌 461000)
嵌入式設備對其本身的可靠性要求極高,由于一些不可預測的因素或者是沒有發(fā)現(xiàn)的潛在危險導致Flash的垃圾資源回收不及時,會出現(xiàn)文件操作耗時較長等異常情況,會導致嵌入式設備產生不可預知的危險,在這種情況下很難保證設備的可靠性、安全性,甚至會對整個嵌入式系統(tǒng)造成嚴重的后果。
鑒于此,本文提出了一種Flash資源回收的策略:設備能夠在運行過程中根據(jù)CPU負載情況和Flash的有效資源空間剩余情況,自動調整后臺回收的頻率,能夠有效利用CPU的空閑時刻進行垃圾回收,盡量避免異常情況的發(fā)生,但是如果一旦有異常情況發(fā)生,設備會將異常情況記錄并報警,幫助現(xiàn)場工作人員盡快定位并解決問題,避免問題擴大而造成不可挽回的損失[1-3]。
本文提出一種嵌入式設備的Flash資源回收的策略,能夠通過實時檢測到的CPU負載率和Flash空間利用率(Flash已被占用空間與Flash總空間的百分比)來確定后臺資源回收的周期(即設備每次清理內存的時間間隔),定時清理內存。在具體介紹該方法之前,首先對本回收策略的時間粒度滑動窗口和時間粒度進行說明。
如圖1所示,嵌入式設備后臺資源回收的清理周期按照大小順序依次排列,形成時間粒度(資源回收周期)進度條,圖1中數(shù)字的單位都是ms,進度條上面每個具體的時間粒度的大小是由設備特性如CPU主頻、CPU負載、Flash空間大小、Flash空間利用率、系統(tǒng)的資源回收能力來決定的。
圖1 時間粒度滑動窗口及時間粒度進度條示意圖
基于大量具體工程應用而得出的經驗公式表示為:
T=coefficient×
其中T表示清理周期,coefficient為與具體工程應用有關的經驗系數(shù),free_block表示有效的Flash資源剩余量,complexity表示業(yè)務的系統(tǒng)復雜度,erase_speed表示塊擦除速度,gc_ability表示嵌入式系統(tǒng)本身的垃圾回收能力,fcpu表示使用CPU的主頻,need_space表示業(yè)務對Flash空間大小的要求。
如圖1所示,時間粒度滑動窗口表示在當前CPU負載率情況下,能夠選擇的資源回收周期的范圍,然后根據(jù)Flash空間利用率等因素,在時間粒度窗口的范圍內確定具體的時間粒度值。資源回收時間粒度滑動窗口是根據(jù)CPU的負載情況,實時地在時間粒度進度條(如圖1所示)上滑動[4]。
在CPU負載比較低的狀態(tài)下,資源回收時間粒度滑動窗口向時間粒度進度條的左側(時間粒度值小的一端)滑行。在CPU負載比較高的狀態(tài)下,資源回收時間粒度滑動窗口向時間粒度進度條的右側(時間粒度值小的一端)滑行。
Flash空間利用率的大小決定了時間粒度在資源回收時間粒度滑動窗口上取值的位置。
在Flash空間利用率比較低的情況下,也就是Flash可用空間剩余比較充分的情況下,垃圾資源回收的需求不迫切,時間粒度就在資源回收時間粒度滑動窗口偏右的位置取值,即時間粒度取得相對較大的值,垃圾資源回收頻率就變小。
在Flash空間利用率比較高的情況下,也就是Flash可用空間剩余比較少的情況下,垃圾資源回收的需求就變得很迫切,時間粒度就在資源回收時間粒度滑動窗口偏左的位置取值,即時間粒度取得相對較小的值,垃圾資源回收頻率就變大[5]。
設備運行期間,根據(jù)CPU負載率和Flash有效資源空間剩余程度自動判斷垃圾資源回收的頻率,在不影響設備性能的情況下保證設備運行的安全性和可靠性。
本方案的實現(xiàn)需要兩個任務配合實現(xiàn):CPU負載監(jiān)視任務、資源回收檢測任務,如圖2所示。
圖2 方案實現(xiàn)基本示意圖
CPU負載檢測任務負責實時檢測CPU使用情況(占有率)、完成對資源回收時間粒度滑動窗口滑動趨勢的判定和控制。資源回收檢測任務主要負責Flash資源回收的具體事務,并且根據(jù)時間粒度判定模塊確定的具體時間粒度確認回收資源的快慢[6]。
資源回收時間粒度是由CPU負載率和Flash空間利用率共同決定的,CPU負載率負責判定資源回收時間粒度窗口的滑動趨勢,F(xiàn)lash空間利用率負責確定在滑動窗口上定位具體的時間粒度值[4]。
CPU負載檢測任務負責實時檢測CPU的負載情況,并決定時間粒度滑動窗口的滑動方向和初度。當CPU負載小的時候,時間粒度向時間力度條的左端滑動,減小后臺資源回收檢測任務的時間、增大回收粒度,這樣做是為了提高垃圾回收速度。當CPU負載大的時候,時間粒度向時間力度條的右端滑動,增大后臺資源回收檢測任務的間隔時間、減小回收粒度,這樣做是為了降低垃圾回收速度,減輕CPU負載。
首先,資源回收是每個嵌入式文件系統(tǒng)自身應該具備的功能。資源回收檢測任務實現(xiàn)了一個優(yōu)化使用資源回收的策略。任務初始化時需要定義垃圾回收時間粒度的默認值,比如回收間隔時間(時間粒度)默認值定義為400 ms,那么每隔400 ms就會進行一次后臺的垃圾回收。其次,任務的每次循環(huán)都需要檢測有效資源剩余,根據(jù)Flash有效資源的剩余情況來確定資源回收時間粒度。在CPU負載檢測任務控制的時間粒度滑動窗口上面確定具體的時間粒度,根據(jù)時間粒度調整下次后臺垃圾回收的時間。
首先,設備需要實現(xiàn)時間粒度條和時間粒度滑動窗口的初始化:時間進度條上的時間粒度保證從小到大的趨勢,具體的時間粒度值和相鄰值之間的跨度由用戶根據(jù)設備特性(CPU速率和基本負載、存儲空間大小等)來決定。時間粒度滑動窗口根據(jù)CPU負載的變化在時間粒度條上滑動,該窗口的大小可以由用戶自定義,如圖1所示的示意圖,窗口的大小定義為7,即窗口每次包含7個時間粒度值。
圖3 CPU負載檢測任務執(zhí)行流程圖
如圖3所示,在嵌入式設備上電之后,系統(tǒng)初始化階段,啟動一個最低優(yōu)先級的任務:CPU負載檢測任務,該任務在初始化期間記錄一段變量遞增算法的時間間隔T1,由于初始化期間其他任務都沒有開始運行,所以可以獲取一個比較精確的標準參照時間間隔[7]。
CPU負載檢測任務運行期間,記錄同樣一段變量遞增算法(與CPU負載檢測任務初始化時的算法一樣)的時間間隔T2,由于CPU負載檢測任務的優(yōu)先級最低,所以嵌入式設備運行期間,只要有其他任務運行,該任務就會被打斷去執(zhí)行其他任務,直到其他任務都執(zhí)行完畢并處于掛起狀態(tài),該任務才會被繼續(xù)執(zhí)行。所以CPU任務越多,執(zhí)行越頻繁,實際統(tǒng)計的時間間隔就越長。將標準參照時間間隔T1和運行時間間隔T2比較就能夠得到CPU的占有率,就能計算CPU的負載大?。?/p>
當CPU負載減小的時候,說明空閑時間較多,有能力處理更多的任務,這時時間粒度滑動窗口向左端滑動,減小后臺資源回收檢測任務的時間粒度(間隔)、增大回收粒度,這樣做可以提高垃圾回收速度,同時也提高了CPU的利用率[8]。
當CPU負載增大的時候,說明空閑時間減少,這時時間粒度滑動窗口向右端滑動,增大后臺資源回收檢測任務的間隔時間、減小回收粒度,這樣做可以降低垃圾回收速度,減輕CPU負荷。
資源回收檢測任務最重要的功能就是根據(jù)策略判定資源回收的時間粒度,然后調用系統(tǒng)本身的資源回收功能進行Flash垃圾資源的回收。該任務初始化時需要定義垃圾回收時間粒度的默認值,比如回收間隔時間默認值定義為400 ms,那么每隔400 ms就會進行一次后臺的垃圾回收。
任務的每個循環(huán)都需要檢測有效資源的剩余情況、業(yè)務對資源的需求情況,由此在時間粒度滑動窗口上面確定具體的時間粒度,任務根據(jù)時間粒度調整下次后臺垃圾回收的時間間隔。
按照圖4的示例,舉個簡單的例子(實際應用中各門檻值都可以根據(jù)自身具體的業(yè)務更加細化)。
圖4 時間粒度滑動窗在不同CPU負載下的位置示意圖
當CPU占有率小于30%時候,此時負載比較低,時間粒度滑動窗口向數(shù)值小的一端滑行,可以看到窗口的范圍是200~700 ms,共包括7個時間粒度值,具體選擇哪個粒度值就需要由剩余的有效Flash資源、業(yè)務需求決定。當有效資源剩余量充足的時候,說明資源足夠,垃圾回收的需求不迫切,可以選擇700 ms的粒度。當有效資源剩余量比較少的時候,垃圾回收的需求就比較迫切,可以選擇200 ms的粒度,加快垃圾回收。
當CPU占有率在60%左右時CPU負載適中,時間粒度滑動窗口向右端滑行,可以看到窗口的范圍是500~1 200 ms,共包括7個時間粒度值,具體選擇哪個粒度值由剩余的有效資源決定。當有效資源剩余量比較多的時候,說明資源足夠,垃圾回收的需求不迫切,可以選擇1 200 ms的粒度。當有效資源剩余量比較少的時候,垃圾回收的需求就比較迫切,可以選擇500 ms的粒度,加快垃圾回收。
當CPU占有率大于90%時CPU負載很大,時間粒度滑動窗口向數(shù)值大的一端滑行,可以看到窗口的范圍是1 000~2 200 ms,共包括7個時間粒度值,具體選擇哪個粒度值由剩余的有效資源決定。當有效資源剩余量比較多的時候,說明資源足夠,垃圾回收的需求不迫切,可以選擇2 200 ms的粒度。當有效資源剩余量比較少的時候,垃圾回收的需求就比較迫切,可以選擇1000 ms的粒度,加快垃圾回收。
一旦檢測到Flash剩余有效資源減少到需求門檻以下、CPU負載比較重、資源回收不及時的情況,任務觸發(fā)嵌入式裝置報警。
為了方便測試和說明問題,將資源回收時間粒度、Flash剩余空間、CPU負載組成三維坐標,模擬出示意圖說明CPU負載、Flash剩余空間和回收時間粒度的變化趨勢之間的關系。條件如下:
① 將時間粒度進度條長度限定為3 000 ms,即時間粒度只能在0~3 000 ms范圍內選擇。
② 將時間粒度滑動窗口長度限定為500 ms,滑動窗口的滑動粒度是25 ms,即CPU負載每變化1%,滑動窗口就會滑動25 ms的范圍。
③ 時間粒度最小選擇單位為5 ms,即Flash剩余空間每變化1%,時間粒度選擇就會有5 ms的改變。
基于上述條件,可以得出公式:
根據(jù)該公式可以得到三維仿真圖如圖5所示。
圖5 三維仿真圖
在時間粒度的三維分布入中,存在安全區(qū)域和報警區(qū)域:在安全區(qū)域以內說明Flash剩余有效空間充足,或者是CPU對垃圾資源的回收速度大于Flash剩余空間的使用速度;當Flash剩余空間不充足并且CPU回收粒度跟不上Flash空間使用速度的時候,就會觸發(fā)報警,警告設備可能會存在異常情況。