金 鑫, 朱默寧
(1.光大富尊投資有限公司 信息技術部,上海 200040; 2.合肥工業大學 管理學院,安徽 合肥 230009)
?
一種流量動態可控的異步日志系統設計
金 鑫1, 朱默寧2
(1.光大富尊投資有限公司 信息技術部,上海 200040; 2.合肥工業大學 管理學院,安徽 合肥 230009)
在關鍵實時系統的設計中,日志子系統作為一個基礎監控模塊有著重要的作用。然而,當監控事件大規模突發時,日志數據的監控與記錄反而會對系統性能造成顯著影響,嚴重時甚至會阻塞主程序的邏輯。針對該問題,文章設計并實現了一種既可以保證應用系統的平穩運行,又可以有效地滿足監控數據采集的日志系統,通過介紹異步機制和流量控制設計,闡明了解決上述問題的基本方案,并對該系統相關參數的選擇進行了理論分析。實驗結果證明了該日志系統在提供強大而靈活的日志功能情況下,可以有效地保證系統主程序的平穩運行。
日志系統;實時監控;異步記錄;流量控制
日志是程序運行過程中產生的數據,主要反映了用戶與計算機系統交互過程中產生的行為數據。日志系統主要用于監控程序的運行情況和用戶的行為,并可實時監控并記錄系統發生錯誤的現場數據等信息,日志系統的主要功能有:幫助開發人員和運維人員更好地了解系統狀態,審計操作流程或排查系統錯誤等。此外,對于面向大量客戶的業務應用程序,還可以通過分析日志數據了解客戶的行為偏好。有數據顯示,在一個系統的總代碼量中,進行日志輸出的代碼量占4%以上[1]。因此,在大型系統特別是關鍵實時系統的開發和運維中,良好的日志系統設計具有重要的意義。
目前業界主流的日志庫系統在設計上主要有以下2個問題:
(1) 日志輸出會阻塞主線程執行。因為部分日志庫簡單采用單線程設計,系統的應用進程在進行日志輸出時會阻塞主邏輯運行,需要等待輸入/輸出(input/output,IO)操作完成后才能繼續后續代碼的執行,所以對于關鍵實時系統來說,這種設計對于業務響應會造成影響。
(2) 大量突發數據會影響系統整體性能。在大量監控事件突發并需要寫日志數據時,日志模塊會集中產生磁盤沖擊。此時文件IO成為系統瓶頸,從而顯著降低了生產環境系統的整體性能,并對實時程序的運行產生性能影響。
基于上述分析,本文提出了一種流量動態可控的異步日志系統,該系統的設計目標如下:
(1) 具備異步日志輸出機制,保證日志工作邏輯不會阻塞業務應用進程。
(2) 具備流量控制機制,保證突發大量日志請求時,頻繁IO的性能損耗不會超過一定閾值。
一直以來,業界的普遍共識是日志管理在軟件開發和系統的運行過程中是一個非常重要的部分,日志模塊對于系統的實時監控起著非常重要的作用[1];近些年來,為提高日志系統的數據吞吐量與效率,很多學者開展了有益的研究。文獻[2]對傳統的同步日志記錄方式進行了改進,設計并實現了一種異步記錄告警日志的入侵防御系統,應用多核技術進行并行處理,使數據的吞吐量提高了3倍多;文獻[3]為解決安全管理平臺中海量日志查詢效率低下的問題,設計了基于云計算的安全管理平臺日志存儲分析系統,與基于關系數據的多表關聯查詢方法相比,基于云計算的日志存儲分析系統使安全管理平臺日志的平均查詢效率提高了約90%,并能加快平臺集中管控的整體響應速度;文獻[4]根據系統的架構和設計需求通過實時分布式多源異構數據的收集,實現了大規模分布式實時日志數據的海量存儲與查詢;文獻[5]引入一種多并行的入侵檢測體系結構對系統日志進行實時監控;文獻[6]基于現有的日志數據和信息系統,開發了一種適用于離線和在線信息消費的監控系統;文獻[7]通過使用卡爾曼濾波方法預測工作量,使系統性能提升了63.1%。
當今主流的日志系統或多或少地借鑒了Log4j庫的設計理念。Log4j實現了一個基于Java的日志記錄工具框架[8],其最初由Ceki設計開發,現在已經成為Apache的一個開源項目。Log4j定義了3個重要概念,分別是Logger、Appender和Layout,通過這3個組件協同的工作,Log4j為日志行為控制提供了極大的靈活性。此外,通過預定義的日志等級和日志過濾器,用戶可以自由地選擇需要記錄的內容。值得一提的是,Log4j提供了異步日志功能,從而達到了避免阻塞主程序的目標。
2.1 異步機制
本文提出的日志異步輸出機制如下:基于平臺線程接口,日志系統在初始化后首先啟動一個單獨的監控數據日志處理線程loggerThread負責日志數據的實際輸出。業務主線程每次捕捉到需要記錄日志的監控數據后,便調用日志輸出接口,進行數據采集。在接口內部,實際上是把日志監控數據寫入內存中的一個日志數據輸出請求隊列,并沒有產生實際的IO操作;該輸出接口完成入隊列操作后,則立即返回并讓業務主線程繼續執行。
另一方面,loggerThread啟動后便不停輪詢日志請求隊列,一旦發現有新的記錄時就執行真正的日志輸出動作,直到將隊列中的請求處理完畢。loggerThread所做的工作可能是簡單的磁盤文件寫入,也可能是復雜的通過syslog接口傳輸數據至網絡日志服務器,但是這些IO操作的延遲不會阻塞業務邏輯的執行。異步機制的工作原理如圖1所示。
用戶在初始化日志系統前,需要定義異步日志隊列的長度參數logQueueLen。

