为什么rsync能够快速删除400000文件?
来源:互联网 发布:网络电缆测试仪上电池 编辑:程序博客网 时间:2024/05/21 07:08
为什么rsync能够快速删除400000文件?
背景
Quora上一篇文章★How can someone rapidly delete 400,000 files?提到通过rsync能够快速删除大量文件,之后在Linux技巧:一次删除一百万个文件的最快方法这篇文章里做了一个详细的评测,对于rm/find/rsync等诸多方法的性能做了对比。
对于出现性能的差异,应该属于预料中的结果。为了验证这个现象,我模拟了Quora原提问的要求,创建了40万个文件,分别用rm和rsync进行删除操作,对syscall做统计。为了简化条件,这写文件全部是空文件(使用包含内容的文件对结果不会造成明显差异,有兴趣可以重试一下)。
统计syscall使用了dtruss工具,这是MacOSX上提供的syscall调试工具,基于DTrace。Linux上可以使用SystemTap来代替。
验证测试步骤
第一步,创建测试文件
mkdir tmp/; seq 1 400000 | xargs -I{} touch tmp/file_{}
创建的目录文件大小约为13M。这个大小指的是目录文件,不包含目录中文件,要注意。
$ ls -dl tmp/drwxr-xr-x 56513 lax wheel 13062562 6 13 16:18 tmp-test-rsync
第二步,使用dtruss执行rm命令测试
$sudo dtruss -c 'rm -rf tmp-test-rm/'CALL COUNT__mac_syscall 1audit_session_self 1bsdthread_register 1exit 1fstatfs64 1getaudit_addr 1getegid 1rmdir 1shared_region_check_np 1thread_selfid 1__sysctl 2close 2close_nocancel 2csops 2getpid 2ioctl 2issetugid 2open 2open_nocancel 2pread 2geteuid 3fchdir 4mprotect 8stat64 34mmap 93munmap 184madvise 205getdirentries64 2659lstat64 311901unlink 400000
第三步,使用dtruss执行rsync命令测试
$sudo dtruss -c 'rsync -a --delete empty/ tmp/'CALL COUNT__mac_syscall 1__pthread_canceled 1audit_session_self 1bsdthread_register 1exit 1fcntl_nocancel 1fork 1fstatfs64 1getaudit_addr 1getegid 1getrlimit 1getuid 1ioctl 1lstat64 1shared_region_check_np 1shm_open 1sigprocmask 1sigreturn 1thread_selfid 1umask 1__sysctl 2chdir 2csops 2getdirentries64 2getpid 2lseek 2pread 2socketpair 2fstat64 3munmap 3open_nocancel 3close 4close_nocancel 4geteuid 4issetugid 4open 4wait4 6read_nocancel 7write 7mprotect 8read 10sigaction 10fcntl 11mmap 13select 21stat64 35
现象分析
- rm
- rm命令大量调用了lstat64和unlink,可以推测删除每个文件前都从文件系统中做过一次lstat操作。
- lstat64的次数低于文件总数,还有另外的原因,之后会在另一篇文章中说明。
- getdirentries64这个调用比较关键。
- 过程:正式删除工作的第一阶段,需要通过getdirentries64调用,分批读取目录(每次大约为4K),在内存中建立rm的文件列表;第二阶段,lstat64确定所有文件的状态;第三阶段,通过unlink执行实际删除。这三个阶段都有比较多的系统调用和文件系统操作。
- rsync
- rsync所做的系统调用很少。
- 没有针对单个文件做lstat和unlink操作。
- 命令执行前期,rsync开启了一片共享内存,通过mmap方式加载目录信息。
- 只做目录同步,不需要针对单个文件做unlink。
另外,在其他人的评测里,rm的上下文切换比较多,会造成System CPU占用较多——对于文件系统的操作,简单增加并发数并不总能提升操作速度。
总结
把文件系统的目录与书籍的目录做类比,rm删除内容时,将目录的每一个条目逐个删除(unlink),需要循环重复操作很多次;rsync删除内容时,建立好新的空目录,替换掉老目录,基本没开销。
结论:频繁做减法不如直接从头来过。
转载于http://blog.liulantao.com/blog/2013/2013-06-13-why-can-rsync-rapidly-delete-400000-files.html
0 0
- 为什么rsync能够快速删除400000文件?
- rsync快速删除海量文件
- Rsync 最快速删除海量文件的方法
- 使用rsync批量删除文件
- Linux下使用rsync最快速删除海量文件的方法
- (总结)Linux下使用rsync最快速删除海量文件的方法
- Linux下使用rsync最快速删除海量文件的方法
- Linux下使用rsync最快速删除大量文件的方法
- -linux删除大量文件----rm,rsync
- linux删除大量文件----rm,rsync
- linux删除大量文件----rm,rsync
- linux删除大量文件----rm,rsync
- linux无需rm就可快速删除大量文件--- rsync --delete-before -a -H -v --progress --stats
- 如何快速删除文件
- 快速删除海量文件
- 怎么快速删除文件
- 为什么这样能够防止头文件重复调用?
- 快速配置rsync用于无密码接收文件
- 怒!!!
- shell字符串处理相关
- 有关 ORA-00604 错误的总结
- thinkpad x61-lg2装XP
- windows引导linux
- 为什么rsync能够快速删除400000文件?
- div+css与table对比
- XCode 5 “ios模拟器未能安装此应用程序”解决办法
- android 模拟home键操作
- Mysql数据库学习(二):数据类型(数值类型 日期和时间类型 字符串类型)
- b/S原理
- iOS开发:分享一个获取设备型号的方法
- perl
- 【PHP开源产品】Ecshop的商品筛选功能实现分析之一(主要对category.php进行分析)