正在美美摸鱼呢,领导来消息了,让我帮他删一下一台云主机上的文件,要求删除所有/mnt下所有archived开头的目录
这是一个超大nfs挂载,使用的是阿里云的NAS,其中有500T数据被占用,有多大呢,连输入ls都会卡住
1 | df -Th | grep mnt |
解决思路
find与xargs
首先肯定是find,因为我们要的是archived开头的目录,它可以很快帮我们找出哪些目录需要删除
1 | find /mnt2 -maxdepth 1 -type d -name "archived*" |
;与+
1 | {} \; |
rsync
1 | rsync是一种清空单个大目录的好方法 |
parallel多线程
这个时候就需要使用多线程工具了,
使用parallel,find会首先找到所有符合条件的目录,将其交给parallel,parallel再根据参数发起对应数量的任务,完美的规避了单线程阻塞的问题
1 | find ./ -maxdepth 1 -type d -name "archived*" -print0 | \ |
性能瓶颈
CPU瓶颈
那么问题又来了,这个-j到底填多少合适呢?
常识告诉我们并发数应该和CPU线程数一致,也就是填一个12
填完之后越想越觉出不对劲来,点开top看看CPU状态吧
1 | top |
可以看到,虽然load average挺高的
但是所有CPU核心的空闲时间id都在97%以上
用户态使用率us和系统态使用率sy都很低
不是哥们,哥几个表面上很忙,实际上搁这儿摸鱼呢?
这是因为我们执行的删除文件任务并非CPU密集型任务
rm任务只是在队列中等待而已,实际上并不占用CPU
卡住它的另有其人
带宽瓶颈
那我这个存储是NFS挂载的NAS,是不是因为网络带宽或者其他什么的?
(也许在这种场景下没有必要,因为公有云有自己的VPC,云主机和NAS肯定连得贼快,但其实有更普遍的意义)
1 | yum -y install iftop bind-utils |
nfs读写延迟
1 | nfsiostat 1 |
根据nfs ops调优并发线程数
调呗,硬调,要通过调整并发线程数,找出一个ops最高的点
1 | -j avg ops |
命令执行
1 | yum -y install tmux |