圖1 監控數據異步日志系統
2.2 流量控制
異步日志機制雖然避免了日志庫阻塞主程序的問題,但是在數據突發增長的場景下,大量IO操作對系統整體性能的沖擊仍然是需要解決的問題。在這種場景下,降低日志性能損耗的方法就是在日志請求超過一定閾值后,開啟日志流速控制。
本文設計的日志系統的流量控制機制如下:用戶設定3個參數,分別是流量控制檢測周期(rateCtlInterval)、日志請求數量閾值(rateControlCount)和流量控制執行周期(rateControlDuration)。算法首先在流量控制檢測周期內計算到達隊列的日志請求數目,一旦該請求數量達到日志請求數閾值則立即開啟流量控制,一直持續到流量控制執行周期結束。因此,動態流量控制的一個總周期可以劃分為2個階段:流量控制檢測階段Td和流量控制執行階段Te,如圖2所示。

圖2 流量控制的周期劃分圖
圖2中,m為檢測階段的數據輸出請求數閾值。此外,如果流量控制檢測周期設為0,表示始終不執行流量控制;如果數據輸出請求數閾值設為0,表示始終執行流量控制機制。
在流量控制執行周期中,日志系統通過Hash Table進行相同日志記錄的合并來實現流量控制的目標:對于未出現過的日志類型,系統在Hash Table里面增加一條;否則只增加相同記錄類型的計數。以錯誤報警日志為例,在大量錯誤突發時,日志庫以錯誤號為Key寫入每條錯誤日志,對于相同類型的錯誤只增加錯誤發生次數。流量控制時間段結束后,loggerThread會將Hash Table里面的記錄進行輸出,并開啟下一輪的流量控制檢測周期。流量控制機制在錯誤日志中的應用如圖3所示。

圖3 流量控制合并機制
圖3中,流量控制檢測周期為3 s,請求數閾值為100,流量控制執行周期為7 s。
數據輸出請求隊列是應用線程和日志數據處理線程之間數據緩存的橋梁。異步機制要求日志系統初始化時定義隊列長度logQueueLen用于創建隊列。雖然內存隊列可以臨時動態分配,但是頻繁的數組擴容會增加數據挪動開銷,而且一旦分配失敗會影響整個系統的業務運行,因此需要基于業務系統的應用場景計算出隊列長度的基準值。

