王福友,楊斌
(西南交通大學(xué) 信息科學(xué)與技術(shù)學(xué)院,成都 610031)
設(shè)置進(jìn)程檢查點(diǎn)的嵌入式容錯(cuò)系統(tǒng)設(shè)計(jì)
王福友,楊斌
(西南交通大學(xué) 信息科學(xué)與技術(shù)學(xué)院,成都 610031)
針對嵌入式Linux系統(tǒng)的特點(diǎn),通過設(shè)置檢查點(diǎn)(checkpoint)實(shí)現(xiàn)ARM平臺(tái)進(jìn)程級容錯(cuò)。在檢查點(diǎn)工作時(shí),通過/proc文件系統(tǒng)與內(nèi)核進(jìn)行交互,實(shí)時(shí)地獲取與進(jìn)程有關(guān)的PID、CPU狀態(tài)以及內(nèi)存信息,并保存在存儲(chǔ)介質(zhì)中。當(dāng)進(jìn)程出現(xiàn)故障后,將上述與進(jìn)程有關(guān)的狀態(tài)信息進(jìn)行恢復(fù),從而實(shí)現(xiàn)進(jìn)程級容錯(cuò)。實(shí)驗(yàn)表明,該進(jìn)程級容錯(cuò)系統(tǒng)有較好的容錯(cuò)能力,極大地縮短了進(jìn)程恢復(fù)的時(shí)間。
ARM;嵌入式Linux;檢查點(diǎn);容錯(cuò)
隨著ARM處理器性能不斷提升,同時(shí)又兼具低功耗、體積小的特點(diǎn),在工控和高性能計(jì)算領(lǐng)域中以ARM處理器為核心的嵌入式平臺(tái)應(yīng)用得越來越廣泛。鑒于工控和高性能計(jì)算領(lǐng)域的系統(tǒng)可靠性要求極高,因此如何設(shè)計(jì)高可靠性系統(tǒng)成為一個(gè)至關(guān)重要的課題。
提高系統(tǒng)可靠性的一個(gè)有效的方法是容錯(cuò)。檢查點(diǎn)機(jī)制是一種典型的軟件容錯(cuò)技術(shù),通過設(shè)置檢查點(diǎn)來實(shí)現(xiàn)進(jìn)程級容錯(cuò)。檢查點(diǎn)機(jī)制主要分為兩種:用戶態(tài)和內(nèi)核態(tài)。用戶態(tài)檢查點(diǎn)具有較好的可移植性,但是用戶需要修改程序源碼,缺乏透明性和通用性,代表性用戶態(tài)檢查點(diǎn)有Conder和Libckpt。內(nèi)核態(tài)檢查點(diǎn)獨(dú)立于用戶程序,對用戶完全透明,方便用戶使用,代表性內(nèi)核態(tài)檢查點(diǎn)為BLCR。本文正是基于內(nèi)核態(tài)檢查點(diǎn)BLCR設(shè)計(jì)思想,在ARM平臺(tái)嵌入式Linux系統(tǒng)上實(shí)現(xiàn)進(jìn)程級容錯(cuò)系統(tǒng)。
檢查點(diǎn)通過人為或周期性地向系統(tǒng)發(fā)送進(jìn)程保存信號來備份進(jìn)程狀態(tài),生成含有進(jìn)程信息的文件。當(dāng)檢測到進(jìn)程因某種原因崩潰時(shí),通過讀取進(jìn)程信息文件,將進(jìn)程回轉(zhuǎn)到備份時(shí)的狀態(tài),從而實(shí)現(xiàn)進(jìn)程恢復(fù),完成系統(tǒng)容錯(cuò)。

