【linux內核】【EXT4文件系統】linux目錄下小文件太多,ls命令非常慢的原因


 

參考鏈接:

https://blog.csdn.net/TSZ0000/article/details/87188128

 

在linux文件系統ext4中,如果一個目錄下面文件數量太多(上W個),則在執行ls命令的時候,會非常慢, 原因有3點

原因1:

linux的ext4文件系統設計上,inode和文件名字是分離的, 即一個文件的文件名字是保存在父目錄的數據塊中

而,父目錄的data block中存放的是  ext4_dir_entry_2  這個結構體的數組

 

其中  name 就是文件名, inode就是這個文件的inode

 

所以,如果目錄里面文件數量太多,就是導致這個目錄的 data block 非常大, 查找文件,則是通過遍歷name的方式進行,所以就導致效率很慢

雖然ext4增加了hash方式,但是只是針對當文件數量超過 一個 data block 時才有效,其目的主要是為了避免 按照name 把所有的data block都遍歷一遍,  把遍歷范圍限制在一個data block內

 

原因2:

ls 命令通常情況下是需要 對name進行排序, 因此需要把所有的 文件信息都拿到內存中之后,再進行排序

因此會占用比較大的內存,並且速度會非常慢

 

所以這也是,為啥 執行 ls  -1  -f  命令的時候, 速度要快很多, 內存占用也非常小的原因

-f  表示 不排序

-1  表示一行只輸出一個文件名字

 

 

原因3:

文件的名字是存放在 父目錄的 data block中

而文件的狀態  atime,ctime, mtime, owner,group, perm, size等信息,都是存放在文件的inode中

因此,在遍歷父目錄的data block的時候, 也需要訪問文件自身的inode信息

由於文件數量非常大,   inode信息不一定連續, 可能會產生大量的隨機IO, 並且每次的IO數據量都很小, 短時間內也無法進行合並讀

隨機IO多了, 性能就會下降,但是數據量其實非常小

 

參見inode的數據結構

https://blog.csdn.net/TSZ0000/article/details/87188128

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM