我正在用java开发一个交易应用程序(一次处理百万个数据),它是多线程的。应用程序正在日志文件中记录消息。目前,此日志记录的性能相当低,并且占用大量CPU时间。
我想重新实现它。我谷歌了一下,发现LinkedBlockingQueue是一个选项。因为它的大小是固定的,所以不能使用arrayBlockingQueue。
此外,像log4j这样的框架听起来也是很好的选择,因为它们是线程safe.But我怀疑log4j是否是多线程应用程序的一个好的性能选择。
在我的多线程应用程序中,我应该选择哪种最佳的数据结构/框架来进行日志记录?
发布于 2013-08-28 14:58:19
尝试log4j 2,而不是重新发明轮子...http://www.grobmeier.de/log4j-2-performance-close-to-insane-20072013.html
发布于 2013-08-28 15:16:45
对于高性能日志记录,我使用Java Chronicle (主要是因为它是我写的),它可以以更少的GC方式支持每秒100K - 1M的文本消息。您可以通过用锁包装它来确保它的线程安全。它不像其他记录器那样简单,因为它是较低级别的,但它是我所知的最快的。
如果您使用二进制日志记录,它可以支持每秒超过10M条消息/事件。我正在开发一个Java Chronice2.0,它的速度要快3倍。
无界队列通常是一件坏事。如果绑定队列不是您的选项,那么很可能是设计问题。如果你真的需要一个无界的,Java编年史可能是你唯一的选择,因为没有其他库真正支持以一种性能良好的方式。Log4j 2.0使用了一个有界的环形缓冲区。
发布于 2013-08-28 14:56:21
如果我是你,我会先试试slf4j。这只是一个外观,但您可以使用log4j2作为实现。如果这很慢,那么在此之后尝试JUL和其他日志记录框架将变得非常容易。这只是一个配置和类路径更改。
如果您尝试的每个记录器都很慢,那么您可能需要查看http://zeromq.org/。但我觉得一个伐木者应该没问题。我通常不会听到人们抱怨他们的日志框架减慢了他们的应用程序,除非他们打印出过多的调试语句。
https://stackoverflow.com/questions/18481192
复制相似问题