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