我正在使用 JMeter 对媒体服务器进行负载测试。我编写了扩展的自定义采样器AbstractJavaSamplerClient
。对于我使用 log4j 的日志记录(只使用了一个 rootCategory appender)。
- 当线程组中的线程数相对较少(少于 800)时 - 一切正常。
- 当线程组中的线程数相对较大(大于 1400)时 - 会发生一些无法解释的日志记录问题。
可以考虑两种情况。在第一种情况下ConsoleAppender
使用,在第二种情况下 - FileAppender
。
在第一种情况下,日志文件突然终止。然而,测试计划成功执行,JMeter 日志(jmeter.log)也正常终止。没有抛出异常。
在第二种情况下,日志文件也被突然终止,但其原因是可以理解的:
log4j:ERROR Failed to flush writer,java.io.IOException: File too large at java.io.FileOutputStream.writeBytes(Native Method) at java.io.FileOutputStream.write(FileOutputStream.java:318) at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221) at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291) at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295) at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141) at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229) at org.apache.log4j.helpers.QuietWriter.flush(QuietWriter.java:59) at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:324) at org.apache.log4j.WriterAppender.append(WriterAppender.java:162) at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251) at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66) at org.apache.log4j.Category.callAppenders(Category.java:206) at org.apache.log4j.Category.forcedLog(Category.java:391) at org.apache.log4j.Category.debug(Category.java:260) at com.nsacdn.common.AbstractHTTPDownloader.downloadChunk(Unknown Source) at com.nsacdn.common.AbstractHTTPDownloader.downloadAllChunks(Unknown Source) at com.nsacdn.hls.HlsDownloader.download(Unknown Source) at com.nsacdn.common.DownloadSampler.runTest(Unknown Source) at org.apache.jmeter.protocol.java.sampler.JavaSampler.sample(JavaSampler.java:191) at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:428) at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:256) at java.lang.Thread.run(Thread.java:722)
但是日志文件的大小非常小 - 不到 10 M。硬盘驱动器上有足够的可用空间。我在 Ubuntu 12.04 x64 上运行测试。中的文件大小/etc/security/limits.conf
没有限制(据我了解,默认情况下,此操作系统中的文件大小没有限制)。
我试图模拟日志记录过程。我编写了一个简单的应用程序,它创建了 2000 个并行线程,这些线程使用相同的 log4j 配置在日志中总共写入了大约 70 M。这个应用程序在目标机器上运行良好。
最后,我将日志文件大小替换FileAppender
为RollingFileAppender
并将限制设置为 2 M。在这种情况下,日志记录过程正确执行。
ConsoleAppender 和 FileAppender 的奇怪行为如何解释?
有什么建议么?