我們在Linux上遇到一個問題,隨着時間的推移,目錄inode變得越來越大,速度越來越慢,因爲創建和刪除了許多文件。例如:Unix目錄inode - 碎片和轉儲目錄內容
% ls -ld foo
drwxr-xr-x 2 webuser webuser 1562624 Oct 26 18:25 foo
% time find foo -type f | wc -l
518
real 0m1.777s
user 0m0.000s
sys 0m0.010s
% cp -R foo foo.tmp
% ls -ld foo.tmp
drwxr-xr-x 2 webuser webuser 45056 Oct 26 18:25 foo.tmp
% time find foo.tmp -type f | wc -l
518
real 0m0.198s
user 0m0.000s
sys 0m0.010s
原始目錄有518個文件,需要1.5 MB來表示,需要1.7秒來遍歷。
重建的目錄具有相同數量的文件,需要45K來表示和.2秒來遍歷。
我想知道會造成這種情況。我的猜測是碎片化 - 一般來說這不應該是Unix文件系統的問題,但在這種情況下,我們使用目錄作爲短期緩存文件,因此不斷創建,重命名和刪除大量小文件。
我也想知道是否有辦法轉儲目錄的文字二進制內容 - 也就是說,讀取目錄就好像它是一個文件 - 這可能會讓我深入瞭解它爲什麼如此之大。無論是閱讀()也沒有從Perl的sysread執行()可以讓我:
swartz> perl -Mautodie -MPOSIX -e 'sysopen(my $fh, "foo", O_RDONLY); my $len = sysread($fh, $buf, 1024);'
Can't sysread($fh, '', '1024'): Is a directory at -e line 1
系統信息:
Linux 2.6.18-128.el5PAE #1 SMP Wed Dec 17 12:02:33 EST 2008 i686 i686 i386 GNU/Linux
謝謝!
喬恩
也許你應該用不同的文件系統進行試驗。嘗試xfs。 – Artelius 2009-10-27 00:24:34
請指定您正在使用的文件系統。 – camh 2009-10-27 03:06:28