繁体   English   中英

如何在Servlet中改善org.apache.commons.io.FileUtils copyInputStreamToFile

[英]How to improve org.apache.commons.io.FileUtils copyInputStreamToFile in Servlet

我正在使用一个servlet,它确实会收到HTTP POST多部分消息中的附件。 这些文件必须存储到已挂载的文件系统中。 一切都很好,只是性能不是我在文件系统上运行的IO测试所期望的。

在我的机器上,我有2个文件系统,一个本地文件系统FSA和另一个主机上托管的CIFS文件系统FSB。 上线时必须使用FSB,FSA用于比较FSB的性能。 当我使用以下命令测试文件系统的吞吐量和延迟时;

吞吐量dd if=/dev/zero of=$FS/test.img bs=1G count=1 oflag=dsync延迟dd if=/dev/zero of=$FS/test.img bs=512 count=1000 oflag=dsync

我确实得到以下读数;

  • FSA吞吐量844MB / s,延迟590MB / s
  • FSB吞吐量50,4MB / s,延迟116KB / s

要将文件保存到磁盘,请使用org.apache.commons.io.FileUtils中的copInputStreamToFile方法。 无法使用JDK7和更高版本,因此java.nio是不可选择的。

// Register starttime of FileIO
startTime = System.currentTimeMillis();

// Fastest way to write stream to file
FileUtils.copyInputStreamToFile(formFieldStream, newFile);
LOG.info(String.format("[Session: %s] [Operation: maakaan io] [File: %s] [%s ms]",
    sessionID, fileNaam,
    (System.currentTimeMillis() - startTime)));

使用此servlet将110MB文件保存到FSA时,大约需要10秒,而FSB则需要大约13秒。 因此,选择的文件系统会有所不同,但写入速度的差异并不对应于测得的吞吐量差异。 当使用指定的文件系统FSB时,与直接使用dd直接写入文件相比,从Java代码写入文件的速度大约要慢10MB / s。 由于我在测试中使用的是大文件,因此我选择使用测量的文件系统吞吐量。

是否有任何选择可以提高此Servlet的写入速度,或者如何确定是什么原因导致了“缓慢”

干杯,彼得

==更新1 ==

在FileUtils.copyInputStreamToFile和org.apache.commons.fileupload的实现中似乎有4K的缓冲区。 在进行飞行记录(JRockit)分析时,我也可以看到这一点。 我已经能够增加写缓冲区。 现在工作,看看我是否可以解决fileUploader中的缓冲区。

使用虚拟源在文件系统上运行的I / O测试无关紧要。 这里的限制因素是网络,它比文件系统,CPU,Java或IOUtils

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM