首页 > 其他分享 >[20231204]快速删除大量文件测试(rsync版本)4.txt

[20231204]快速删除大量文件测试(rsync版本)4.txt

时间:2023-12-08 20:55:07浏览次数:118  
标签:5159 rsync 01 15 aud 16 大量文件 st 20231204

[20231204]快速删除大量文件测试(rsync版本)4.txt

--//前个星期做了大量文件测试,发现只要顺着inode节点顺序删除文件效率最高.
--//还有一种方式使用rsync,利用建立空目录使用同步功能,删除对应目录里面的全部文件.
--//我记忆里以前测试效率不错,今天做具体探究.

1.建立测试环境:
$ mount | column | grep u01
/dev/cciss/c0d0p6 on /u01 type ext3 (rw)
--// /u01的文件系统是ext3.

--//按照顺序建立文件。
$ cd /u01/testrm
$ time for i in $(seq -f "%06g" 300000); do >| $i.aud; done

$ time perl -e 'unlink for ( <*.aud> )'
real    0m4.077s
user    0m0.445s
sys     0m2.961s

2.rsync测试:
$ mkdir /u01/blanktest
--//建立一个空目录.
$ cd /u01/testrm
$ time for i in $(seq -f "%06g" 300000); do >| $i.aud; done
real    0m7.174s
user    0m2.179s
sys     0m4.407s

$ time rsync -a --delete /u01/blanktest /u01/testrm
real    0m0.048s
user    0m0.003s
sys     0m0.003s
--//奇怪不可能这样快,发现/u01/blanktest漏写一个/.

$ time rsync -a --delete /u01/blanktest/ /u01/testrm
real    0m4.889s
user    0m0.360s
sys     0m3.831s
--//确实非常快,与perl的测试基本接近。

3.使用strace跟踪看看.

$ time for i in $(seq -f "%06g" 300000); do >| $i.aud; done
real    0m6.508s
user    0m2.272s
sys     0m3.614s

$ ls -f | head
.
..
026879.aud
078531.aud
084876.aud
034744.aud
280025.aud
063529.aud
137869.aud
163787.aud
--//显示顺序与前面的测试一样!!

$ strace -T -tt -o /tmp/yy4.txt rsync -a --delete /u01/blanktest/ /u01/testrm
--//你根本看不到unlink操作。

