Linux

為什麼磁碟讀取比使用創建許多小文件的簡單 Java 應用程序寫入更重?

  • March 16, 2013

我有一個非常簡單的 java 7 應用程序,它從磁碟上的專有文件格式(Hadoop 序列文件)讀取並在磁碟上xvdb創建數百萬個 2-20kb 文件xvdf

 ByteBuffer byteBuffer = ByteBuffer.wrap(imageBinary, 0, ((BytesWritable)value).getLength());
 File imageFile = new File(filePath);
 FileOutputStream fos = new FileOutputStream( imageFile );
 fos.getChannel().write(byteBuffer);
 fos.close();

執行iostat -d 30表明,我們在磁碟上的讀取次數超過了寫入次數。除了上面的應用程序僅寫入此磁碟之外,此卷上沒有其他活動。

 Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
 xvdap1            0.40         0.00         3.07          0         92
 xvdb             19.90       828.67         0.00      24860          0
 xvdap3            0.00         0.00         0.00          0          0
 xvdf            988.93      3538.93      1385.47     106168      41564

掛載選項:

 /dev/xvdf on /mnt/ebs1 type ext4 (rw,noatime,nodiratime)

創建文件需要首先確定該文件是否已經存在。由於這些文件非常小,讀取元數據以確定文件的創建方式和位置超過了創建文件後所做的微小寫入。

如果您熟悉資料結構,則可以將一個微小的葉節點添加到二叉樹、B 樹或類似結構中。您將進行大量閱讀以確定葉節點的去向,它是否已經在樹中,等等。這將遠遠大於葉節點中的少量數據。

引用自:https://serverfault.com/questions/488360