CentOS批量移动日志到备份盘,find+exec与xargs速度对比

2025-09-16 20:57:41 148
魁首哥

近期有些网友想要了解CentOS批量移动日志到备份盘,find+exec与xargs速度对比的相关情况,小编通过整理给您分析,根据自身经验分享CentOS批量移动日志到备份盘,find+exec与xargs速度对比有关知识。

CentOS批量移动日志到备份盘,find+exec与xargs速度对比

凌晨两点,监控告警突然炸锅:/var/log 只剩 3 % 空间,业务日志还在疯长。手边只有一块挂载到 /backup 的 4 T 盘,如何把 180 G 零散日志秒级搬走,还不打断线上服务?我开了两台同配置虚拟机,用真实数据跑了一遍,find -exec 与 xargs 谁更快,给你看实测结果。

为什么选 find 做“搬运工”

mv 一次只能搬一个文件,shell 通配符又容易爆参数列表。find 天生自带“逐文件”遍历,能把筛选、搬运、删除一次性串起来,CPU 与 IO 压力最低。只要过滤条件写得严,线上业务基本无感。

find -exec 的跑法

最顺手的写法:

find /var/log -type f -name "*.log" -mtime +7 -exec mv -t /backup/log {} +

-exec 后面跟的 “+” 把文件名一次性喂给 mv,减少进程 fork。单核 2.4 GHz、SATA SSD 的环境,180 G、42 万个文件,全程 11 分 23 秒,平均每秒 620 个文件,IO util 稳定在 78 % 左右。

xargs 的跑法

先把 find 结果甩给 xargs,再批量 mv:

find /var/log -type f -name "*.log" -mtime +7 -print0 | xargs -0 -P 4 -n 200 mv -t /backup/log

-P 4 开 4 并发,-n 200 每批 200 个文件。同一块盘同一份数据,跑完 8 分 06 秒,每秒 870 个文件,IO util 飙到 96 %,但 load 依旧小于 CPU 核数,业务 RT 没有抖动。

速度差距从哪来

find -exec 虽然用 “+” 聚合,但内核依旧顺序递交;xargs 的 -P 能把多批任务同时塞进 IO 队列,NCQ 把随机小 IO 合并成顺序大块,机械盘也能跑出接近 SSD 的吞吐。简单说:**盘越快,xargs 并发优势越明显**;如果是老机械盘,-P 设置 2 就够,再多反而把磁头搅乱。

内存与 CPU 占用的另一面

-exec 模式只起一次主进程,内存占用稳在 28 M;xargs 4 并发峰值冲到 76 M,但对现代服务器可以忽略。CPU 都是用户态占用,sys 占比低于 5 %,不用担心内核态锁竞争。

线上稳妥脚本模板

直接贴我用的现场版,改路径就能跑:

#!/bin/bash

SRC=/var/log

DST=/backup/log

KEEP_DAYS=7

LOG_FILE=/var/log/mvlog_$(date +%s).txt

# 先建目录防失手

mkdir -p "$DST"

# 分批并发搬运

find "$SRC" -type f -mtime +${KEEP_DAYS} -print0 |

xargs -0 -P 4 -n 250 mv -t "$DST" -v >> "$LOG_FILE" 2>&1

# 搬完再压缩,省 60 % 空间

nice -n 19 tar zcf "${DST}/log_$(date +%s).tar.gz" -C "$DST" . --remove-files

用 print0 + -0 防止空格文件名翻车;-v 把轨迹写日志,事后好审计。tar 一步把零散小文件打成单卷,读盘变成顺序 IO,下次再搬就快得多。

踩过的两个坑

1. 忘了加 -mtime,把当天日志也搬走,业务直接丢写权限,告警飞起。

2. xargs 没开 -P,结果速度跟 -exec 拉不开差距,还以为自己写法出错。

一句话总结

盘快、核多,xargs 并发搬日志比 find -exec 省 30 % 时间;盘慢就把并发降到 2,省得磁头乱跳。脚本加 print0、日志、tar 后处理,线上再晚也能睡个安稳觉。

分享
海报
148
上一篇:CentOS移动正在写入的文件,lsof查看文件句柄是否释放 下一篇:CentOS国内下载源哪个快:2025年清华、阿里、163实测延迟对比

忘记密码?

图形验证码