圖1 系統(tǒng)結(jié)構(gòu)設(shè)計(jì)圖
根據(jù)本系統(tǒng)實(shí)際功能設(shè)計(jì)三個(gè)模塊,分別是用戶態(tài)的用戶接口模塊、進(jìn)程信息存儲(chǔ)模塊,以及內(nèi)核態(tài)的進(jìn)程信息保存與恢復(fù)模塊。系統(tǒng)結(jié)構(gòu)設(shè)計(jì)圖如圖1所示。
(1) 用戶接口模塊
用戶接口模塊為用戶進(jìn)程的狀態(tài)保存與恢復(fù)鏈接動(dòng)態(tài)鏈接庫提供了標(biāo)準(zhǔn)化使用接口,通過這個(gè)接口訪問內(nèi)核態(tài)的進(jìn)程信息保存與恢復(fù)模塊。
(2) 進(jìn)程信息存儲(chǔ)模塊
在進(jìn)程保存過程中,通過vfs_write()函數(shù)將進(jìn)程信息保存成固定格式的文件。在進(jìn)程恢復(fù)過程中,使進(jìn)程信息保存與恢復(fù)模塊可以通過vfs_read()函數(shù)訪問,從而完成進(jìn)程的恢復(fù)工作。
(3) 進(jìn)程信息保存與恢復(fù)模塊
進(jìn)程信息保存與恢復(fù)模塊是本系統(tǒng)的核心模塊,由于用戶態(tài)和內(nèi)核態(tài)的內(nèi)存地址空間不同,不能使用簡單的函數(shù)調(diào)用方式,在本系統(tǒng)中用戶態(tài)與內(nèi)核態(tài)模塊通過/proc文件系統(tǒng)進(jìn)行數(shù)據(jù)交互。在進(jìn)程保存過程中,該模塊獲取與進(jìn)程有關(guān)的信息,并調(diào)用進(jìn)程信息存儲(chǔ)模塊保存進(jìn)程信息;而在進(jìn)程恢復(fù)過程中,通過訪問之前保存的含有進(jìn)程信息的文件恢復(fù)進(jìn)程。
在系統(tǒng)實(shí)現(xiàn)方式上采用單機(jī)和雙機(jī)兩種實(shí)現(xiàn)模式。單機(jī)模式下,進(jìn)程的保存與恢復(fù)都是在同一臺(tái)機(jī)器上進(jìn)行的;雙機(jī)模式下,在一臺(tái)機(jī)器上進(jìn)行進(jìn)程信息的保存,在另外一臺(tái)機(jī)器上保存生成的進(jìn)程信息文件并恢復(fù)進(jìn)程。
本系統(tǒng)在進(jìn)程保存時(shí)將進(jìn)程的信息、CPU寄存器的狀態(tài)、signal信息、進(jìn)程的內(nèi)存地址空間等信息保存到文件里。在進(jìn)程恢復(fù)時(shí),調(diào)用fork( )函數(shù)創(chuàng)建一個(gè)新進(jìn)程,讀取文件中上述進(jìn)程狀態(tài),從而完成進(jìn)程恢復(fù)。所保存的文件格式見圖 2。