(1)
設第i-1秒后的隊列長度為Li-1,那么第i秒后的隊列長度如下:
(2)
因為隊列長度不可以為負數,所以在服務速度大于數據到達速度的場景下,隊列最小為0。
假設1 d的業務時段總長為t,那么在DT-1的所有時段內隊列長度出現過的最大值便可以作為未來隊列長度的基準值Lq:
(3)
其中,α為調和系數,即對歷史數據中最壞情況下的隊列長度再進行一定系數的放大;c為某個正整數常量,用于保證長度的最小值(歷史數據為0的情況),其選取值可以是任意1 s的非零事件數ei(ei>0)。
例如,假設DT-1的業務時間為5 s,日志系統每秒平均完成2條輸出數據的寫請求,α選取1.8,c選取1,那么對于如下事件發生率ei,可以采用(3)式計算長度基準值,見表1所列。即
此外,為了使計算結果更具代表性,可以對n天的歷史數據DT-1~DT-n分別進行統計并計算Lq,再最終選取其中的最大值作為異步隊列長度基準值。

表1 隊列長度的基準值
通過2組實驗證明上述的研究成果。首先,對日志系統的性能進行如下測試:比較Log4c[10]、Log4j[10]和本文提出的異步式日志機制的響應時間。實驗中執行的一個單元任務為進行N條運算操作并將每條運算結果計入日志,其中本文關注的性能指標是任務的響應時間,即同樣進行一個單元任務,在使用同步和異步2種方式下,從任務開始到任務結束總共消耗的時間。通過在[5 000,100 000]之間逐漸遞增N的數目,實驗結果如圖4所示。

圖4 業務響應時間比較
從實驗結果可以看到,Log4c的響應時間最長,因為其完全沒有異步日志功能,所以日志操作產生了大量的響應延遲,響應時間隨著需要記錄的日志條目的增多而迅速爬升。而Log4j因為具有部分異步設計,所以性能有所提升,但響應時間的增長仍然明顯。而本文提出的日志系統不僅設計了異步機制,而且避免了隊列動態分配,因此,響應時間最短。經過對比可以證明本文所提出的日志系統的性能明顯優于Log4c和Log4j系統。
其次,對日志系統的流量控制機制進行如下測試:比較在開啟流量控制的場景下,Log4c[10]、Log4j[10]和本系統的IO性能比,即通過輸出的日志條數比較IO的性能。實驗共20輪,每輪運行20 s;日志事件為系統錯誤,每秒產生5 000個錯誤(即每秒記錄5 000條),產生的錯誤號在范圍R內隨機生成,R的取值范圍隨著輪數的增長在[8,28]之間逐級遞增;流量控制檢測周期選擇3 s,日志請求數閾值選擇10 000條,流量控制執行周期選取5 s,其中流量控制執行階段對于相同的錯誤號類型進行日志合并。實驗結果如圖5所示。

