如何在Servlet

时间:2017-06-15 05:48:21

标签: java performance servlets apache-commons-io

我正在研究一个在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

我得到以下读数;

  • 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时,从Java代码写入文件大约10MB / s仍比使用dd直接写入文件慢得多。由于我在测试中使用了大文件,因此我选择使用测量文件系统的througput。

是否有任何选项可以提高此servlet的写入速度或如何确定导致' sluggishnes'

的原因

干杯, 彼得

==更新1 ==

在FileUtils.copyInputStreamToFile和org.apache.commons.fileupload的实现中似乎有一个4K的缓冲区。在分析航班记录(JRockit)时我也可以看到这一点。我已经能够增加写缓冲区。现在正在努力查看我是否可以在fileUploader中解决缓冲区。

1 个答案:

答案 0 :(得分:0)

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