![优化 ext[234] 以提高小文件吞吐量](https://linux22.com/image/592151/%E4%BC%98%E5%8C%96%20ext%5B234%5D%20%E4%BB%A5%E6%8F%90%E9%AB%98%E5%B0%8F%E6%96%87%E4%BB%B6%E5%90%9E%E5%90%90%E9%87%8F.png)
我有一个系统,其磁盘上的小文件吞吐量很高,即在几秒钟内创建、写入和删除大量小文件。
是否有任何合理的 ext2/ext3/ext4 挂载选项可以提高性能?我猜,元数据日志记录会导致此处性能大幅下降。
答案1
是的,元数据操作绝对会杀死你。我能想到的最重要的挂载选项是noatime
,它会关闭atime
所有文件的更新(或“上次访问时间”更新)。这会停止每次文件访问时写入一次元数据,这可能会使你的 I/O 速率减半(如果你读/写每个文件一次)到数百倍(如果你写一次,读很多次)。 noatime
也意味着nodiratime
,它只关闭atime
目录的更新。如果这有点太残酷(有时你需要atime
),那么考虑relatime
(mount
(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 文件系统:
- umount /dev/youDev #卸载设备
- tune2fs -O dir_index /dev/yourDev #为 FS 添加功能
- 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