系统( "rm x.*" ) 与取消链接()的性能?

Performance of system("rm x.*") vs unlink()?

本文关键字:链接 性能 取消 rm 系统      更新时间:2023-10-16

我正在维护一个Linux遗留系统,该系统在大型存储阵列中维护数百万个小文件。 (是的,文件系统的噩梦(

在C++代码中,我发现文件被删除,例如system("rm -f/dir/dir/file.*"(

我怀疑使用 unlink(( 会快得多,但快多少? (我无法在生产中真正测试它(

有人对此有一些比较数据吗?

旧代码已经很脆弱,用 unlink(( 替换方便的 system(( 调用并让通配工作等,是一大块工作......

如果没有实际设置并对其进行测试(在机器类型上,具有正确的基础架构 - 例如,网络文件的行为与硬盘文件不同,硬盘文件又不同于闪存驱动器或SSD文件(,真的不可能准确地回答。但是,我们可以讨论"一个相对于另一个的开销是多少":

unlink() 是您自己的可执行文件中的函数调用,然后转换为内核中的相关系统调用。您的代码必须循环访问要删除的相关文件。

system("rm something")将转换为fork(); exec("sh", "rm", "something");,并且shell将在"something"上执行glob(),该扩展到相关的文件列表,然后执行rm,这很快变成了unlink(),但是有一点开销。

最终,它实际上归结为文件的数量以及它们存储在哪个文件系统中。如果有很多文件(数百或数千(,那么调用system的开销是微不足道的。另一方面,如果你做类似 for_each(list_of_files) system("rm " + file_in_list); [这不是编译] 的事情,对于大量文件来说,for_each(list_of_files) unlink(file_in_list);开销将是显而易见的。

通常,删除大量文件很快就会受到 I/O 限制,因此无论您使用哪种方法,都将取决于"文件系统处理删除文件请求的速度",而不是实际要求删除它的代码的速度。

如果您可以测量这两种解决方案之间对几十个文件的任何差异,那将是非常令人惊讶的 - 因为时间由实际执行文件系统操作所需的时间所支配(读取目录,从目录列表中删除文件,存储目录列表(。调整文件系统参数更有可能(如果尚未调整(给您带来一些好处(例如,减少将新目录结构写回磁盘的标准,但这也会带来一些其他缺点,例如在崩溃/断电的情况下文件系统的可靠性较低(。