圖2 進(jìn)程文件格式
2.1 內(nèi)核讀寫文件方法
由于在內(nèi)核操作文件沒有標(biāo)準(zhǔn)庫,因此要利用內(nèi)核的一些函數(shù),在本系統(tǒng)中主要使用兩個(gè)函數(shù)vfs_write( )和vfs_read( )構(gòu)成的文件操作函數(shù)k_write( )和k_read( )。函數(shù)原型如下:ssize_t k_write(struct file *file, const void *buf, size_t count);
參數(shù)file代表要保存進(jìn)程信息的文件,參數(shù)buf代表指向要保存的緩沖區(qū)指針,參數(shù)count代表要保存的緩沖區(qū)大小。
ssize_t k_read(struct file *file, const void *buf, size_t count);
參數(shù)file代表要讀取進(jìn)程信息的文件,參數(shù)buf代表指向要寫入的緩沖區(qū)指針,參數(shù)count代表要寫入的緩沖區(qū)大小。
2.2 進(jìn)程的狀態(tài)保存
內(nèi)核通過
① 保存進(jìn)程PID,這是進(jìn)程的唯一標(biāo)識符,是進(jìn)程創(chuàng)建的起點(diǎn),通過current->pid獲取當(dāng)前進(jìn)程的PID,然后保存到進(jìn)程文件中。
② 保存進(jìn)程的UID、GID等,采用current_cred( )函數(shù)獲取進(jìn)程用戶名和組名。
③ 保存CPU信息,主要是寄存器和線程信息。采用task_pt_regs( )函數(shù)獲得寄存器信息。通過current->thread獲得線程信息。
④ 保存signal信息,共需要保存三組信息:信號堆棧信息、掛起信號和信號處理函數(shù)。采用do_sigaltstack( )函數(shù)獲得信號堆棧信息,通過current->blocked獲得進(jìn)程掛起信號,通過current->sighand->action獲得信號處理函數(shù)信息。
⑤ 保存進(jìn)程內(nèi)存信息,這部分比較復(fù)雜,主要的過程為采用find_vma( )函數(shù)獲得進(jìn)程的虛擬地址,保存進(jìn)程映像(如數(shù)據(jù)段、代碼段、堆區(qū)、棧區(qū)等),然后遍歷內(nèi)存,保存進(jìn)程的內(nèi)存信息。
2.3 進(jìn)程的狀態(tài)恢復(fù)
進(jìn)程恢復(fù)主要用到了k_read( )函數(shù),該函數(shù)在內(nèi)核態(tài)下讀取含有進(jìn)程信息的文件,由于文件是按照特定格式存儲(chǔ)的,因此k_read( )函數(shù)可以分段讀取進(jìn)程文件指定的內(nèi)容。恢復(fù)的主要步驟如下:
① 系統(tǒng)調(diào)用fork( )函數(shù)創(chuàng)建一個(gè)新的進(jìn)程,并進(jìn)入內(nèi)核態(tài);
② 進(jìn)程信息保存與恢復(fù)模塊接收到進(jìn)程恢復(fù)的信號后,通過k_read( )函數(shù)讀取進(jìn)程信息文件,根據(jù)文件中記錄的線程數(shù)目創(chuàng)建線程,將進(jìn)程相關(guān)的寄存器信息、信號信息以及內(nèi)存信息填充到相應(yīng)的PCB中;
③ 完成上述工作后,系統(tǒng)從內(nèi)核態(tài)返回用戶態(tài),使進(jìn)程參與任務(wù)調(diào)度,完成進(jìn)程恢復(fù)。
本系統(tǒng)由兩個(gè)子系統(tǒng)構(gòu)成:進(jìn)程保存子系統(tǒng)和進(jìn)程恢復(fù)子系統(tǒng)。由于本系統(tǒng)用獨(dú)立的文件保存進(jìn)程的各項(xiàng)信息,因此為了更好地測試進(jìn)程文件的遷移性,采用了兩套實(shí)現(xiàn)方法,即單機(jī)實(shí)現(xiàn)和雙機(jī)實(shí)現(xiàn)。
3.1 單機(jī)實(shí)現(xiàn)
進(jìn)程的保存與恢復(fù)在同一臺(tái)機(jī)器里實(shí)現(xiàn),具體流程如圖3、圖4所示。

圖3 進(jìn)程狀態(tài)保存

圖4 進(jìn)程狀態(tài)恢復(fù)
在進(jìn)程狀態(tài)保存時(shí),首先調(diào)用checkpoint [pid]命令,發(fā)送進(jìn)程保存請求。系統(tǒng)響應(yīng)進(jìn)程保存請求后,會(huì)首先暫停進(jìn)程,通過k_write( )函數(shù)將進(jìn)程各項(xiàng)信息保存到指定的進(jìn)程文件中,最后恢復(fù)進(jìn)程運(yùn)行,完成進(jìn)程狀態(tài)保存。
在進(jìn)程狀態(tài)恢復(fù)時(shí),首先調(diào)用restore [char* filename]命令,發(fā)送進(jìn)程恢復(fù)請求。系統(tǒng)響應(yīng)進(jìn)程恢復(fù)請求后,會(huì)調(diào)用fork( )函數(shù)創(chuàng)建一個(gè)新的進(jìn)程,然后通過k_read( )函數(shù)讀取進(jìn)程文件的內(nèi)容到PCB中,最后使新創(chuàng)建的進(jìn)程參與任務(wù)調(diào)度,完成進(jìn)程狀態(tài)恢復(fù)。
3.2 雙機(jī)實(shí)現(xiàn)
雙機(jī)實(shí)現(xiàn)與單機(jī)實(shí)現(xiàn)的步驟基本一致,差別在進(jìn)程文件保存上:單機(jī)實(shí)現(xiàn)時(shí),進(jìn)程文件保存在本地,而雙機(jī)實(shí)現(xiàn)時(shí),進(jìn)程文件保存在備機(jī)中。雙機(jī)實(shí)現(xiàn)工作原理如圖5所示。一臺(tái)機(jī)器為主機(jī),另一臺(tái)為備機(jī)。主機(jī)運(yùn)行程序,并且隔一段時(shí)間通過網(wǎng)絡(luò)保存進(jìn)程信息文件到備機(jī)中。備機(jī)通過串口發(fā)送心跳信號,監(jiān)視主機(jī)的狀態(tài),當(dāng)發(fā)現(xiàn)主機(jī)異常后,接管主機(jī),在備機(jī)上讀取主機(jī)保存的進(jìn)程信息文件,恢復(fù)主機(jī)的進(jìn)程,從而實(shí)現(xiàn)基于檢查點(diǎn)的雙機(jī)容錯(cuò)。

