gpt4 book ai didi

linux - Unix 目录 inode - 碎片和转储目录内容

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:51 25 4
gpt4 key购买 nike

我们在 Linux 上遇到了一个问题,随着时间的推移,目录 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.5MB,遍历1.7秒。

重建后的目录文件数相同,表示45K,遍历0.2秒。

我想知道是什么原因造成的。我的猜测是碎片——一般来说,这不应该是 Unix 文件系统的问题,但在这种情况下,我们将目录用于短期缓存文件,因此不断地创建、重命名和删除大量小文件.

我还想知道是否有一种方法可以转储目录的文字二进制内容——也就是说,读取目录就好像它是一个文件——这可能会让我深入了解为什么它这么大。 Perl 的 read() 和 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

谢谢!

乔恩

最佳答案

对于问题 1,外部碎片通常会导致大约 2 倍左右的开销,1 加上分配粒度方面的内部碎片。这些都无法解释您的观察结果。

所以,我不认为这是正常的稳态碎片。

最明显的猜测是 1.5MB 是高水位线;有一次它确实有 1.5MB 字节的条目或 1.5MB/2 字节的条目以及预期的碎片。

另一种猜测是 50% 规则被非马尔可夫分配所覆盖。想象一下,我用“tmp%d”命名文件,所以,tmp1、tmp2、... tmp1000、tmp1001、...

这里的问题是 rm tmp1 没有为 tmp1001 腾出空间。这显然是一个大胆的猜测。

Q2:没有很好的读取raw目录的方法。 AFAIK,您需要破解内核或使用 debugfs 更改 inode 类型,读取它,然后将其改回,或者使用 debugfs 读取 inode,获取 block 号,然后读取 block 。功能调试方法可能更合理。

您可以通过确保启用索引来解决性能问题。请参阅 tune2fs


1Knuth 的百分之五十法则:在稳定状态下,50% 的操作是分配,50% 是空闲,50% 的空闲 block 合并,然后空洞是 50% 的分配,50 % 的空间被浪费了。 (也就是 100% 的开销。)这被认为是“正常的”。 Malloc 也有同样的问题。

关于linux - Unix 目录 inode - 碎片和转储目录内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1628032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com