[英]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
我确实得到以下读数;
要将文件保存到磁盘,请使用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.