參考鏈接:
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