优化 ext[234] 以提高小文件吞吐量

优化 ext[234] 以提高小文件吞吐量

我有一个系统,其磁盘上的小文件吞吐量很高,即在几秒钟内创建、写入和删除大量小文件。

是否有任何合理的 ext2/ext3/ext4 挂载选项可以提高性能?我猜,元数据日志记录会导致此处性能大幅下降。

答案1

是的,元数据操作绝对会杀死你。我能想到的最重要的挂载选项是noatime,它会关闭atime所有文件的更新(或“上次访问时间”更新)。这会停止每次文件访问时写入一次元数据,这可能会使你的 I/O 速率减半(如果你读/写每个文件一次)到数百倍(如果你写一次,读很多次)。 noatime也意味着nodiratime,它只关闭atime目录的更新。如果这有点太残酷(有时你需要atime),那么考虑relatimemount(8)比我更好地解释了这一点)。

在硬件层面,严重地考虑使用更多 RAM 和非易失性缓存硬件 RAID 控制器。更多 RAM 有助于内核缓存更多数据,从而减少(甚至消除)读取 I/O,而 NVRAM 缓存 RAID 控制器意味着您的数据在写入闪存(速度很快)后是安全的,而不是一直写入旋转磁盘(速度很慢)。您也可以使用 SSD,但它们的速度仍然比 NVRAM 慢得多。

答案2

我有一台运行 ext4 的 Synology NAS(DS1815+,DSM 5.2),我发现它在包含数千个(小)文件的目录上性能不佳。

Synology NAS ext4 没有目录索引默认设置扩展!我不知道 Synology 为什么这样做,因为 dir_index 功能只适用于大型目录。然后它会创建一个索引,使访问、计数、迭代等变得更快。

要检查是否安装了该功能,请使用tune2fs -l /dev/你的设备

tune2fs -l  /dev/vg1/volume_1  | grep features 
Filesystem features:      ... dir_index ...

如果您在功能列表中没有看到 dir_index,那么您可以将其添加到您的 ext3/4 文件系统:

  1. umount /dev/youDev #卸载设备
  2. tune2fs -O dir_index /dev/yourDev #为 FS 添加功能
  3. e2fsck -D /dev/yourDev # 创建索引

对于 Synology NAS,步骤如下:

syno_poweroff_task -d
vgchange -ay
tune2fs -O dir_index /dev/vg1/volume_1
e2fsck -D /dev/vg1/volume_1

dir_index 功能适用于 ext3 和 ext4,在现代 Linux 发行版上创建 ext4 时,通常/经常是默认设置。但是 - 正如此 Synology NAS 所示 - 值得检查。就我而言,此功能将包含 100k(小)文件的文件夹 rsyncing 到 NAS 的速度从 4Mb/s 提高到 14Mb/​​s。

部分内容引自 www.debian-administration.org

您可以执行的最有用的调整是查找文件时扫描目录索引的方式。这由选项“dir_index”控制。默认情况下不会启用此功能,但您可以通过运行以下命令添加它:

我的:~# tune2fs -O dir_index /dev/sda1

完成此操作后,您将能够看到正在使用的更新的文件系统标志:

我的:~# tune2fs -l /dev/sda1 | grep features 文件系统功能:
has_journal resize_inode dir_index filetype needs_recovery sparse_super large_file

完成此操作后,您会发现列出包含大量文件的目录内容变得更快,并且在目录中查找文件也更好。

答案3

我想补充一下 alfonx 的回答,以便以后遇到这个问题的人参考。在 DSM 7.0 中,该syno_poweroff_task -d命令已被删除。您可以改用synostgvolume

synostgvolume --unmount -p /volume1
vgchange -ay
tune2fs -O dir_index /dev/vg1/volume_1
e2fsck -D /dev/vg1/volume_1

相关内容