一、前言
Linux服务器磁盘中存在大量小文件,需要进行删除(文件小于1K,数量50w~100w),发现rm删除速度奇慢无比,甚至出现“argument list too long”的错误。网上资料一搜索基本都是建议rsync方法,所以本文对几种常见的方法进行试验对比。
二、相关知识
2.1 文件系统的元数据(metadata)
1)superblock:记录文件系统的整体信息,包含inode/block的大小、总量、使用量、剩余量,以及文件系统的格式,文件系统挂载时间,最近一次数据写入时间,最近一次校验磁盘的时间等。
2)inode:表示文件系统的对象,具备唯一标识符(一个文件占用一个inode),inode记录了文件的元信息,具体来说包含的信息为:文件所有者、访问权限(读、写、执行)、类型(是文件还是目录)、内容修改时间、inode修改时间、上次访问时间、对应的文件系统存储块(Block)的地址;
3)block:实际记录文件的内容,若文件太大,则会占用多个block,通常的block大小有1K,2K,4K三种,这里内核记录block信息的数据结构是Bitmap。
2.2 文件系统工作原理(ext2、ext3)
ext2 为索引式文件系统,新增一个文件的流程如下:
1)确定目录是否有写权限/打开权限(w/x),没有则返回失败;
2)根据inode-bitmap分配新的inode,将新文件权限/属性记入;
3)根据block-bitmap分配新的block,将文件数据写入block中,更新inode的block指向数据;
4)将新的inode、block数据同步到inode-bitmap、block-bitmap中,并更新superblock内容;
ext3 为日志式文件系统,对ext2的缺点进行改进(系统故障重启,修复元数据信息耗时长),多出一块日志记录区块来保证可靠性:
1)当系统准备写入一个文件时,先在日志记录区块记录文件要写入的信息;
2)写入文件权限/属性,写入文件数据,更新元数据内容(同ext2);
3)完成数据与元数据更新后,在日志记录区块完成文件的记录;
在出现故障需要恢复时,可根据日志追踪之前提交到主文件系统的更改,大大减少了磁盘的扫描时间,实现丢失数据的快速重建,比传统的索引式文件系统更安全[3]。Linux下的集中日志式文件系统有XFS(目前是CentOS7的默认文件系统),ReiserFS,Ext3,Ext4。
三、实验
3.1 实验环境
CPU:4核,Intel(R) Core(TM) i3-3120ME CPU @ 2.40GHz
内存:8G
硬盘:1T(ST1000NM0055)
操作系统:Linux-3.10.25
文件系统:ext3
软件版本:find、rm(busybox1.24)、rsync3.1、bash3.2、perl5.8