我已经思考了基本相同的问题,并且得出了一个非常简单的结论:
使用保守的默认值或启发式方法,但如果用户愿意,可以轻松覆盖它。
您会看到,在某些情况下,用户可能不希望您的实用程序获得最大吞吐量,但可能会在后台执行任何操作。也许这项任务并不那么重要。就个人而言,在 Linux 中,我经常使用nice
和ionice
实用程序将长期但不优先的任务放在次要任务上,可以这么说,这样它们就不会干扰我的实际工作。
过去十年的基准表明 128k 到 2M 的块大小(2 17到 2 21字节)一直运行良好——几乎在所有情况下都与最佳速率相差不远——平均缓慢地向该范围的较大端移动。通常,两种大小的幂似乎比非二的幂更好,尽管我还没有看到足够多的各种 RAID 配置的基准来完全相信这一点。
因为您的实用程序几乎肯定会为每种新的硬件类型/代重新编译,所以我希望在编译时定义一个默认块大小,但在运行时将其简单地覆盖(通过命令行选项,环境变量和/或配置文件)。
如果您的实用程序是为当前的 POSIXy 操作系统打包的,则二进制文件可以使用似乎最适合在该机器上完成的任务类型的默认值;例如,Raspberry Pis 和其他 SBC 通常没有那么多内存开始,因此较小的(例如,65536 字节)默认块大小可能效果最好。桌面用户可能不关心内存占用,因此您可能会在当前桌面机器上使用更大的默认块大小。
(服务器和高性能计算(这是我考虑过的地方),块大小基本上要么在确切的硬件和工作负载上进行基准测试,要么只是一个几乎没有根据的猜测。通常是后者。)
或者,您可以基于所st_blksize
涉及文件的 s 构建启发式算法,可能乘以默认因子,并限制在某个首选范围内。然而,随着硬件的变化,这种启发式算法往往会快速比特腐烂。
对于启发式方法,重要的是要记住,这个想法并不总是达到最佳状态,而是要避免非常糟糕的结果。如果用户想要挤出最后百分之几的性能,他们可以在自己的工作流程中进行一些基准测试,并相应地调整默认值。(我个人有,也有。)