馬占飛 李克見 史國(guó)振
1.內(nèi)蒙古科技大學(xué)包頭師范學(xué)院,包頭市 014030
2.內(nèi)蒙古科技大學(xué),包頭市 014010
3.北京電子科技學(xué)院,北京市 100700
隨著我國(guó)電子政務(wù)內(nèi)網(wǎng)及安全應(yīng)用系統(tǒng)的逐步推廣和部署,安全應(yīng)用系統(tǒng)面臨著高并發(fā)、高吞吐率的性能需求。 國(guó)內(nèi)有很多學(xué)者針對(duì)密碼硬件模塊采用并行處理機(jī)制[1,2]性能優(yōu)化,而對(duì)于整個(gè)應(yīng)用系統(tǒng)的性能瓶頸往往體現(xiàn)在軟件方面,密碼服務(wù)軟件是為安全應(yīng)用系統(tǒng)提供密碼服務(wù)不可少的密碼處理模塊,負(fù)責(zé)接受和處理上層安全應(yīng)用系統(tǒng)的密碼服務(wù)軟件的隨機(jī)性、多樣性的調(diào)用請(qǐng)求,為安全應(yīng)用系統(tǒng)提供數(shù)據(jù)的機(jī)密性、完整性和不可篡改性保護(hù)。 密碼服務(wù)軟件的數(shù)據(jù)處理架構(gòu)性能直接影響著安全應(yīng)用系統(tǒng)在多用戶下并發(fā)響應(yīng)速率,對(duì)數(shù)據(jù)包的響應(yīng)效率要求較高。
單引擎的密碼服務(wù)架構(gòu)的密碼處理模塊已經(jīng)不能滿足上層安全應(yīng)用系統(tǒng)的多用戶、高并發(fā)性能需求,是限制安全應(yīng)用系統(tǒng)在多用戶場(chǎng)景下數(shù)據(jù)處理性能的關(guān)鍵因素之一。
從密碼服務(wù)提供者角度分析,影響密碼服務(wù)性能的有三個(gè)方面,一是密碼應(yīng)用接口通信性能;二是密碼服務(wù)軟件的數(shù)據(jù)處理架構(gòu)性能;三是密碼算法的性能。 其中密碼服務(wù)軟件的數(shù)據(jù)處理架構(gòu)性能是最易也是提升空間較大的關(guān)鍵方面,是本文研究的主要內(nèi)容,本文重點(diǎn)分析密碼服務(wù)軟件面臨安全應(yīng)用系統(tǒng)高性能需求環(huán)境下,如何提供多線程并發(fā)[3,4]的密碼服務(wù),引入多包處理機(jī)制和無鎖隊(duì)列[5,6]技術(shù)進(jìn)行優(yōu)化,提出多引擎機(jī)制的軟件架構(gòu),利用共享鎖處理機(jī)制和無鎖隊(duì)列技術(shù)進(jìn)行性能研究對(duì)比,優(yōu)化密碼服務(wù)軟件的數(shù)據(jù)包處理性能,從而更好地滿足上層安全應(yīng)用系統(tǒng)對(duì)密碼服務(wù)的性能需求。
本文組織架構(gòu)如下:第1 節(jié)介紹密碼服務(wù)方軟件架構(gòu);第2 節(jié)介紹高性能隊(duì)列,無鎖隊(duì)列技術(shù);第3 節(jié)描述了提議的方案設(shè)計(jì)和已完成工作,包括多引擎架構(gòu)設(shè)計(jì)、多包處理機(jī)制和引擎可配置;第4 節(jié)描述實(shí)驗(yàn)及測(cè)試結(jié)論;第5 節(jié)本文總結(jié)了相關(guān)工作和未來的改進(jìn)方向。 前兩節(jié)屬于本文的預(yù)備知識(shí),之后章節(jié)為本文的新工作內(nèi)容。
單引擎密碼服務(wù)由算法初始化、應(yīng)用容器初始化、任務(wù)接受、任務(wù)處理等模塊組成。 密碼服務(wù)軟件的軟件架構(gòu)如圖1 所示。
圖1 單引擎密碼服務(wù)架構(gòu)框圖
算法初始化主要配置和初始化密碼算法庫操作。 密碼服務(wù)軟件為上層安全應(yīng)用系統(tǒng)提供偽隨機(jī)數(shù)、對(duì)稱加密、非對(duì)稱加密、摘要運(yùn)算、消息認(rèn)證碼運(yùn)算、簽名驗(yàn)簽運(yùn)算等密碼服務(wù)。 具體的密碼運(yùn)算提供由算法庫來實(shí)現(xiàn),密碼算法庫實(shí)現(xiàn)方式可分為軟實(shí)現(xiàn)和硬實(shí)現(xiàn),軟實(shí)現(xiàn)指軟件編程實(shí)現(xiàn)的密碼算法組件,常見的開源算法庫有OpenSSL、Crypto++、MbedTLS 等,硬實(shí)現(xiàn)指調(diào)用一些加密硬件部件或加密芯片進(jìn)行運(yùn)算,常見的硬件部件有USBKEY 加密鑰匙、PCIE 密碼卡、服務(wù)器密碼機(jī)等。
應(yīng)用容器初始化負(fù)責(zé)對(duì)應(yīng)用策略相關(guān)配置和初始化操作,應(yīng)用容器是為安全應(yīng)用系統(tǒng)提供密碼服務(wù)軟件的最小單元,安全應(yīng)用系統(tǒng)通過打開應(yīng)用容器使用容器內(nèi)所配置的算法和密鑰,密碼服務(wù)軟件支持多應(yīng)用容器配置,每個(gè)應(yīng)用容器的算法和密鑰是按容器分割,不同的應(yīng)用容器配用的算法、應(yīng)用密鑰不同。 密碼服務(wù)軟件可按照應(yīng)用場(chǎng)景不同進(jìn)行配置應(yīng)用容器,可配置對(duì)稱算法、非對(duì)稱算法、簽名驗(yàn)簽、摘要運(yùn)算、消息驗(yàn)證碼運(yùn)算等為安全應(yīng)用系統(tǒng)提供密碼服務(wù)。
任務(wù)處理線程負(fù)責(zé)處理任務(wù)隊(duì)列中的任務(wù)數(shù)據(jù)包,依次將任務(wù)數(shù)據(jù)包取出、解析、處理、返回結(jié)果。
密碼服務(wù)軟件架構(gòu)中設(shè)計(jì)輸入緩存機(jī)制,輸入緩存隊(duì)列是影響密碼服務(wù)引擎處理性能的關(guān)鍵因素。 隊(duì)列(queue)是一種先進(jìn)先出(FIFO)的線性表,只允許在表的一端進(jìn)行插入,在另一端進(jìn)行刪除元素。 針對(duì)作業(yè)排隊(duì)處理的多線程并發(fā)的軟件架構(gòu)中,隊(duì)列是程序設(shè)計(jì)中經(jīng)常使用的一種數(shù)據(jù)結(jié)構(gòu),隊(duì)列在多線程操作一般模式是基于互斥鎖與信號(hào)量想結(jié)合實(shí)現(xiàn),生產(chǎn)者和消費(fèi)者在操作隊(duì)列之前,先獲得共享鎖再操作,完成操作之后將鎖釋放,但這種共享鎖的機(jī)制效率不高,使用不當(dāng)很容易產(chǎn)生死鎖的情況,無鎖隊(duì)列是一種非互斥鎖的并發(fā)數(shù)據(jù)結(jié)構(gòu),相比共享鎖效率高且避免死鎖現(xiàn)象,無鎖隊(duì)列主要是通過原子操作或細(xì)粒度鎖來實(shí)現(xiàn)的一種支持多線程并發(fā)的高效線程安全隊(duì)列[7]。
無鎖隊(duì)列處理模型按照生產(chǎn)者和消費(fèi)者模型的對(duì)應(yīng)關(guān)系可分為:?jiǎn)紊a(chǎn)者-單消費(fèi)者模型(一對(duì)一)、多生產(chǎn)者-單消費(fèi)者模型(多對(duì)一)、單生產(chǎn)者-多消費(fèi)者模型(一對(duì)多)、多生產(chǎn)者-多消費(fèi)者模型(多對(duì)多)共四種模型。
(1) 單生產(chǎn)者-單消費(fèi)者模型
圖2 一對(duì)一隊(duì)列模型
(2) 多生產(chǎn)者-單消費(fèi)者模型
圖3 多對(duì)一隊(duì)列模型
(3) 單生產(chǎn)者-多消費(fèi)者模型
黎永蘭母親李玉說,林雪川在事后第一時(shí)間隱瞞了真相,試圖以意外來掩飾故意,這是不悔罪的表現(xiàn),從事發(fā)到被抓,三天的空檔時(shí)間,林雪川也有機(jī)會(huì)將不利的證據(jù)毀滅,這都應(yīng)該罪加一等。
圖4 一對(duì)多隊(duì)列模型
(4)多生產(chǎn)者-多消費(fèi)者模型
圖5 多對(duì)多隊(duì)列模型
以上是無鎖隊(duì)列的四種處理模型,無鎖隊(duì)列技術(shù)實(shí)現(xiàn)有很多方式,其性能也各有不同,常見的無鎖隊(duì)列主要是通過比較再交換(CAS Compare and Swap)、增加指定的值(FAA Fetch and add)等原子操作或Retry-Loop 細(xì)粒度的鎖機(jī)制實(shí)現(xiàn)。
本文基于圖1 所示的單引擎密碼服務(wù)軟件架構(gòu)進(jìn)行性能優(yōu)化,針對(duì)單引擎的任務(wù)處理架構(gòu)提出一種多引擎處理機(jī)制架構(gòu),處理引擎由隊(duì)列和處理線程組成,每一個(gè)接受隊(duì)列綁定一個(gè)處理線程,這樣的隊(duì)列與處理線程綁定的結(jié)構(gòu)組成一個(gè)密碼引擎(Crypto Engine),接受線程將收到的數(shù)據(jù)包采用順序輪循的調(diào)度方式投入到處理引擎中,處理引擎將待處理數(shù)據(jù)處理完畢,根據(jù)數(shù)據(jù)包頭信息將處理結(jié)果發(fā)送返回。 如圖6 所示多引擎并行處理機(jī)制,接受線程將任務(wù)分別投入不同的引擎中處理并返回結(jié)果。
圖6 多引擎并行處理架構(gòu)
多引擎密碼服務(wù)主要由接受任務(wù)模塊、緩存隊(duì)列、處理線程等功能模塊組成。
為提高數(shù)據(jù)傳輸效率和穩(wěn)定性,密碼引擎中設(shè)計(jì)輸入緩存機(jī)制-緩存隊(duì)列,緩存隊(duì)列的是為了匹配數(shù)據(jù)傳輸速率和密碼服務(wù)處理速率,提高數(shù)據(jù)通信帶寬,在多線程并發(fā)場(chǎng)景下,緩存隊(duì)列的入隊(duì)和出隊(duì)性能是影響密碼服務(wù)處理性能的關(guān)鍵。 密碼服務(wù)軟件接受n個(gè)任務(wù)請(qǐng)求后,按照順序輪詢放入每個(gè)密碼引擎的緩存隊(duì)列中,對(duì)應(yīng)的處理線程模塊分別處理緩存隊(duì)列的任務(wù)并將結(jié)果發(fā)送返回,從而實(shí)現(xiàn)密碼服務(wù)的并行性處理,提高密碼服務(wù)的處理性能,滿足上層安全應(yīng)用系統(tǒng)高并發(fā)高性能的需求。
軟件支持并發(fā)訪問的數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)可以基于互斥鎖或無鎖機(jī)制,無鎖隊(duì)列的應(yīng)用與平臺(tái)和編譯器依賴緊密,在實(shí)際的應(yīng)用場(chǎng)景中,無鎖機(jī)制是不能完全代替有鎖機(jī)制的應(yīng)用,因此本文針對(duì)基于有鎖隊(duì)列下單包處理機(jī)制,提出一種基于有鎖隊(duì)列的多包處理機(jī)制,也是一種多線程并行處理[8-10]的軟件架構(gòu)的性能優(yōu)化項(xiàng)。
在生產(chǎn)環(huán)境中廣泛使用生產(chǎn)者和消費(fèi)者模型,生產(chǎn)者在生產(chǎn)的同時(shí),消費(fèi)者可以進(jìn)行消費(fèi),通常使用互斥鎖保證數(shù)據(jù)同步。 當(dāng)多線程并發(fā)設(shè)計(jì)中線程互斥鎖的開銷較大且頻繁出現(xiàn)鎖競(jìng)爭(zhēng),會(huì)導(dǎo)致線程等待情況,CPU 不停地中斷,使得軟件整體性能下降。 為盡可能降低線程鎖爭(zhēng)用帶來的影響,可以運(yùn)用多包處理的設(shè)計(jì)思路即每次獲取到競(jìng)爭(zhēng)鎖,獲取盡可能多的數(shù)據(jù)包,降低所競(jìng)爭(zhēng)的頻度,從而提升優(yōu)化軟件架構(gòu)性能。
密碼服務(wù)軟件中競(jìng)爭(zhēng)鎖情況主要體現(xiàn)在接受線程與多個(gè)處理線程之間,接受線程將收到的合法請(qǐng)求數(shù)據(jù)包通過輪詢方法放入隊(duì)列中,隊(duì)列中存在數(shù)據(jù)包時(shí)將觸發(fā)處理線程工作,處理線程將數(shù)據(jù)取出隊(duì)列,任務(wù)隊(duì)列是一個(gè)臨界區(qū),為了提升密碼服務(wù)軟件的處理性能,降低接受線程與處理線程競(jìng)爭(zhēng)線程鎖的概率,本文提出多包處理機(jī)制,即處理線程每次獲取到鎖之后,取出盡可能多的數(shù)據(jù)包,之后再循環(huán)處理多包,相比頻繁獲取鎖,多包處理機(jī)制更加節(jié)省系統(tǒng)開銷,這種多包處理機(jī)制在高并發(fā)、高吞吐量情況下,密碼服務(wù)軟件處理任務(wù)的性能有明顯提升。
多引擎密碼服務(wù)軟件性能提升的關(guān)鍵在于處理引擎合理配置,如何更加合理設(shè)計(jì)配置是本文要解決的問題,多引擎是基于多線程并發(fā)思路來提升服務(wù)軟件架構(gòu)的性能,但處理線程或引擎?zhèn)€數(shù)并不是越多越好[11]。 在系統(tǒng)資源有限的情況下,需要在服務(wù)軟件的多引擎性處理性能和系統(tǒng)硬件配置能之間把握平衡,線程過多反而會(huì)影響軟件本身的性能。
考慮到系統(tǒng)資源的有限性,為更加合理分配系統(tǒng)資源,滿足安全應(yīng)用系統(tǒng)響應(yīng)需求,需要對(duì)應(yīng)用系統(tǒng)的調(diào)用性能進(jìn)行評(píng)估,本文重點(diǎn)關(guān)注應(yīng)用系統(tǒng)的關(guān)鍵的業(yè)務(wù)處理流程,通常這些調(diào)用頻繁的業(yè)務(wù)處理流程,是評(píng)估應(yīng)用系統(tǒng)業(yè)務(wù)處理的性能的關(guān)鍵。 通過模擬應(yīng)用系統(tǒng)關(guān)鍵業(yè)務(wù)流程的高并發(fā)調(diào)用業(yè)務(wù)場(chǎng)景,評(píng)估出對(duì)密碼服務(wù)軟件的處理引擎配置數(shù)。 例如網(wǎng)關(guān)密碼設(shè)備內(nèi)部關(guān)鍵的密碼業(yè)務(wù)為認(rèn)證協(xié)商,認(rèn)證協(xié)商流程的性能是應(yīng)用系統(tǒng)用戶認(rèn)證接入響應(yīng)指標(biāo),我們可針對(duì)認(rèn)證協(xié)商流程進(jìn)行多線程并發(fā)調(diào)用進(jìn)行密碼服務(wù)軟件的性能調(diào)優(yōu),即評(píng)估出密碼服務(wù)軟件的合理配置引擎?zhèn)€數(shù)。
研究表明,密碼服務(wù)軟件的處理引擎?zhèn)€數(shù)的配置對(duì)性能處理有明顯的提升,如圖7 所示,通過配置密碼服務(wù)軟件的處理引擎?zhèn)€數(shù)來實(shí)現(xiàn)性能的可擴(kuò)展性,從而更好地滿足應(yīng)用系統(tǒng)的性能需求。
本文實(shí)驗(yàn)測(cè)試使用本地Socket 編程實(shí)現(xiàn)應(yīng)用接口與密碼服務(wù)之間的通信,密碼算法使用開源OpenSSL 庫實(shí)現(xiàn),使用Boost C++標(biāo)準(zhǔn)庫中的無鎖隊(duì)列方案,是一種基于原子操作的無鎖隊(duì)列(Lock-free),基于多引擎并行處理機(jī)制實(shí)現(xiàn)了多引擎并發(fā)的密碼服務(wù)軟件。 通過實(shí)驗(yàn)對(duì)比,較單引擎處理架構(gòu)的密碼服務(wù)軟件的數(shù)據(jù)處理性能有大幅度提高。
在終端測(cè)試機(jī)上使用C/C++語言實(shí)現(xiàn)發(fā)包程序和多引擎密碼服務(wù)軟件進(jìn)行數(shù)據(jù)處理性能測(cè)試對(duì)比。 終端測(cè)試機(jī)配置為四核Inter(R)Core(TM) i3-2120 CPU @3.30GHZ 處理器,操作系統(tǒng)為L(zhǎng)inux Ubuntu 14.04,其內(nèi)核版本為L(zhǎng)inux version 3.13.0,使用的編譯器為GCC Version 4.8.4。
發(fā)包程序與多引擎密碼服務(wù)軟件之間使用TCP 網(wǎng)絡(luò)通信方式收發(fā)任務(wù)數(shù)據(jù)包,多引擎密碼服務(wù)軟件可通過配置文件設(shè)置處理引擎?zhèn)€數(shù),算法運(yùn)算通過調(diào)用OpenSSL 開源加密庫實(shí)現(xiàn),發(fā)包軟件執(zhí)行多線程、多通道方式進(jìn)行發(fā)包操作,多引擎密碼服務(wù)軟件分別運(yùn)用無鎖隊(duì)列、多包處理機(jī)制測(cè)試1KB 數(shù)據(jù)AES 加密、SHA256摘要運(yùn)算和64Bytes 數(shù)據(jù)RSA 簽名性能并對(duì)比。
(1) 配置不同引擎?zhèn)€數(shù)條件下,多引擎密碼服務(wù)軟件運(yùn)用無鎖隊(duì)列機(jī)制實(shí)現(xiàn),測(cè)試對(duì)稱加密、摘要運(yùn)算性能并對(duì)比;
(2) 配置不同引擎?zhèn)€數(shù)條件下,多引擎密碼服務(wù)軟件分別運(yùn)用單包處理、多包處理機(jī)制和無鎖隊(duì)列實(shí)現(xiàn),測(cè)試RSA 簽名的性能對(duì)比。
(1) 密碼服務(wù)軟件分別配置1 引擎、2 引擎、4 引擎、8 引擎、10 引擎,測(cè)試對(duì)稱加密和摘要運(yùn)算的性能,測(cè)試明文數(shù)據(jù)長(zhǎng)度為1KB,測(cè)試結(jié)果如圖7 所示。
圖7 不同引擎配置密碼服務(wù)性能
由圖7 可以看出配置不同的引擎?zhèn)€數(shù),處理1KB 數(shù)據(jù)進(jìn)行AES256 對(duì)稱加密和SHA256 運(yùn)算的性能有明顯的提升。 但是并不是配置越多的處理引擎?zhèn)€數(shù)性能就越高,受限于測(cè)試平臺(tái)的硬件配置,因此本文提出可配置處理引擎數(shù)量的思路,更加合理地利用系統(tǒng)資源,使得整體密碼服務(wù)軟件處理能力得到更好體現(xiàn)。
(2) 密碼服務(wù)軟件分別配置1 引擎、2 引擎、4 引擎、8 引擎、10 引擎,測(cè)試RSA 簽名性能,簽名數(shù)據(jù)長(zhǎng)度為64 Bytes,結(jié)果如圖8 所示。
由圖8 中可以看出,密碼服務(wù)軟件進(jìn)行簽名處理性能隨著配置處理引擎的個(gè)數(shù)的增加而提升。 使用無鎖隊(duì)列的性能明顯比使用共享鎖性能高出75%-150%左右,使用共享鎖情況下多包處理機(jī)制明顯比單包處理機(jī)制性能要高。通過有鎖隊(duì)列和無鎖隊(duì)列性能對(duì)比,無鎖隊(duì)列對(duì)于整個(gè)軟件架構(gòu)處理性能的提升效果明顯。
圖8 不同引擎?zhèn)€數(shù)的RSA 簽名性能
本文基于單線程業(yè)務(wù)處理架構(gòu)設(shè)計(jì)提出一種多引擎并行處理機(jī)制軟件架構(gòu),結(jié)合無鎖隊(duì)列技術(shù)實(shí)現(xiàn)了基于多引擎處理、多線程并發(fā)的軟件處理架構(gòu),該架構(gòu)與傳統(tǒng)架構(gòu)性能有較高提升,能夠更好地滿足安全應(yīng)用系統(tǒng)的密碼業(yè)務(wù)性能需求,為安全應(yīng)用系統(tǒng)提供高效的密碼服務(wù),滿足安全應(yīng)用系統(tǒng)對(duì)于多算法,多任務(wù)流交叉情況下密碼服務(wù)請(qǐng)求的快速響應(yīng)。 通過實(shí)驗(yàn)測(cè)試該密碼服務(wù)的軟件架構(gòu)的可行性,并給出了一個(gè)可配置性能的多引擎高并行的密碼服務(wù)軟件架構(gòu)設(shè)計(jì),如何更加合理智能化配置處理引擎?zhèn)€數(shù)是本課題下一階段要研究的問題。