0%

Linux下高效低系统资源占用清空目录

目标:Linux下需清空一个目录,该目录下含有大量文件。

假定待清空目录名为“/data/todeldata”。

一、rm方式

执行命令:

1
rm -rf /data/todeldata

机理分析:
0. 第一阶段,通过getdirentries64系统调用,分批读取目录(每次大约为4K),在内存中建立待删除文件列表
0. 第二阶段,通过lstat64系统调用确定所有文件的状态
0. 第三阶段,通过unlink系统调用执行实际删除

小结:整个过程做了大量的系统调用,尤其是lstat64unlink系统调用。当目录下含有大量文件时,易导致系统卡死。

二、rsync方式

执行命令:

1
2
3
4
# mkdir an empty directory first
mkdir /data/blank

rsync --delete-before -d /data/blank/ /data/todeldata/

机理分析:
0. 命令执行前期,获取一片共享内存,通过mmap方式加载目录信息。只做目录同步,不需要针对单个文件做unlink系统调用

小结:整个过程所做的系统调用很少,没有针对单个文件做unlink系统调用,而是批量做。


全文总结:未作深入分析,只是概要叙述,比如对于“没有针对单个文件做`unlink`系统调用,而是批量做”未作深入跟踪分析明确具体实现原理。
参考文献: [1]https://blog.liulantao.com/why-can-rsync-rapidly-delete-400000-files.html [2]http://g33kinfo.com/info/archives/5630 [3]https://www.quora.com/What-does-rsync-do-that-makes-it-so-efficient-at-deleting-many-small-files [4]https://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux
您的支持将鼓励我继续分享!