Log4j的AsyncAppender能否提升性能?
来源:互联网 发布:快手说话配音软件 编辑:程序博客网 时间:2024/05/16 09:48
由此可见AsyncAppender虽然是异步的,但是并不能提升性能,为什么呢?何谓异步?异步就是另外开了个线程用来专门记录日志,然而既然引入了多线程,线程间的同步开销就不能不考虑了,看AsyncAppender的源代码中到处充斥着synchronized就能看到了。
用独立线程处理日志会引入以下几个问题:
- 中断(如果一个阻塞在日志操作的线程被中断,还出现什么情况?)
- 服务担保(logger能保证成功加入队列的消息都能在服务终止前被记录么?)
- 饥饿策略(当生产者记录消息比logger线程的处理能力更快的时候会如何?)
- 服务的生命周期(如何关闭logger,如何就服务的状态与生产者进行沟通?)
由此的需要讨论就是,为什么要使用异步?何时使用异步?如何使用异步?我们先来看同步和异步到底有何不同:
同步情况
各线程直接获得输出流进行输出(线程间不需要同步)。
异步情况
- 各线程将日志写到缓存,继续执行下面的任务(这里是异步的)
- 日志线程发现需要记日志时独占缓存(与此同时各线程等待,此时各线程是被阻塞住的),从缓存中取出日志信息,获得输出流进行输出,将缓存解锁(各线程收到提醒,可以接着写日志了)
众所周知,磁盘IO操作、网络IO操作、JDBC操作等都是非常耗时的,日志输出的主要性能瓶颈也就是在写文件、写网络、写JDBC的时候。日志是肯定要记的,而要采用异步方式记,也就只有将这些耗时操作从主线程当中分离出去才能真正的实现性能提升,也只有在线程间同步开销小于耗时操作时使用异步方式才真正有效!现在我们接着分别来看看这几种记录日志的方式。
将日志记录到本地文件
同样都是写本地文件Log4j本身有一个buffer处理入库,采用异步方式并不一定能提高性能(主要是如何配置好缓存大小);而线程间的同步开销则是非常大的!因此在使用本地文件记录日志时不建议使用异步方式。
将日志记录到JMS
JMS本身是支持异步消息的,如果不考虑JMS消息创建的开销,也不建议使用异步方式。
将日子记录到SOCKET
将日志通过Socket发送,纯网络IO操作不需要反馈,因此也不会耗时
将日志记录到数据库
众所周知JDBC是几种方式中最耗时的:网络、磁盘、数据库事务,都使JDBC操作异常的耗时,在这里采用异步方式入库倒是一个不错的选择。
将日志记录到SMTP
同JDBC
性能测试
在同步和异步方式下,同时起1000个线程,分别测试记录到文件和数据库中的时间消耗,每类测试连测5遍避免误差。
测试环境
1、WINDOWS XP SP2、JDK 1.5、ORACLE 9i2(本地)、log4j-1.2.14.jar
2、MutiTest.java用来测试同步方式,读取配置文件:log4j.properties
MutiTestAsyncAppender.java用来测试异步方式,读取配置文件:log4j.xml
3、每次测试先删除日志文件或清空表,确保测试独立性
测试结果如下:
FileAppender同步方式最晚线程执行时间最早线程执行时间消耗时间11.23209E+121.23209E+12156 21.23209E+121.23209E+12172 31.23209E+121.23209E+12172 41.23209E+121.23209E+12188 51.23209E+121.23209E+12157 异步方式最晚线程执行时间最早线程执行时间消耗时间11.23209E+121.23209E+12157 21.23209E+121.23209E+12188 31.23209E+121.23209E+12156 41.23209E+121.23209E+12187 51.23209E+121.23209E+12172 JDBCAppender同步方式最晚线程执行时间最早线程执行时间消耗时间11.23209E+121.23209E+12281 21.23209E+121.23209E+12172 31.23209E+121.23209E+12172 41.2321E+121.2321E+12171 51.2321E+121.2321E+12203 异步方式最晚线程执行时间最早线程执行时间消耗时间11.2321E+121.2321E+1294 21.2321E+121.2321E+1294 31.2321E+121.2321E+1294 41.2321E+121.2321E+1294 51.2321E+121.2321E+12125结论
由以上测试结果可以得出异步方式记录日志并不是什么情况下都能提升性能的,相反由于线程间的同步开销,甚至可能降低性能;只有像在JDBC操作或是SMTP之类的记录耗时比较长的情况下,使用异步入库方式才是个好选择。
- Log4j的AsyncAppender能否提升性能?
- Log4j的AsyncAppender能否提升性能?
- Log4j的AsyncAppender能否提升性能?
- Log4j的AsyncAppender能否提升性能?
- Log4j的AsyncAppender能否提升性能?什么场景用比较好?
- log4j的异步哲学AsyncAppender
- Log4j AsyncAppender 源码
- 品高云能否对传统应用的性能、可靠性、安全性、扩展性等带来提升?
- swap与zRam能否提升游戏性能【转】
- 提升XP的性能
- 提升JSP的性能
- apache2的性能提升
- 提升QEMU的性能
- 集合的性能提升
- 提升vi的性能
- 提升php的性能
- 提升Layout的性能
- 关于log4cplus中AsyncAppender的配置
- win7下db2基本操作
- BUAA Training 2013 #1
- ssh三大框架整合 getHibernateTemplate
- 第13堂课后作业
- 面向对象其实不需要封装
- Log4j的AsyncAppender能否提升性能?
- ORA-01000: 超出打开游标的最大数 问题的分析和解决
- [HttpException (0x80004005): 无法验证数据。]
- C++编程学习50个经典网站 强力推荐
- Daily-C-Study(18):C语言#error预处理
- 在配置文件中编写代码,不能自动提示问题
- 关于创业
- 分级存储策略分析 emc isilon
- 服务器优化