dje*_*lin 4 java file-io logging multithreading blocking
我的线程已落后于计划,并且线程转储显示它们都被阻止IO写入日志输出到硬盘.我的快速修复只是为了减少日志记录,这对于我的QA要求很容易.当然,这不是垂直可扩展的,这很快就会成为一个问题.
我想只是增加线程数,但我猜测瓶颈是文件争用,如果这是错误的做法,这可能会相当糟糕.
我有很多想法,但真的不知道哪些是富有成效的.
所以我的问题是:如何分析以确定可以安全地写入公共文件的正确线程数?什么变量决定了这一点 - 写操作的数量,每秒写入的字节数,每个写请求的字节数,任何操作系统或硬盘信息.
还有什么方法可以使日志文件更自由地写入?我们给所有东西加时间戳,所以如果减少阻塞,我可以使用少数无序线.
我的线程已落后于计划,并且线程转储显示它们都被阻止IO写入日志输出到硬盘.
通常,在这种情况下,我安排一个线程只是用于记录.大多数日志记录类(例如PrintStream)都是同步的,并且写入/刷新每行输出.通过转移到中央日志记录线程并使用某种方式BlockingQueue排队要写入的日志消息,您可以使用一个BufferedWriter或多个来限制各个IO请求.默认缓冲区大小为8k,但您应该增加该大小.您需要确保在应用程序关闭时正确关闭流.
使用缓冲编写器GZIPOutputStream,如果日志消息重复很多,您还可以通过写入来显着降低IO要求.
也就是说,如果输出的调试信息过多,则可能是SOL,需要降低日志记录带宽或提高磁盘IO速度.一旦优化了应用程序,接下来的步骤包括迁移到日志服务器上的SSD以处理负载.您还可以尝试将日志消息分发到多个服务器以保留,但本地SSD很可能会更快.
为了模拟SSD的优势,本地RAM磁盘可以让您对增加的IO带宽有一个很好的了解.
我想增加线程数,但我猜他们是瓶颈所以这不会做任何事情.它是否正确?
如果所有线程都在IO中被阻止,那么是的,增加线程数将无济于事.
如何分析要写入磁盘的正确线程数?
棘手的问题.你将不得不做一些测试运行.使用10个线程查看应用程序的吞吐量,使用20等.您正在尝试最大化在一段时间内处理的整体事务.确保您的测试运行执行几分钟以获得最佳结果.但是,重要的是要意识到,如果单个线程喷出太多输出,则可以轻松地淹没磁盘或网络IO流.
我可以切换较低级别的设置(文件系统,操作系统等)以减少对文件的锁定,以换取无序线路吗?在我的Java应用程序或更低级别?
不.请参阅上面的我的缓冲线程编写器.这不是关于文件锁定(我假设)没有发生.这是关于IO请求/秒的数量.
我可以分析我的系统或硬盘,以确保它不会以某种方式过度工作?(含糊不清,但我不在这里).
如果你是IO绑定,那么IO正在减慢你的速度,因此它"过度工作".转移到SSD或RAM磁盘是一个简单的测试,以查看您的应用程序是否运行得更快.
| 归档时间: |
|
| 查看次数: |
551 次 |
| 最近记录: |