圖5 雙機(jī)進(jìn)程容錯(cuò)實(shí)現(xiàn)方法
本系統(tǒng)所采用的平臺(tái)為基于Cortex-A8 CPU的BeagleBone Black,CPU型號為TI AM3359 (1 GHz),RAM大小為512 MB,所采用的內(nèi)核版本為linux-3.8.13。使用計(jì)算N×N矩陣的N次冪作為測試程序。在程序運(yùn)行的過程中,先進(jìn)行進(jìn)程保存,然后發(fā)送KILL信號關(guān)閉程序,最后分別在單機(jī)環(huán)境和雙機(jī)環(huán)境下進(jìn)行進(jìn)程恢復(fù)。測試結(jié)果如表1、表2所列。

表1 單機(jī)進(jìn)程容錯(cuò)測試結(jié)果

表2 雙機(jī)進(jìn)程容錯(cuò)測試結(jié)果
由表1、表2可知,隨著數(shù)據(jù)量和運(yùn)算量的增加,進(jìn)程保存與恢復(fù)的耗時(shí)以及進(jìn)程文件大小相應(yīng)地增加,但是進(jìn)程保存與恢復(fù)耗時(shí)與程序運(yùn)行時(shí)間的百分比卻明顯下降,這充分地說明運(yùn)算量大且實(shí)時(shí)性較高的程序上運(yùn)用該進(jìn)程級容錯(cuò)系統(tǒng)的優(yōu)勢更為明顯。從雙機(jī)測試的結(jié)果看,該進(jìn)程文件具有較好的遷移性,因此,該進(jìn)程級容錯(cuò)系統(tǒng)可以運(yùn)用到基于嵌入式平臺(tái)的分布式計(jì)算系統(tǒng)中。

[1] Hargrove P H, Duell J C. Berkeley lab checkpoint/restart (blcr) for linux clusters[J]. Journal of Physics: Conference Series. IOP Publishing, 2006, 46(1): 494.
[2] Lawrence Berkeley National Laboratory. The design and implementation of berkeley lab's linux checkpoint/restart,2005.
[3] Mishra S. Design and Implementation of Process Migration and Cloning in BLCR[D]. Raleigh: North Carolina State University,2011.
[4] Hariyale H, Vardhan M, Pandey A. Load Balancing in Cluster Using BLCR Checkpoint/Restart[M].Berlin:Springer Berlin Heidelberg, 2012: 729-737.
[5] 管文,裴爾明,石京燕,等.基于 Linux的會(huì)話斷點(diǎn)保存與恢復(fù)軟件[J]. Computer Engineering, 2010, 36(8).
[6] 楊暉,陳閎中.支持文件遷移的 Linux檢查點(diǎn)機(jī)制的實(shí)現(xiàn)[J].計(jì)算機(jī)工程, 2010, 36(3): 266-268.
[7] 門朝光,焦亮,李香,等.基于 Linux內(nèi)核的進(jìn)程檢查點(diǎn)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)科學(xué), 2009, 36(4): 192-194.
Design of Embedded Fault Tolerant System Based on Process Checkpoint Settings
Wang Fuyou,Yang Bin
(School of Information Science & Technology,Southwest Jiaotong University,Chengdu 610031,China)
According to the characteristics of embedded Linux system, the process-lever fault tolerant of ARM platform is realized through setting checkpoint. During the working,the checkpoint realizes the interactions with the kernel through the proc file system.At the same time, the checkpoint gets the PID,CPU status and memory information about the process, and stores the information in the storage medium. When the process is failed, the system resumes the above information. The experiments indicate this process-level fault tolerant system achieves fault tolerance and reduces the time of resuming process.
ARM; embedded Linux;checkpoint;fault tolerant
TP316
A
2014-02-20)