金 鑫, 朱默宁
(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