我正在研究一个在HTTP POST多部分消息中接收附件的servlet。这些文件必须存储到已安装的文件系统中。 这一切都运行良好,只有性能不是我所期望的基于我在文件系统上运行的IO测试。
在我的机器上,我有2个文件系统,一个本地文件系统FSA和一个托管在另一台主机上的CIFS文件系统FSB。上线时必须使用FSB,FSA用于比较FSB的性能。当我使用以下命令测试文件系统的吞吐量和延迟时间时;
througput 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时,从Java代码写入文件大约10MB / s仍比使用dd直接写入文件慢得多。由于我在测试中使用了大文件,因此我选择使用测量文件系统的througput。
是否有任何选项可以提高此servlet的写入速度或如何确定导致' sluggishnes'
的原因干杯, 彼得
==更新1 ==
在FileUtils.copyInputStreamToFile和org.apache.commons.fileupload的实现中似乎有一个4K的缓冲区。在分析航班记录(JRockit)时我也可以看到这一点。我已经能够增加写缓冲区。现在正在努力查看我是否可以在fileUploader中解决缓冲区。
答案 0 :(得分:0)
使用虚拟源在文件系统上运行的I / O测试
是无关紧要的。这里的限制因素是网络,它比文件系统,CPU或Java或IOUtils
慢几个数量级。