论坛首页 Java企业应用论坛

log4j 数据写入性能测试(同步、异步)

浏览 13710 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-02-02  

   某个项目需要,做了下简单的log4j的测试。

log4j写入数据文件一般有如下几个方式

1、直接写文件方式,ImmediateFlush=true,每条log直接写入磁盘

2、同步缓存方式,bufferedIO=true,使用一个char[],做缓存,默认8k,每次写满这个缓存,然后flush到磁盘。

3、异步缓存方式,appender换成AsyncAppender即可,默认的缓存是128条记录,使用一个ArrayList来模拟的BlockingQueue,可以设置队列满了是等待还是直接丢弃该数据。额外的启动一个check的线程,从list中获取数据并写入文件。

  

 

 

log4j 数据写入性能测试

1.   测试环境:

 

项目

CPU

内存

操作系统

JDK

数据

Intel core i3 2.26GHz  4

2G

Windows XP SP3

Sun JDK 1.5.0_12

 

Java单线程写文件测试,每次flush 5K数据,硬盘写入速度约65M/s

2.   测试场景1bufferedIO

2.1、 log4j配置

参数

数值

FileAppender

org.apache.log4j.FileAppender

Append

true

BufferSize

8192

ImmediateFlush

false

BufferedIO

true

 

2.2、 测试数据

指标

每行记录 100字节

每行记录 1K字节

每行记录 3K字节

记录数KL/s

吞吐量M/s

记录数KL/s

吞吐量M/s

记录数KL/s

吞吐量M/s

线程

1

100

10

44

44

19

57

2

150

15

48

48

19

58

4

170

17

47

47

16

49

10

160

16

46

46

17

51

 

性能比较稳定,log每条记录比较小时,性能不佳,记录为3K时,比较接近直接写硬盘的速度了。

 

3.   测试场景2Async

3.1        log4j配置

参数

数值

FileAppender

org.apache.log4j.AsyncAppender

Append

true

BufferSize

8192

ImmediateFlush

false

BufferedIO

true

 

3.2        测试数据

指标

每行记录 100字节

每行记录 1K字节

每行记录 3K字节

记录数KL/s

吞吐量M/s

记录数KL/s

吞吐量M/s

记录数KL/s

吞吐量M/s

线程

1

100

10

46

46

19

58

2

170

17

43

43

18

55

4

170

17

41

41

17

54

10

160

16

41

41

17

51

 

异步写log1K3K)性能不太稳定,可能某些时候突然下降20%的写入速度。

 

4.   总结

根据上面的测试场景和测试数据,基本可以得出如下结论:

1.     每次记录数据太小,性能不佳。3K大小的数据性能比较好。

2.     多线程对整体的性能影响不大,2-4线程比较合适。

3.     异步写入对直接写本地文件的场景没有性能提高。

4.     直接本地数据写入方式、每条记录数据在1K以上时,异步方式可能有性能波动。

 

 

 

   发表时间:2011-02-03  
这个还真没测试过 感谢lz分享。。。
0 请登录后投票
   发表时间:2011-02-04  
楼主这个测试仅仅在测试IO性能而已,无论异步和同步对于IO性能其实不会有什么影响,因为那直接取决于磁盘以及Java的API性能。另一方面,这样的测试无论测多少遍异步Appender基本上都是必输无疑的,因为异步Appender存在线程上下文切换过程而直接Appender不存在这个消耗。
其实,异步的最大好处不是写日志更快,而是“响应”的更快,也就是从开始调用log.xxx("")到这个函数调用结束的速度变快。原因我想你应该很清楚。
楼主可以试试另一个场景
startTime;
for(i in 1..1000000)
log("xxx"+i);
println current-startTime;
看看谁跑得快。
0 请登录后投票
   发表时间:2011-02-04  
云中苍月 写道
楼主这个测试仅仅在测试IO性能而已,无论异步和同步对于IO性能其实不会有什么影响,因为那直接取决于磁盘以及Java的API性能。另一方面,这样的测试无论测多少遍异步Appender基本上都是必输无疑的,因为异步Appender存在线程上下文切换过程而直接Appender不存在这个消耗。
其实,异步的最大好处不是写日志更快,而是“响应”的更快,也就是从开始调用log.xxx("")到这个函数调用结束的速度变快。原因我想你应该很清楚。
楼主可以试试另一个场景
startTime;
for(i in 1..1000000)
log("xxx"+i);
println current-startTime;
看看谁跑得快。

不都一样,lz的场景也测了这个。
测试的每条数据量一样的,单位时间内写的多的那个,不就跑的快。

and 你给的这个例子 每条数据量太小。
估计:
1、都不快
2、差不多
0 请登录后投票
   发表时间:2011-02-06  
楼主在教大家怎么用log4j以降低对应用的性能影响。 有些人总是从表面看事情。
0 请登录后投票
   发表时间:2011-02-10   最后修改:2011-02-10
引用
异步写入对直接写本地文件的场景没有性能提高。


这个是什么原因,直觉上应该异步的要好一些。。。。
0 请登录后投票
   发表时间:2011-04-19  
cjnetwork 写道
引用
异步写入对直接写本地文件的场景没有性能提高。


这个是什么原因,直觉上应该异步的要好一些。。。。

异步对于socket或jdbc这种比较耗时的数据落地方式,性能要好一些。
因为它的异步缓冲使得前后解耦,曲线更平滑。

对于本地文件落地,本来就很快,异步无疑是响应更慢。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics