目标:Linux下需清空一个目录,该目录下含有大量文件。
假定待清空目录名为“/data/todeldata”。
一、rm方式
执行命令:
1 | rm -rf /data/todeldata |
机理分析:
0. 第一阶段,通过getdirentries64
系统调用,分批读取目录(每次大约为4K),在内存中建立待删除文件列表
0. 第二阶段,通过lstat64
系统调用确定所有文件的状态
0. 第三阶段,通过unlink
系统调用执行实际删除
小结:整个过程做了大量的系统调用,尤其是lstat64
和unlink
系统调用。当目录下含有大量文件时,易导致系统卡死。
二、rsync方式
执行命令:
1 | # mkdir an empty directory first |
机理分析:
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