Linux

對於某些目錄中的文件,Centos 5.5/ext3 上的 cp 和 cat 慢 10 倍

  • November 20, 2010

我正在使用 GNU 對一些大文件(27 個文件中的 91GB)進行排序sort時,我注意到iostat -dxk 3讀取速度非常慢,介於 5 MB/s 和 10 MB/s 之間,磁碟使用率為 100%。我試過cat large-file > /dev/null了,得到了類似的性能,只是稍微高一點。相同cp large-file /tmp//tmp在單獨的磁碟上。vim如果有幫助的話,我會體驗同樣的體驗,以及我用 Ruby 編寫的腳本讀取文件。寫入速度很好而且很快。

編輯:看起來這些操作只對某個目錄中的文件很慢。對同級目錄(同一磁碟分區)中的其他文件進行相同的操作,最終速度很快,讀取速度超過 90 MBPS。這對我來說毫無意義。這可能是由於這些文件的建構方式造成的嗎?我通過讀取許多其他文件來創建它們,並將每一行寫入一個適當的“桶文件”,具體取決於該行中的第一個字元(所以 az,以及其他文件的單個文件)。所以我幾乎同時在 27 個文件中添加行,一次一個,通過 8 個程序,同時讀取幾千個文件。這是否會導致表示文件的塊的順序出現亂序?因此之後的緩慢順序讀取?

但是,我嘗試使用fio它來測量順序讀取性能,它的時鐘速度為 73 MB/s。同樣值得注意的是,我的老闆在通過 FTP 從同一台機器下載一些文件時獲得了適當的讀取速度。

所以我猜這是某個地方的一些配置問題,但我不知道在哪裡。可能是什麼原因,我該如何解決?

編輯:這台機器在 Citrix Xen 虛擬化下執行。

編輯:iostat -dxkwhile的輸出sort正在將一個大文件載入到其緩衝區中(獲得 cat/cp 的類似輸出):

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.00 1000.00  0.00  6138.61     0.00    12.28    24.66   24.10   0.99  99.41
xvdb1             0.00     0.00 1000.00  0.00  6138.61     0.00    12.28    24.66   24.10   0.99  99.41
xvda              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
xvda1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

編輯:幾個小時後性能進一步下降(處理時磁碟中斷sort)。它幾乎看起來像隨機 IO,但只有一個排序操作正在進行,沒有其他程序執行任何 IO,因此讀取應該是順序的 =/ :

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.00 638.00  0.00  2966.67     0.00     9.30    25.89   40.62   1.57 100.00

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.33     0.00 574.67  0.00  2613.33     0.00     9.10    27.82   47.55   1.74 100.00 

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.00 444.33  0.00  1801.33     0.00     8.11    28.41   65.27   2.25 100.00

您的慢速文件是否高度碎片化?跑去/usr/sbin/filefrag -v*filename*一探究竟。你會得到如下輸出:

Checking big.file
Filesystem type is: ef53
Filesystem cylinder groups is approximately 4272
Blocksize of file big.file is 4096
File size of big.file is 96780584 (23629 blocks)
First block: 88179714
Last block: 88261773
Discontinuity: Block 6 is at 88179742 (was 88179719)
Discontinuity: Block 12233 is at 88192008 (was 88191981)
Discontinuity: Block 17132 is at 88197127 (was 88196911)
Discontinuity: Block 17133 is at 88255271 (was 88197127)
big.file: 5 extents found, perfection would be 1 extent

或者更糟。

您提到系統在虛擬化下執行。此訪問是否使用虛擬磁碟映像文件?

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