gib*_*gib 1 linux performance ext4 hard-drive
我有一个很大的目录,里面有很多缓存文件,我想重新组织这些文件以获得最大性能(访问时间)。
PHP/Perl 脚本(随机)访问文件。这些脚本生成绝对路径并读取文件。没有目录列表:几乎只有fopen
文件的绝对路径。
当前目录层次结构是:cacheDir/d4/1d/d41d8cd98f00b204e9800998ecf8427e.dat
所以有 256 个一级子目录(d4
在示例中)和 256 个二级子目录(1d
在示例中)。平均每个二级目录大约有 200-300 个文件。
问题:当出现网络流量高峰和大量fopen
's in 时cacheDir
,流量iowait
正在增长,减慢系统速度,出现非常高的负载和明显的延迟。只有在cacheDir
访问文件时才会出现这种高负载。如果我以相同的频率访问其他目录/文件,则磁盘和系统运行良好。
我想知道更改缓存目录结构是否会提高性能?更改为(例如):(cacheDir/d/4/1/d/8/d41d8cd98f00b204e9800998ecf8427e.dat
16 个子目录在:1st、2nd、3rd、4th 级别,并且(平均)每个 4th 级别子目录有 15 个文件)。
我知道在简单的台式机 SATA III 驱动器上的 Software RAID 1 不是速度怪物,但也许有一些优化文件系统的好方法?
请注意:
dir-index
noatime
e2fsck -Df
这可能听起来很愚蠢,但事实(你的真相)是基准结果。在每种情况下,可能存在比其他文件系统更快的文件系统,但最佳结构很可能取决于磁盘的速度特性、RAM 数量和缓存效率。
如果您使用具有更深层次结构的较小目录会发生什么?必须读取较少的数据才能找到目录条目,但可能(如果该目录在其父目录中的条目不再缓存)。让我们假设一个目录条目是 50 个字节。对于包含 300 个文件的整个目录来说,这是 15K。在进行连续读取时,您的磁盘可能提供 150+ MiB/s。因此,读取 300 个文件或 600 个文件之间的差异是 0.1 毫秒。定位时间最多为 4ms(如果那不是 SSD)。即对于每个保存的目录查找,您可以读取至少 12.000 个文件的条目。这让我假设您的目录很小。但也许你所有的目录条目都在缓存中(我不知道如何监控它,但会很有趣)所以这个计算是无关紧要的。
我认为问题不在于文件 inode 的查找时间。可能很多进程尝试同时进行 I/O。如果这导致文件在几个步骤中被读取,那么性能当然是死的。文件碎片也是如此。看看filefrag
你的缓存文件。并看看blockdev --setra
。您应该将其调整为您的平均文件大小(或超过 90% 的文件大小)并检查这是否有任何影响。我还发现了一个提示(虽然已经有好几年了)将所有设备的这个值设置为零,除了最顶层:
/dev/sdx -> ra=0
/dev/mdx -> ra=0
/dev/lvm/ -> ra=xxxx
Run Code Online (Sandbox Code Playgroud)
我不知道你愿意做多少,但我可以想象 FUSE 模块会对你的情况有所帮助(取决于文件大小和预读有效性):该模块必须确保文件被读入一步并且(在用户空间的限制内)这些访问不会被中断。下一步是按磁盘上的位置对文件访问进行排序,即在文件级别执行内核(和磁盘本身)对单个 I/O 操作所做的工作。您可以创建较小的 LV,而不是拥有带有目录的大文件系统。因此,您可以按名称对文件访问进行排序,并按磁盘区域对访问进行排序。
如果您愿意更改硬件,那么这可能会很有趣:只将元数据放在 SSD 上。您应该尝试从缓存磁盘中获取写访问权限。这可能主要是日志文件。它们通常并不重要,因此将它们放在具有较长提交时间和data=writeback
.
如果(某些)您的缓存数据是静态的(并且您不需要 ACL),那么您可以在将其从 ext4 移动到 squashfs(压缩的只读 FS)时测试性能。如果问题是分几个步骤读取文件,即使是 ext4 中的透明压缩 (FUSE) 也可能有所帮助。文件系统(和磁盘内部)预读将获得更多的文件(如果它是可压缩的)。
归档时间: |
|
查看次数: |
241 次 |
最近记录: |