圖5 流量控制輸出的數據量
通過對實驗結果的分析可以看出:
(1) 本文提出的日志系統的日志輸出數量呈線性增長,這與理論估算的結果相契合。首先,因為流量控制檢測周期為3 s,日志數閾值為10 000,所以第3秒會開始流量控制持續5 s,即在20 s內會進行3次流量控制;其次,每次流量控制會記錄10 000+R條記錄,因為流量控制執行階段會進行日志合并,而合并的標準是相同錯誤類型號,所以在流量控制的5 s內會最多記錄R條記錄;最后,每輪20 s后會記錄30 000+3R條記錄。例如當R=10時,實驗結果是30 030;當R=28時,實驗結果為30 084。
(2) Log4c和Log4j由于未采用流量控制機制,每輪均需記錄100 000條左右的記錄,大量的突發消息可能會導致部分數據在日志IO中丟失,如果其中有重要的日志數據則會影響最終的日志效果。而本文提出的日志系統只對重復出現的日志數據類型進行合并,兼顧了整體性能和數據質量,實驗證明流量控制機制對IO性能提高了3倍以上。
本文介紹了一種對流量進行動態實時監控的異步日志系統的設計原理,從理論上解釋了該日志系統可以達到本文提出的設計目標,并能有效解決現有日志系統存在的缺陷和問題。此外,本文還對系統關鍵參數的選取策略進行了分析,指導用戶基于業務場景的實際情況進行調優。最后,本文通過實驗進一步展示了該日志系統的性能指標,證明了該日志系統可以良好地滿足關鍵實時系統的需求。未來將嘗試擴展系統的多目標輸出方式,如集成Syslog輸出[11];另外,通過利用共享內存機制[12]進一步提高日志系統的輸出性能。
[1] 史志英,徐義晗.一種基于Log4J的日志輸出組件的設計[J].信息技術與信息化,2008(1):65-67.
[2] 艾磊,陳文.一種異步日志記錄的入侵防御系統的設計與實現[J].計算機安全,2014(3):2-6.
[3] 陳潔,于永剛,劉明恒,等.安全管理平臺中基于云計算的日志分析系統設計[J].計算機工程,2015,41(2):21-25.
[4] 曾明宇.一種基于Storm和Mongodb的分布式實時日志數據存儲與處理系統的設計與實現及應用[D].杭州:浙江大學,2015.
[5] VASILIADIS G,POLYCHRONAKS M,IOANNLDIS S.MIDeA:a multi-parallel intrusion detection architecture.[C]//Proceeding of the 18th ACM Conference on Computer and Communications Security.New York:ACM,2011:297-308.
[6] KREPS J,NARKHEDE N,RAO J.Kafka:A distributed messaging system for log processing [C]//Proceedings of the NetDB'11.[S.l.:s.n.],2012:129-140.
[7] ZHANG F,CAO J W,KHAN S U,et al.A task-level adaptive MapReduce framework for real-time streaming data in healthcare applications[J].Future Generation Computer Systems,2015,43/44:149-160.
[8] GULCU C.Log4j[EB/OL].[2016-2-26].http://logging.apache.org/log4j/2.x/.
[9] 唐應輝.排隊論[M].北京:科學出版社,2006:12-28.
[10] CHUVAKIN A A,SCHMIDT K J,PHILLIPS C.Logging & Log Management:the authoritative guide to understanding the concepts surrounding logging and log management[M].US:Pubilisher Syngress Media,2013:329-342.
[11] 何世俊.基于Syslog的網絡信息日志管理系統[D].上海:華東理工大學,2012.
[12] 連仁包,王衛星.基于共享內存的松耦合日志系統研究和設計[J].計算機應用與軟件,2013,30(6):8-11,15.
(責任編輯 張 镅)
A design of asynchronization logging system with dynamic flow control
JIN Xin1, ZHU Moning2
(1.Department of Information Technology, Everbright Fortune Investment Co., Ltd., Shanghai 200040, China; 2.School of Management, Hefei University of Technology, Hefei 230009, China)
As a fundamental monitoring module, logging subsystem plays an important role in the design of real-time critical systems. However, in cases when enormous monitoring events happen suddenly, the logging data monitoring and recording affects the performance of the whole system dramatically, and it may even block the logic running of the main process. To solve this problem, a logging system is designed and realized, which not only guarantees the steady running of the main process, but also effectively satisfies the requirements of events monitoring and logging. Firstly, the design of asynchronization mechanism and flow control is introduced, demonstrating the general solution of the problem above. Then a theoretical analysis of system parameters for optimization is conducted. The experimental results show that this design can provide powerful and flexible logging functionality without affecting the performance of the whole system.
logging system; real-time monitoring; asynchronization logging; flow control
2016-07-25;
2016-09-20
國家自然科學基金資助項目(71401048);安徽省自然科學基金資助項目(1508085MG140)
金 鑫(1981-),男,安徽含山人,博士,光大富尊投資有限公司工程師.
10.3969/j.issn.1003-5060.2016.11.011
TP315
A
1003-5060(2016)11-1493-05