童 艷,周欣明
(91550部隊(duì) 大連 116023)
實(shí)時(shí)測控集群是目前測控系統(tǒng)采用的新型實(shí)時(shí)數(shù)據(jù)處理系統(tǒng),主要用于承擔(dān)測控系統(tǒng)的實(shí)時(shí)數(shù)據(jù)處理任務(wù),包括對(duì)測控目標(biāo)的外測軌跡解算、遙測在軌跟蹤實(shí)時(shí)解算、遙測參數(shù)和遙控指令的實(shí)時(shí)監(jiān)控處理、對(duì)測控設(shè)備的數(shù)據(jù)處理以及數(shù)字引導(dǎo)信息的生成等計(jì)算任務(wù)。它能夠?yàn)闇y控系統(tǒng)的指揮顯示和安全控制分系統(tǒng)提供目標(biāo)航跡與參數(shù)信息,可作為試驗(yàn)指揮和安全故障判決的依據(jù),還能為測控設(shè)備提供目標(biāo)的數(shù)字引導(dǎo)信息,與其它指控中心信息互通完成聯(lián)合試驗(yàn)任務(wù)等。因此,對(duì)實(shí)時(shí)測控集群的實(shí)時(shí)性和可靠性要求較高[1]。
測控集群系統(tǒng)一改過去集中式處理體系結(jié)構(gòu),是測控系統(tǒng)未來向多目標(biāo)多任務(wù)方向發(fā)展需求以及計(jì)算機(jī)技術(shù)發(fā)展進(jìn)步雙重因素驅(qū)動(dòng)的結(jié)果[2,3]。集中式處理體系結(jié)構(gòu)簡單,數(shù)據(jù)處理由單臺(tái)計(jì)算機(jī)完成,實(shí)時(shí)性好,但風(fēng)險(xiǎn)較集中,雖然通常設(shè)計(jì)兩臺(tái)數(shù)據(jù)處理服務(wù)器互為熱備份,但一旦兩臺(tái)服務(wù)器同時(shí)出現(xiàn)故障,將面臨測控失利的風(fēng)險(xiǎn)。另外,集中式處理體系結(jié)構(gòu)的數(shù)據(jù)處理能力取決于服務(wù)器的軟硬件性能。按照測控系統(tǒng)未來發(fā)展趨勢,數(shù)據(jù)量隨著測控目標(biāo)數(shù)增多會(huì)成倍增長,實(shí)時(shí)數(shù)據(jù)處理需求也會(huì)加大,而集中式處理受限于計(jì)算機(jī)性能,承載能力和可擴(kuò)展性將成為制約測控系統(tǒng)發(fā)展的瓶頸。測控集群系統(tǒng)屬于分布式處理體系結(jié)構(gòu),它是由若干計(jì)算機(jī)(節(jié)點(diǎn)機(jī))通過高速網(wǎng)絡(luò)連接在一起,按照任務(wù)分配相互協(xié)作,共同完成測控任務(wù)[4]。傳統(tǒng)集群技術(shù)的研究側(cè)重于計(jì)算任務(wù)在多個(gè)計(jì)算節(jié)點(diǎn)的負(fù)載均衡,具有高可用性,但對(duì)其它節(jié)點(diǎn)和網(wǎng)絡(luò)通常采用單一系統(tǒng)或簡單的雙集群系統(tǒng)來保證系統(tǒng)的可靠性[5,6]。前者存在一旦其它節(jié)點(diǎn)或網(wǎng)絡(luò)故障,整個(gè)系統(tǒng)都將癱瘓的問題;后者則要求每個(gè)計(jì)算節(jié)點(diǎn)只能服務(wù)于一個(gè)集群系統(tǒng),在體系結(jié)構(gòu)上造成了計(jì)算節(jié)點(diǎn)的資源浪費(fèi)。本文在集群設(shè)計(jì)架構(gòu)上對(duì)控制節(jié)點(diǎn)等關(guān)鍵設(shè)備進(jìn)行“主/副”機(jī)配置,并在數(shù)據(jù)收發(fā)上采用“雙工”網(wǎng)絡(luò)方式配置。這種體系結(jié)構(gòu)的優(yōu)點(diǎn)是數(shù)據(jù)處理任務(wù)全部由計(jì)算節(jié)點(diǎn)接收、處理和發(fā)送,計(jì)算節(jié)點(diǎn)的控制由互為備份的兩臺(tái)控制節(jié)點(diǎn)完成,控制節(jié)點(diǎn)通過網(wǎng)絡(luò)將數(shù)據(jù)處理任務(wù)分配到計(jì)算節(jié)點(diǎn)上完成,每個(gè)計(jì)算節(jié)點(diǎn)是一臺(tái)獨(dú)立的計(jì)算機(jī),計(jì)算節(jié)點(diǎn)的個(gè)數(shù)可根據(jù)任務(wù)規(guī)模擴(kuò)展。每臺(tái)計(jì)算節(jié)點(diǎn)在控制節(jié)點(diǎn)的控制下運(yùn)行,并實(shí)時(shí)報(bào)告工作狀態(tài),控制節(jié)點(diǎn)可根據(jù)收集的計(jì)算節(jié)點(diǎn)狀態(tài)動(dòng)態(tài)分析節(jié)點(diǎn)機(jī)資源利用率和故障情況,從而動(dòng)態(tài)完成任務(wù)遷移和故障恢復(fù),保證數(shù)據(jù)處理系統(tǒng)的實(shí)時(shí)性和可靠性。
集群系統(tǒng)的核心工作是實(shí)時(shí)數(shù)據(jù)處理,完成該工作的設(shè)備是集群中的各個(gè)計(jì)算節(jié)點(diǎn)。傳統(tǒng)集群通常具有計(jì)算任務(wù)周期長、計(jì)算量大等特點(diǎn),一旦計(jì)算節(jié)點(diǎn)出現(xiàn)故障,只能訴求檢查點(diǎn)與卷回恢復(fù)技術(shù)等后向恢復(fù)機(jī)制實(shí)現(xiàn)進(jìn)程遷移[7,8]。實(shí)時(shí)測控集群不同于其它集群系統(tǒng)的是其數(shù)據(jù)處理需求是已知的,且數(shù)據(jù)處理周期性強(qiáng)、實(shí)時(shí)性高。因此,可在軟件設(shè)計(jì)上采用前向恢復(fù)機(jī)制。由于運(yùn)行在集群計(jì)算節(jié)點(diǎn)上的進(jìn)程具有一致性,可同時(shí)啟動(dòng)運(yùn)行并統(tǒng)一受控制節(jié)點(diǎn)調(diào)度,要求同一時(shí)刻完成某項(xiàng)計(jì)算任務(wù)的線程在系統(tǒng)中只能有一個(gè)處于解掛狀態(tài),便可保證集群系統(tǒng)承擔(dān)的數(shù)據(jù)處理任務(wù)的每個(gè)運(yùn)算粒度在任意時(shí)刻有且只有一個(gè)活動(dòng)節(jié)點(diǎn)在承擔(dān)運(yùn)行工作,從而省去了進(jìn)程遷移時(shí)的進(jìn)程檢查點(diǎn)設(shè)置和環(huán)境拷貝過程,但同時(shí)也對(duì)進(jìn)程控制提出了較高的要求。為此,本文設(shè)計(jì)了一種滿足數(shù)據(jù)處理實(shí)時(shí)性和系統(tǒng)高可用的集群節(jié)點(diǎn)進(jìn)程控制方法,有效發(fā)揮集群系統(tǒng)架構(gòu)在測控系統(tǒng)中應(yīng)用的優(yōu)勢。
實(shí)時(shí)測控?cái)?shù)據(jù)處理集群系統(tǒng)主要由互為備份的兩臺(tái)控制節(jié)點(diǎn)、若干計(jì)算節(jié)點(diǎn)以及雙工時(shí)統(tǒng)設(shè)備和網(wǎng)絡(luò)設(shè)備組成。集群控制節(jié)點(diǎn)采用“主/副”機(jī)工作方式,網(wǎng)絡(luò)設(shè)備采用雙工方式,整個(gè)系統(tǒng)部件都具有熱備份,且不存在不必要的冗余備份,在硬件上保證了系統(tǒng)的高可用性。控制節(jié)點(diǎn)主機(jī)通過心跳獲取各計(jì)算節(jié)點(diǎn)狀態(tài)[9],對(duì)狀態(tài)正常的計(jì)算節(jié)點(diǎn)進(jìn)行任務(wù)分配,通過“掛起/解掛”信號(hào)控制計(jì)算節(jié)點(diǎn)進(jìn)程的運(yùn)行,保證測控任務(wù)作業(yè)中需要的每個(gè)計(jì)算任務(wù)被分配到若干計(jì)算節(jié)點(diǎn)的其中一臺(tái)上運(yùn)行。集群計(jì)算節(jié)點(diǎn)進(jìn)程根據(jù)收到的來自控制節(jié)點(diǎn)的控制信號(hào)對(duì)自己的運(yùn)行狀態(tài)進(jìn)行控制。如果收到的是“掛起”信號(hào),則進(jìn)程控制所有工作線程處于等待狀態(tài);如果收到的是“解掛”信號(hào),則進(jìn)程根據(jù)作業(yè)要求解掛相關(guān)工作線程,實(shí)現(xiàn)計(jì)算節(jié)點(diǎn)進(jìn)程在集群系統(tǒng)中的控制和調(diào)度。集群系統(tǒng)在時(shí)統(tǒng)信號(hào)的統(tǒng)一控制下工作,計(jì)算節(jié)點(diǎn)主控線程除了控制進(jìn)程內(nèi)的工作線程,還在每個(gè)時(shí)間周期收集各個(gè)線程的工作狀態(tài)并上報(bào)給控制節(jié)點(diǎn)。當(dāng)計(jì)算節(jié)點(diǎn)軟件出現(xiàn)故障時(shí),控制節(jié)點(diǎn)能在一個(gè)時(shí)間周期內(nèi)收到報(bào)告并采取任務(wù)遷移。當(dāng)計(jì)算節(jié)點(diǎn)進(jìn)程發(fā)生任務(wù)遷移時(shí),按照以上控制方法,進(jìn)程的主控線程能夠在一個(gè)周期內(nèi)對(duì)控制信號(hào)作出反應(yīng),掛起非活動(dòng)節(jié)點(diǎn)的工作線程,解掛活動(dòng)節(jié)點(diǎn)的工作線程,從而滿足實(shí)時(shí)測控集群完成數(shù)據(jù)處理任務(wù)的實(shí)時(shí)性要求和集群系統(tǒng)的高可用性。
計(jì)算節(jié)點(diǎn)進(jìn)程采用多線程架構(gòu)[10],由一個(gè)控制線程和多個(gè)工作線程組成。根據(jù)實(shí)時(shí)數(shù)據(jù)處理任務(wù)需要設(shè)計(jì)計(jì)算節(jié)點(diǎn)進(jìn)程包含一個(gè)主控線程和多個(gè)用于計(jì)算的工作線程。主控線程負(fù)責(zé)創(chuàng)建工作線程并掛起,等待控制節(jié)點(diǎn)的控制信號(hào);根據(jù)控制節(jié)點(diǎn)的任務(wù)分配指令,實(shí)時(shí)控制本進(jìn)程各個(gè)工作線程的“掛起/解掛”,并匯集各個(gè)工作線程的工作情況,定期向控制節(jié)點(diǎn)報(bào)告。工作線程在主控線程的控制下,完成具體的數(shù)據(jù)處理任務(wù),并向主控線程報(bào)告自己的工作情況。集群控制節(jié)點(diǎn)根據(jù)收集到的各計(jì)算節(jié)點(diǎn)工作情況,實(shí)時(shí)修改任務(wù)分配方案,并按任務(wù)分配方案給各個(gè)計(jì)算節(jié)點(diǎn)發(fā)送“掛起/解掛”信號(hào),從任務(wù)分配上保證計(jì)算節(jié)點(diǎn)的進(jìn)程在集群系統(tǒng)中具有唯一性的運(yùn)行,即同一時(shí)刻每個(gè)進(jìn)程在集群系統(tǒng)中有且只有一個(gè)處于活動(dòng)狀態(tài)。這樣做既節(jié)省了系統(tǒng)資源,又能增強(qiáng)系統(tǒng)的魯棒性,一旦軟件因?yàn)樵馐軘?shù)據(jù)沖擊而崩潰,不會(huì)影響到遷移后的軟件執(zhí)行。
考慮進(jìn)程運(yùn)行和遷移的實(shí)時(shí)性以及計(jì)算節(jié)點(diǎn)的高可用性,設(shè)計(jì)一種由工作信號(hào)實(shí)現(xiàn)主控線程“掛起/解掛”其他工作線程的流程。主控線程在收到控制節(jié)點(diǎn)的“掛起/解掛”信號(hào)后,向其它工作線程發(fā)送工作信號(hào)。由于工作線程通常分為時(shí)間驅(qū)動(dòng)線程和數(shù)據(jù)驅(qū)動(dòng)線程,因此工作信號(hào)的處理方法也相應(yīng)分為兩種情況。
2.2.1 時(shí)間驅(qū)動(dòng)線程的工作信號(hào)處理方法
時(shí)間驅(qū)動(dòng)線程通常用于完成數(shù)據(jù)解算與任務(wù)發(fā)送,需要在時(shí)統(tǒng)信號(hào)下周期驅(qū)動(dòng)運(yùn)行,而主控線程發(fā)送工作信號(hào)就是在時(shí)統(tǒng)信號(hào)的統(tǒng)一控制下完成的,因此時(shí)間驅(qū)動(dòng)線程在收到主控線程發(fā)送的工作信號(hào)后解掛運(yùn)行,并主動(dòng)將時(shí)間驅(qū)動(dòng)線程的工作信號(hào)清零,等待下一周期主控線程發(fā)送工作信號(hào),實(shí)現(xiàn)在統(tǒng)一時(shí)間驅(qū)動(dòng)下工作。由此設(shè)計(jì)的時(shí)間驅(qū)動(dòng)線程控制過程為:主控線程在時(shí)統(tǒng)信號(hào)驅(qū)動(dòng)下收到解掛信號(hào)時(shí),將時(shí)間驅(qū)動(dòng)線程的工作信號(hào)置1,并發(fā)送給時(shí)間驅(qū)動(dòng)線程,時(shí)間驅(qū)動(dòng)線程收到工作信號(hào)后清零工作信號(hào)并開始工作,工作完成后繼續(xù)等待下一周期工作信號(hào)的到來;當(dāng)主控線程收到控制節(jié)點(diǎn)的掛起信號(hào)時(shí),將發(fā)送給時(shí)間驅(qū)動(dòng)線程的工作信號(hào)清零,時(shí)間驅(qū)動(dòng)線程在一個(gè)時(shí)間周期內(nèi)收到工作信號(hào)為零,即刻掛起繼續(xù)等待下一個(gè)工作信號(hào),直到收到非零的工作信號(hào)繼續(xù)開始工作。工作流程如圖1所示。
圖1 主控線程控制時(shí)間驅(qū)動(dòng)線程的工作流程Fig.1 The working process of the master thread and time driven thread
2.2.2 數(shù)據(jù)驅(qū)動(dòng)線程的工作信號(hào)處理方法
數(shù)據(jù)驅(qū)動(dòng)線程通常用來完成數(shù)據(jù)接收任務(wù),因此它在工作時(shí)不應(yīng)受時(shí)間周期的控制,而主控線程發(fā)送工作信號(hào)是在時(shí)統(tǒng)信號(hào)的統(tǒng)一控制下完成的,因此設(shè)計(jì)的工作信號(hào)處理方法應(yīng)實(shí)現(xiàn)線程解掛之后不受時(shí)間驅(qū)動(dòng),并且在任意時(shí)間周期還能掛起。本文的設(shè)計(jì)方法是:當(dāng)主控線程收到解掛信號(hào)時(shí),將數(shù)據(jù)驅(qū)動(dòng)線程的工作信號(hào)置1,并發(fā)送給數(shù)據(jù)驅(qū)動(dòng)線程,數(shù)據(jù)驅(qū)動(dòng)線程收到工作信號(hào)后開始工作,但不清零工作信號(hào),也就是一次性解掛數(shù)據(jù)驅(qū)動(dòng)線程運(yùn)行;當(dāng)主控線程收到控制節(jié)點(diǎn)的掛起信號(hào)時(shí),將發(fā)送給數(shù)據(jù)驅(qū)動(dòng)線程的工作信號(hào)清零,數(shù)據(jù)驅(qū)動(dòng)線程在一個(gè)時(shí)間周期內(nèi)收到工作信號(hào)為零,即刻掛起繼續(xù)等待下一個(gè)工作信號(hào),直到收到非零的工作信號(hào)繼續(xù)開始工作。工作流程如圖2所示。
圖2 主控線程控制數(shù)據(jù)驅(qū)動(dòng)線程的工作流程Fig.2 The working process of the master thread and data driven thread
假設(shè)某項(xiàng)實(shí)時(shí)測控?cái)?shù)據(jù)處理任務(wù)的計(jì)算粒度劃分為外測數(shù)據(jù)處理、遙測數(shù)據(jù)處理、姿態(tài)信息處理、落點(diǎn)計(jì)算、信息分發(fā)和數(shù)據(jù)模擬共六個(gè)數(shù)據(jù)處理單元,每個(gè)數(shù)據(jù)處理單元被設(shè)計(jì)成一個(gè)獨(dú)立的進(jìn)程完成。首先在所有計(jì)算節(jié)點(diǎn)上都布設(shè)這六個(gè)數(shù)據(jù)處理進(jìn)程,每個(gè)進(jìn)程根據(jù)數(shù)據(jù)處理需求設(shè)計(jì)為多線程程序,由主控線程創(chuàng)建負(fù)責(zé)數(shù)據(jù)處理的子線程并掛起。以信息分發(fā)進(jìn)程為例,信息分發(fā)的數(shù)據(jù)處理功能是接收集群網(wǎng)絡(luò)節(jié)點(diǎn)間交換的信息,根據(jù)不同作業(yè)加工并發(fā)送與本次作業(yè)相關(guān)的信息。假設(shè)信息處理分類有A、B、C、D四種,則由主控線程在初始化時(shí)創(chuàng)建數(shù)據(jù)接收、A類信息加工發(fā)送、B類信息加工發(fā)送、C類信息加工發(fā)送、D類信息加工發(fā)送五個(gè)子線程。子線程創(chuàng)建后掛起,等待主控線程工作信號(hào)。主控線程在20Hz時(shí)統(tǒng)信號(hào)的驅(qū)動(dòng)下,按照收到的控制節(jié)點(diǎn)“掛起/解掛”信號(hào)給子線程發(fā)送工作信號(hào)。約定工作信號(hào)為0時(shí),子線程處于掛起狀態(tài),此時(shí)不進(jìn)行數(shù)據(jù)處理;工作信號(hào)為1時(shí),子線程解掛,完成數(shù)據(jù)處理工作后,繼續(xù)等待下一時(shí)間周期的工作信號(hào)。信息分發(fā)子線程中數(shù)據(jù)接收線程屬于數(shù)據(jù)驅(qū)動(dòng)線程,工作信號(hào)處理流程按照?qǐng)D2設(shè)計(jì)。其它子線程屬于時(shí)間驅(qū)動(dòng)線程,工作信號(hào)處理流程按照?qǐng)D1設(shè)計(jì)。軟件設(shè)計(jì)中工作信號(hào)可采用條件變量來實(shí)現(xiàn)[11]。當(dāng)進(jìn)程內(nèi)部發(fā)生故障時(shí),由工作狀態(tài)報(bào)告機(jī)制實(shí)現(xiàn)任務(wù)遷移。例如,信息分發(fā)進(jìn)程某個(gè)子線程數(shù)據(jù)發(fā)送不成功,此時(shí)會(huì)向主控線程報(bào)告錯(cuò)誤信息,主控線程會(huì)將線程號(hào)及錯(cuò)誤類別碼報(bào)告給控制節(jié)點(diǎn),由控制節(jié)點(diǎn)采取任務(wù)遷移措施。具體實(shí)現(xiàn)方法是控制節(jié)點(diǎn)給故障節(jié)點(diǎn)機(jī)發(fā)送掛起信號(hào),給任務(wù)遷移的目的計(jì)算節(jié)點(diǎn)發(fā)送信息分發(fā)進(jìn)程解掛信號(hào);當(dāng)故障節(jié)點(diǎn)機(jī)上的信息分發(fā)進(jìn)程主控線程收到“掛起”信號(hào)時(shí),將其子進(jìn)程的工作信號(hào)置0,子進(jìn)程掛起;遷移節(jié)點(diǎn)機(jī)上的信息分發(fā)進(jìn)程收到解掛信號(hào)后,接替故障機(jī)完成信息分發(fā)數(shù)據(jù)處理任務(wù),此時(shí)操作人員可進(jìn)行故障診斷分析,恢復(fù)節(jié)點(diǎn)機(jī)功能,重啟信息分發(fā)進(jìn)程并掛起等待。通過任務(wù)遷移,在新的數(shù)據(jù)處理周期可恢復(fù)系統(tǒng)的信息分發(fā)功能,系統(tǒng)的故障修復(fù)時(shí)間為50ms。采用這種設(shè)計(jì)方法可實(shí)現(xiàn)計(jì)算節(jié)點(diǎn)上各數(shù)據(jù)處理進(jìn)程的快速啟動(dòng),并能在一個(gè)時(shí)間周期內(nèi)快速實(shí)現(xiàn)計(jì)算節(jié)點(diǎn)上各數(shù)據(jù)處理進(jìn)程的任務(wù)遷移。
本文采用軟件設(shè)計(jì)方法實(shí)現(xiàn)了測控集群數(shù)據(jù)處理進(jìn)程控制,使計(jì)算節(jié)點(diǎn)能夠根據(jù)來自控制節(jié)點(diǎn)的控制信號(hào)對(duì)自己的運(yùn)行狀態(tài)進(jìn)行控制,完成實(shí)時(shí)數(shù)據(jù)處理任務(wù)。在本文的控制方法下,計(jì)算節(jié)點(diǎn)的實(shí)時(shí)數(shù)據(jù)處理功能能夠快速啟動(dòng),并在進(jìn)程發(fā)生故障時(shí)實(shí)現(xiàn)快速任務(wù)遷移,使測控集群系統(tǒng)同時(shí)具備數(shù)據(jù)計(jì)算的實(shí)時(shí)性和計(jì)算節(jié)點(diǎn)的高可用性。