--//跟踪内容如下:
....
16:01:20.455672 fcntl(3, F_SETFD, FD_CLOEXEC) = 0 <0.000015>
16:01:20.455739 getdents(3, /* 3 entries */, 32768) = 80 <0.000026>
16:01:20.455824 lstat("000001.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000018>
16:01:20.455924 mmap(NULL, 266240, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6ebf790000 <0.000017>
16:01:20.456008 getdents(3, /* 0 entries */, 32768) = 0 <0.000016>
16:01:20.456070 close(3)                = 0 <0.000018>
16:01:20.456144 mmap(NULL, 266240, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6ebf74f000 <0.000016>
16:01:20.456216 select(5, NULL, [4], [4], {60, 0}) = 1 (out [4], left {59, 999997}) <0.000018>
16:01:20.456306 write(4, "=\0\0\7\5\f\1.\0\0\20e&*p\355A\0\0\201\366\6oracle\201\366\10o"..., 65) = 65 <0.000617>
16:01:20.457033 select(6, [5], [], NULL, {60, 0}) = 1 (in [5], left {54, 864503}) <5.135527>
16:01:25.592682 read(5, "\3\0\0\7", 4)  = 4 <0.000020>
16:01:25.622656 select(6, [5], [], NULL, {60, 0}) = 1 (in [5], left {59, 999997}) <0.000015>
16:01:25.622717 read(5, "\1\10\0", 3)   = 3 <0.000016>
16:01:25.622776 select(5, NULL, [4], [4], {60, 0}) = 1 (out [4], left {59, 999997}) <0.000013>
16:01:25.622824 write(4, "\3\0\0\7\1\10\0", 7) = 7 <0.000016>
16:01:25.622870 select(6, [5], [], NULL, {60, 0}) = 1 (in [5], left {59, 999996}) <0.000026>
16:01:25.622978 read(5, "\23\0\0\7", 4) = 4 <0.000024>
16:01:25.623065 select(6, [5], [], NULL, {60, 0}) = 1 (in [5], left {59, 999997}) <0.000025>
16:01:25.623159 read(5, "\2\10\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 19) = 19 <0.000025>
16:01:25.623260 open("000001.aud", O_RDONLY) = 3 <0.000049>
16:01:25.623354 fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000011>
16:01:25.623470 close(3)                = 0 <0.000013>
16:01:25.623512 select(5, NULL, [4], [4], {60, 0}) = 1 (out [4], left {59, 999995}) <0.000037>
16:01:25.623604 write(4, "'\0\0\7\2\10\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\324\35\214\331\217"..., 43) = 43 <0.000027>
16:01:25.623704 select(6, [5], [], NULL, {60, 0}) = 1 (in [5], left {59, 999753}) <0.000262>
16:01:25.624019 read(5, "\1\0\0\7", 4)  = 4 <0.000035>
16:01:25.624108 select(6, [5], [], NULL, {60, 0}) = 1 (in [5], left {59, 999997}) <0.000012>
16:01:25.624167 read(5, "\0", 1)        = 1 <0.000023>
16:01:25.624257 munmap(0x7f6ebf790000, 266240) = 0 <0.000023>
16:01:25.624323 munmap(0x7f6ebf7d1000, 266240) = 0 <0.000026>
16:01:25.624415 select(5, NULL, [4], [4], {60, 0}) = 1 (out [4], left {59, 999996}) <0.000024>
16:01:25.624509 write(4, "\1\0\0\7\0", 5) = 5 <0.000029>
16:01:25.624597 select(6, [5], [], NULL, {60, 0}) = 1 (in [5], left {59, 999931}) <0.000083>
16:01:25.624731 read(5, "\2\0\0\7", 4)  = 4 <0.000011>
16:01:25.624772 select(6, [5], [], NULL, {60, 0}) = 1 (in [5], left {59, 999998}) <0.000025>
16:01:25.624850 read(5, "\0\0", 2)      = 2 <0.000011>
16:01:25.624909 select(5, NULL, [4], [4], {60, 0}) = 1 (out [4], left {59, 999999}) <0.000010>
16:01:25.624970 write(4, "\1\0\0\7\0", 5) = 5 <0.000012>
16:01:25.625019 select(5, NULL, [4], [4], {60, 0}) = 1 (out [4], left {59, 999998}) <0.000010>
16:01:25.625060 write(4, "\1\0\0\7\0", 5) = 5 <0.000013>
16:01:25.625106 select(6, [5], [], NULL, {60, 0}) = 1 (in [5], left {59, 999999}) <0.000013>
16:01:25.625194 read(5, "\1\0\0\7", 4)  = 4 <0.000023>
16:01:25.625279 select(6, [5], [], NULL, {60, 0}) = 1 (in [5], left {59, 999998}) <0.000012>
16:01:25.625378 read(5, "\0", 1)        = 1 <0.000032>
16:01:25.625462 wait4(4794, 0x7fff4321847c, WNOHANG, NULL) = 0 <0.000022>
16:01:25.625543 select(0, NULL, NULL, NULL, {0, 20000}) = 0 (Timeout) <0.020087>
16:01:25.645697 wait4(4794, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], WNOHANG, NULL) = 4794 <0.000027>
16:01:25.645787 --- SIGCHLD (Child exited) @ 0 (0) ---
16:01:25.645833 wait4(-1, 0x7fff43217e6c, WNOHANG, NULL) = -1 ECHILD (No child processes) <0.000018>
16:01:25.645900 rt_sigreturn(0xffffffffffffffff) = 4794 <0.000017>
16:01:25.645958 rt_sigaction(SIGUSR1, {0x1, [], SA_RESTORER, 0x3799030330}, NULL, 8) = 0 <0.000022>
16:01:25.646064 rt_sigaction(SIGUSR2, {0x1, [], SA_RESTORER, 0x3799030330}, NULL, 8) = 0 <0.000021>
16:01:25.646149 wait4(4794, 0x7fff43218474, WNOHANG, NULL) = -1 ECHILD (No child processes) <0.000020>
16:01:25.646267 exit_group(0)           = ?
--//我不知道句柄5,6表示怎么。发现rync实际上建立子进程来执行删除操作。重新测试,strace加入-f参数。

--//补充文件大小不为0看看。
$ time for i in $(seq -f "%06g" 300000); do echo test $i >| $i.aud; done
real    0m44.288s
user    0m3.335s
sys     0m7.946s

$ time  rsync -a --delete /u01/blanktest/ /u01/testrm
real    0m31.823s
user    0m0.351s
sys     0m4.612s

--//继续strace的测试:
$ time for i in $(seq -f "%06g" 300000); do >| $i.aud; done
real    0m6.989s
user    0m2.238s
sys     0m4.112s

$ strace -f -T -tt -o /tmp/yy5.txt rsync -a --delete /u01/blanktest/ /u01/testrm

$ awk '{print $1}' /tmp/yy5.txt | sort | uniq -c
    325 5158
 600728 5159
     72 5160

--//分成3个进程,主要有pid=5159完成。
--//查看跟踪文件:
5159  16:15:08.681724 getdents(0, /* 1024 entries */, 32768) = 32752 <0.001046>
--//开始读取目录
5159  16:15:08.686451 lstat("026879.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000024>
5159  16:15:08.686571 mmap(NULL, 135168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f413480e000 <0.000021>
5159  16:15:08.686664 mmap(NULL, 266240, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f41347cd000 <0.000017>
5159  16:15:08.686738 lstat("078531.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000020>
5159  16:15:08.686830 lstat("084876.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000020>
5159  16:15:08.686921 lstat("034744.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000019>
5159  16:15:08.687009 lstat("280025.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000020>
5159  16:15:08.687099 lstat("063529.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000019>
5159  16:15:08.687188 lstat("137869.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000019>
5159  16:15:08.687277 lstat("163787.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000019>
5159  16:15:08.687378 lstat("111415.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000021>
5159  16:15:08.687468 lstat("177021.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000020>
--//与前面perl执行看到非常相似。
--//你可以发现rsync的特点是getdents之后跟着lstat,注意看lstat里面的文件与前面ls -f顺序一致.
...
5159  16:15:08.778996 getdents(0, /* 1024 entries */, 32768) = 32768 <0.000950>
5159  16:15:08.783589 lstat("121204.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000020>
5159  16:15:08.783689 lstat("006462.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000018>
5159  16:15:08.783782 lstat("235760.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000019>
5159  16:15:08.783871 lstat("187943.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000019>
5159  16:15:08.783959 lstat("235116.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000018>
5159  16:15:08.784047 lstat("077735.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000018>
5159  16:15:08.784134 lstat("126397.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000019>
5159  16:15:08.784223 lstat("098220.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000019>
5159  16:15:08.784319 lstat("209702.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000019>
5159  16:15:08.784410 lstat("277317.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000018>
5159  16:15:08.784497 lstat("269846.aud", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 <0.000019>
...
--//接着getdents之后跟着lstat,如此反复.
5159  16:15:37.270786 getdents(0, /* 0 entries */, 32768) = 0 <0.000017>
5159  16:15:37.270854 close(0)          = 0 <0.000030>
5159  16:15:37.270938 mmap(NULL, 1200128, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f41331fe000 <0.000019>
5159  16:15:37.537610 munmap(0x7f41331fe000, 1200128) = 0 <0.000140>
5159  16:15:37.552144 unlink("300000.aud") = 0 <0.000098>
5159  16:15:37.552364 unlink("299999.aud") = 0 <0.000060>
5159  16:15:37.552466 unlink("299998.aud") = 0 <0.000023>
5159  16:15:37.552512 unlink("299997.aud") = 0 <0.000051>
5159  16:15:37.552608 unlink("299996.aud") = 0 <0.000038>
5159  16:15:37.552685 unlink("299995.aud") = 0 <0.000051>
5159  16:15:37.552769 unlink("299994.aud") = 0 <0.000035>
5159  16:15:37.552843 unlink("299993.aud") = 0 <0.000054>
5159  16:15:37.552930 unlink("299992.aud") = 0 <0.000020>
--//最后集中做unlink操作,注意看unlink的文件按照文件名反序排序删除的,这样删除文件最快,这也是prsync与perl一样,测试删除
--//文件快的原因。
--//只要按照文件名顺序建立或者反序建立做删除操作,perl或者rsync删除文件都是最快的。
--//补充实际上按照inode的顺序删除最快(反向类似)。

4.乱序建立文件呢?

--//按照乱序建立文件,我不知道bash shell如何实现,我先通过oracle的sql语句建立乱序数字输出。
set pagesize 0
spool aa.txt
select lpad(level,6,'0') from dual connect by level <=3e5 order by dbms_random.value;
spool off
--//注意设置set pagesize 0,不然中间出现多次页头。注意保持aa.txt的备份,测试要重复多次。

$ time for i in $(cat /tmp/aa.txt ); do >| $i.aud; done
real    0m6.880s
user    0m1.986s
sys     0m4.282s

$ ls -f|head
.
..
026879.aud
078531.aud
084876.aud
034744.aud
280025.aud
063529.aud
137869.aud
163787.aud
--//显示顺序与前面的测试一样!!

$ time  rsync -a --delete /u01/blanktest/ /u01/testrm
real    1m53.208s
user    0m0.459s
sys     0m7.391s

--//差不多2分钟,使用strace跟踪可以看到前面unlink的顺序,可以推断,unlink按照文件名从大到小的顺序删除,这样inode的顺序是打乱的,rsync也不会很快
--//删除全部文件,再次验证我前面的判断:按照inode的顺序(不管正序还是反序),做删除操作效率最高。

$ strace -f -T -tt -o /tmp/yy6.txt rsync -a --delete /u01/blanktest/ /u01/testrm

--//跟踪文件内容如下:
9769  08:41:59.387415 getdents(0, /* 0 entries */, 32768) = 0 <0.000025>
9769  08:41:59.387503 close(0)          = 0 <0.000036>
9769  08:41:59.387608 mmap(NULL, 1200128, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa39724d000 <0.000024>
9769  08:41:59.628093 munmap(0x7fa39724d000, 1200128) = 0 <0.000174>
9769  08:41:59.643044 unlink("300000.aud") = 0 <0.000086>
9769  08:41:59.643229 unlink("299999.aud") = 0 <0.000084>
9769  08:41:59.643361 unlink("299998.aud") = 0 <0.000085>
9769  08:41:59.643476 unlink("299997.aud") = 0 <0.000066>
9769  08:41:59.643588 unlink("299996.aud") = 0 <0.000029>
...

$ time for i in $(cat /tmp/aa.txt ); do >| $i.aud; done
real    0m6.881s
user    0m1.965s
sys     0m4.312s

$ time sed "s/$/.aud/" /tmp/aa.txt |  xargs rm -f
real    0m6.191s
user    0m0.552s
sys     0m5.403s

$ time for i in $(cat /tmp/aa.txt ); do >| $i.aud; done
real    0m6.889s
user    0m1.990s
sys     0m4.280s

$  time sed "s/$/.aud/" /tmp/aa.txt|tac | xargs rm -f
real    0m7.161s
user    0m0.459s
sys     0m5.969s
--//反序始终慢一点,也许执行tac的原因。
--//按照inode的顺序(不管正序还是反序),做删除操作效率最高。

5.总结:
--//可以得出结论,要快速删除某个目录的大量文件,最快的方式是按照inode的顺序执行删除操作,这样最快.

标签:5159,rsync,01,15,aud,16,大量文件,st,20231204
From: https://www.cnblogs.com/lfree/p/17889013.html

相关文章

  • 数据同步rsync
    一.Rsync本地模式和远程模式1.命令说明纯通过rsync的命令,来实现,数据目录A拷贝到数据目录B也就是模拟cp的用法很简单rsync[选项]源数据目的数据1.安装yuminstallrsync-y2.命令语法,分几个模式-本地模式rsync参数源路径目标路径rsync-xxxxx/var/log......
  • 数据的实时同步、共享和rsync服务
    数据的实时同步在生产环境,有时会需要两台主机的特定目录实现实时同步。比如,将NFS共享目录的数据文件,自动实时同步到备份服务器特定目录中1.#首先创建个文件夹[root@ubuntu2004~]#mkdir/etc/exports.d[root@ubuntu2004~]#vim/etc/exports.d/text.exports/data/nfsdir2*(rw......
  • rsync笔记
    rsync=remotesync远程同步安装yuminstallrsync-y前置概念同步方式一.全量备份:原有的数据全部传送把原来的文件和新的文件一起统一传送全量复制,效率低二.增量备份在传输数据之前通过一些算法通过你有的数据和我有的数据进行对比,把不一样的数据通过网络传输......
  • 20231204
    一、实验要求  任务一:下载配置百度翻译Java相关库及环境(占10%)。    任务二:了解百度翻译相关功能并进行总结,包括文本翻译-通用版和文本翻译-词典版(占20%)。    任务三:完成百度翻译相关功能代码并测试调用,要求可以实现中文翻译成英文,英文翻译成中文(占30%)。    任......
  • 20231204
    好困,好累,好晕。好想呆在家里睡大觉!又是效率极低的一天,也许真的该休息了(?)晚上跑到初三机房,然后发现自己又热又晕,要死了啦!在犇犇里发了会儿电居然还有人理我。。不知道是感动还是麻木。随便整了一下v4,不过话说这都什么年代了怎么还有人在用v4啊喂!不过话说回来,我用vc是......
  • linux上的rsync命令详解【转】
    1.rsync简介rsync就是远程同步的意思remotesync.rsync被用在UNIX/Linux执行备份操作操作.rsync工具包被用来从一个位置到另一个位置高效地同步文件和文件夹.rsync可以实现在同一台机器的不同文件直接备份,也可以跨服务器备份.2.rsync的重要特性速度快:初次同步时,......
  • rsync报错整理
    问题1:无法向远程机器拉取数据,报错如下:[root@rsync-41~]#rsync-avzP/[email protected]:/var/log@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@WARNING:REMOTEHOSTIDENTIFICATIONHASCHANGED!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......
  • rsync+sersync实时同步目录和文件
    0、服务器准备0.1、三台服务器:rsync:192.168.1.9sersync:192.168.1.10、192.168.1.11 0.2、部署这套服务的背景    将多个子公司的备份数据实时同步到备份服务器上,rsync作为备份服务器,sersync部署在各个子公司上,只需将各个子公司服务器上需要备份的数据拷贝到/data/se......
  • Rsync增量备份,数据同步工具
    Rsync是可实现全量及增量的本地或远程数据同步备份的优秀工具。SCP是全量备份,Rsync可以全量备份也可以是增量备份。centos5 rsync2.0是先把所有文件对比,在进行差异备份centos6 rsync3.0是边对所有文件进行对比,将对比的差异边进行备份rsync的三种工作模式:(1)本地同步......
  • linux下大量文件复制
    rsync-avzh--progress/path/to/source//path/to/destination/rsync-avzh/path/to/source//path/to/destination/|pv-lep-s$(du-sb/path/to/source/|awk'{print$1}')>/dev/nullrsync-aqxPp保留权限t保存时间a递归v详情h可读的x边界q静默......