Linux nfs 客户端如何快速删除大量小文件

4 月 16 日
 swordsmile

linux 下有个程序每天在 NFS 共享目录(生成一个当天日期的文件夹)下缓存 100 万左右的文件,大小差不多 3-5T ,这个程序处理完成后可以删除,如何在 Linux 下快速删除它们呢。

按照网上的这个同步空目录的方法,差不多耗时 7 个小时。 rsync --delete-before -d -H -O --progress /tmp/empty/ 2026-04-02/

7179 次点击
所在节点    Linux
21 条回复
yolee599
4 月 16 日
试试问 AI 看它怎么说
Cooky
4 月 16 日
在 nfs 里放个足够大的镜像文件,客户端直接挂载这个镜像,在镜像里操作小文件,用完了直接重新格式化
EchoWhale
4 月 16 日
@Cooky 骚
swordsmile
4 月 16 日
Linux 下有没有删除上百万文件比较快的对象存储?
paopjian
4 月 16 日
内存盘卸载后直接空了, 按上面的思路一个是硬盘分区后直接格式化是不是更快, 我问 G 他说可以用 Loop Device (虚拟镜像文件)
mrzx
4 月 16 日
@swordsmile 按照运维的思维是

直接想办法把这个目录单独映射一个分区
然后 umount /dev/sdxx
然后 mkfs.ext4 /dev/sdxx 在重新挂载

这个速度会极快
为什么要删?破坏这个分区不就行了吗
mrzx
4 月 16 日
@paopjian ramdisk 没有这么大的...人家 3T 到 5T 当然了,别人有钱是另外回事

而且内存断掉数据就会丢失 如何将 ramdisk 里的数据缓慢的写入到其他存储也是另外个困难了..
mrzx
4 月 16 日
@Cooky 你这种方法也是个好方法,直接了当 就是写性能稍微有些低下...
kome
4 月 16 日
完全释放文件占用,直接删除目录,速度应该是最快的吧。
mrzx
4 月 16 日
还有个方法,我做运维用到的

linux 上现在支持 openzfs 很好了

咋办,利用 zfs 文件格式的特性 做元数据分离
搞 2 块高性能固态硬盘独立 SLOG ,所有元数据修改、删除操作先落日志盘,

要搞清楚这种日志文件系统的底层原理,你删文件的时候,其实没有真删除数据, 实际上是删出映射关系罢了
删除百万小文件时,只动 SSD 上的元数据,根本不动存储盘
caola
4 月 16 日
问一下 AI 吧,以前我的单个目录也是上百万个小文件,一条命令就很快就解决了
pckillers
4 月 16 日
rm -rf 文件夹很慢么?
Cooky
4 月 16 日
@mrzx 这得看客户端和服务端的配合,能挂载了直接扇区操作性能就没有影响,反而不需要服务端做文件检索
realJamespond
4 月 16 日
有用的拷出来,format
yulgang
4 月 16 日
感觉在 S3 存储里按天建桶,用完直接删桶速度更快,不过他的写性能就比较糟糕了。
ryd994
4 月 16 日
@mrzx 元数据不在 SLOG 上。SLOG 仅用于 sync 模式写入的文件。如果没有 SLOG ,那 sync 模式写入的数据会按随机顺序直接写入硬盘,等有空的时候再整理释放。
因为同步写入要求必须落盘后才可以返回完成,这样可以避免阻塞写入的进程。
async 模式写入的文件默认不会使用 SLOG ,会在内存里排序后再落盘。

文件系统结构数据属于 special 。一般建议使用 3 块高性能 SSD RAID1 做 special vdev 。因为 special 比 SLOG 更危险。就算 SLOG 设备损坏,可以强行挂载,只是丢失 SLOG 里的新数据,其他没有写入的文件仍然完好。但是如果 special 设备丢失,整个池就彻底损毁,所以建议至少 3 度冗余。

实际上,SLOG 是最常见的错误用法,除非是跑虚拟机或数据库,否则大部分人不会用到 SLOG 。
其次是 L2ARC ,因为 L2ARC 需要内存 ARC 做索引,使用不当反而会挤占内存。L2ARC 是内存加满之后才需要考虑的选项。
special 是最少人用的。原因也很简单,听起来就很危险。但是它对小文件性能的影响也是最大的。
ryd994
4 月 16 日
@mrzx 另外,如果想用好 zfs 的特性的话,我觉得这事可以这样做:每天新建一个 dataset ,删除的时候直接删 dataset 会比 rm -r 更快。因为 rm -r 或者 rsync 都是穷举所有文件,然后一个一个文件删除。删 dataset 是直接删文件系统索引。

又或者,邪教:checkpoint 。缺点是必须单独一个 zpool 。因为 checkpoint 是整个 zpool 级别的操作,只允许有一个。可以全局回档。本意是对 zpool 进行高风险操作时有一次回档的机会。比如加 vdev 加错了就只能格盘。
mrzx
4 月 16 日
@ryd994 学习了.
swordsmile
4 月 16 日
@ryd994 #17 感谢大神提供的思路。
CapNemo
4 月 16 日
能直接从 host 侧下手吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1206234

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX