【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

 

 

posted @ 2021-04-16 17:21  wind_land  阅读(3173)  评论(0编辑  收藏  举报