在芯片研发环境中,PDK、EDA 工具库、公共 CAD 数据等目录通常具有几个特点:
- 文件数量多,小文件多;
- 目录层级深;
- 可能存在大量符号链接;
- 对目录结构、mtime、软链接语义比较敏感;
- 迁移过程中不希望误删目标端已有数据。
本文记录一种使用 rclone 在 Linux 环境下同步 PDK 目录的方法。场景假设为:从一个已挂载的 NFS 目录 /data/pdk/ 同步到目标目录 ~/rclone_test_dir/。由于是 PDK 小文件目录,本文重点使用 rclone copy,并通过 --transfers 与 --checkers 提升并发能力。
1. 下载 Linux 64-bit 版本 rclone
rclone 官方下载页面:
1
https://rclone.org/downloads/
进入页面后,选择:
1
Linux -> Intel/AMD - 64 Bit
下载得到类似如下文件:
1
rclone-v1.74.2-linux-amd64.zip
如果红区服务器可以访问外网,也可以直接下载当前 Linux AMD64 版本:
1
wget https://downloads.rclone.org/rclone-current-linux-amd64.zip
如果红区不能直接访问外网,则可以先在可联网环境下载 rclone-v1.74.2-linux-amd64.zip,再通过合规的数据摆渡方式放入红区。
2. 在红区解压 rclone
假设压缩包已经放到红区服务器的如下目录:
1
/home/wanlin.wang/rclone_test/
进入目录并解压:
1
2
cd /home/wanlin.wang/rclone_test
unzip rclone-v1.74.2-linux-amd64.zip
解压后目录类似:
1
/home/wanlin.wang/rclone_test/rclone-v1.74.2-linux-amd64/
给 rclone 加执行权限:
1
chmod +x /home/wanlin.wang/rclone_test/rclone-v1.74.2-linux-amd64/rclone
检查版本:
1
/home/wanlin.wang/rclone_test/rclone-v1.74.2-linux-amd64/rclone version
3. 通过 EPEL 仓库安装 rclone(可选)
如果红区服务器可以访问 EPEL 仓库,或者内网已经配置好 EPEL 镜像,则可以直接通过包管理器安装 rclone,省去手工下载和解压的步骤。
在 RHEL / CentOS / Rocky / AlmaLinux 上:
1
2
3
4
5
# 先安装 epel-release
sudo yum install -y epel-release
# 再安装 rclone
sudo yum install -y rclone
或者使用 dnf:
1
2
sudo dnf install -y epel-release
sudo dnf install -y rclone
安装完成后 rclone 一般位于:
1
/usr/bin/rclone
检查版本:
1
rclone version
注意:
- EPEL 仓库中的 rclone 版本通常会比官方最新版略旧,如果有较新特性的依赖,建议仍然使用官方下载的 zip 包;
-
如果使用 EPEL 安装,下文示例中的:
1
/home/wanlin.wang/rclone_test/rclone-v1.74.2-linux-amd64/rclone
可以直接替换为:
1
/usr/bin/rclone
或者在 shell 中直接调用
rclone,不再需要写全路径。
4. 本次同步目录约定
本文命令使用如下路径:
1
2
3
rclone 程序路径:/home/wanlin.wang/rclone_test/rclone-v1.74.2-linux-amd64/rclone
源目录: /data/pdk/
目标目录: ~/rclone_test_dir/
注意:
1
/data/pdk/ 里面的内容 -> ~/rclone_test_dir/ 里面
也就是说,下面命令不会在目标端自动再创建一层 CAD 目录。
如果希望目标端保留 CAD 这一层目录,应将目标目录改为:
1
~/rclone_test_dir/CAD/
5. 并发参数建议
对于 PDK 这类小文件目录,建议优先提高文件级并发,而不是开启单个大文件的多线程传输。
推荐起步值:
1
2
3
--transfers 48
--checkers 96
--multi-thread-streams 0
含义如下:
--transfers 48:同时传输 48 个文件;--checkers 96:同时检查 96 个文件;--multi-thread-streams 0:关闭单个大文件的多线程分片传输。
如果 NFS Server 压力较大,可以降为:
1
2
3
--transfers 24
--checkers 48
--multi-thread-streams 0
如果 NFS Server、网络和目标存储都比较稳,可以再尝试:
1
2
3
--transfers 64
--checkers 128
--multi-thread-streams 0
6. csh / tcsh 使用命令
6.1 dry-run 预演
正式同步前,建议先执行 dry-run:
set RCLONE = "/home/wanlin.wang/rclone_test/rclone-v1.74.2-linux-amd64/rclone"
set SRC = "/data/pdk/"
set DST = "$HOME/rclone_test_dir/"
mkdir -p "$DST"
"$RCLONE" copy "$SRC" "$DST" \
--dry-run \
-P \
-vv \
--stats 30s \
--transfers 48 \
--checkers 96 \
--multi-thread-streams 0 \
--links \
--create-empty-src-dirs \
--one-file-system \
--retries 10 \
--retries-sleep 30s \
--timeout 10m \
--log-file "$HOME/rclone_pdk_dryrun.log"
6.2 正式同步
确认 dry-run 没有问题后,执行正式同步:
set RCLONE = "/home/wanlin.wang/rclone_test/rclone-v1.74.2-linux-amd64/rclone"
set SRC = "/data/pdk/"
set DST = "$HOME/rclone_test_dir/"
set TS = `date +%Y%m%d_%H%M%S`
set LOG = "$HOME/rclone_pdk_$TS.log"
mkdir -p "$DST"
"$RCLONE" copy "$SRC" "$DST" \
-P \
-vv \
--stats 30s \
--transfers 48 \
--checkers 96 \
--multi-thread-streams 0 \
--links \
--create-empty-src-dirs \
--one-file-system \
--retries 10 \
--retries-sleep 30s \
--timeout 10m \
--log-file "$LOG"
6.3 同步后检查
set RCLONE = "/home/wanlin.wang/rclone_test/rclone-v1.74.2-linux-amd64/rclone"
"$RCLONE" check /data/pdk/ "$HOME/rclone_test_dir/" \
--one-file-system \
--links \
-P \
-vv \
--log-file "$HOME/rclone_pdk_check.log"
7. bash 使用命令
7.1 dry-run 预演
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/env bash
set -euo pipefail
RCLONE="/home/wanlin.wang/rclone_test/rclone-v1.74.2-linux-amd64/rclone"
SRC="/data/pdk/"
DST="$HOME/rclone_test_dir/"
mkdir -p "$DST"
"$RCLONE" copy "$SRC" "$DST" \
--dry-run \
-P \
-vv \
--stats 30s \
--transfers 48 \
--checkers 96 \
--multi-thread-streams 0 \
--links \
--create-empty-src-dirs \
--one-file-system \
--retries 10 \
--retries-sleep 30s \
--timeout 10m \
--log-file "$HOME/rclone_pdk_dryrun.log"
7.2 正式同步
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env bash
set -euo pipefail
RCLONE="/home/wanlin.wang/rclone_test/rclone-v1.74.2-linux-amd64/rclone"
SRC="/data/pdk/"
DST="$HOME/rclone_test_dir/"
TS="$(date +%Y%m%d_%H%M%S)"
LOG="$HOME/rclone_pdk_${TS}.log"
mkdir -p "$DST"
"$RCLONE" copy "$SRC" "$DST" \
-P \
-vv \
--stats 30s \
--transfers 48 \
--checkers 96 \
--multi-thread-streams 0 \
--links \
--create-empty-src-dirs \
--one-file-system \
--retries 10 \
--retries-sleep 30s \
--timeout 10m \
--log-file "$LOG"
7.3 同步后检查
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env bash
set -euo pipefail
RCLONE="/home/wanlin.wang/rclone_test/rclone-v1.74.2-linux-amd64/rclone"
"$RCLONE" check /data/pdk/ "$HOME/rclone_test_dir/" \
--one-file-system \
--links \
-P \
-vv \
--log-file "$HOME/rclone_pdk_check.log"
8. 参数说明
8.1 为什么使用 copy 而不是 sync
本文优先使用:
1
rclone copy
原因是 copy 不会删除目标端多余文件,适合首次迁移、测试迁移、补拷数据等场景。
如果后续确认要让目标目录与源目录完全一致,再考虑使用:
1
rclone sync
但 sync 会删除目标端多余文件,使用前必须先加 --dry-run 验证。
8.2 为什么 PDK 小文件目录关闭 multi-thread streams
PDK 目录通常不是少量超大文件,而是大量小文件。此时瓶颈往往在:
- NFS metadata 请求;
- 目录遍历;
stat/getattr;open/close;- 小文件写入延迟。
因此优先调大:
1
2
--transfers
--checkers
而不是开启单个文件的分片多线程传输。
8.3 为什么使用 –links
PDK 目录中经常存在符号链接。使用:
1
--links
表示尽量保留符号链接语义。
不建议直接使用:
1
--copy-links
因为它会跟随符号链接,把链接指向的内容复制过去,可能造成目录膨胀或破坏原有 PDK 目录结构语义。
8.4 为什么使用 –one-file-system
使用:
1
--one-file-system
可以避免 rclone 在递归时误跨入源目录下面的其他挂载点。
如果 /data/pdk/ 内部本来就有必须同步的子挂载点,则不要使用这个参数。
9. 执行时建议观察的系统指标
另开终端观察:
1
iostat -xm 2
1
nfsiostat 2
1
top
重点关注:
- NFS retrans 是否增加;
- iowait 是否明显升高;
- 目标端磁盘 await 是否持续偏高;
- 其他用户访问
/data/pdk/是否变慢; - rclone 速度是否随着并发增加而继续提升。
如果系统压力明显升高,建议从:
1
--transfers 48 --checkers 96
降到:
1
--transfers 24 --checkers 48
10. 小结
对于红区内 PDK 小文件目录同步,建议流程是:
- 从 rclone 官方下载 Linux Intel/AMD 64-bit 版本;
- 将 zip 包放入红区;
- 在红区解压,并直接使用解压目录中的
rclone可执行文件; - 先使用
rclone copy --dry-run预演; - 再使用
rclone copy正式同步; - 同步完成后使用
rclone check检查; - 首轮迁移不建议直接使用
sync,避免误删目标端文件。
对于 72 核机器与 PDK 小文件目录,推荐起步并发为:
1
--transfers 48 --checkers 96 --multi-thread-streams 0
后续根据 NFS Server、网络和目标存储压力再做调整。
参考资料
- rclone Downloads: https://rclone.org/downloads/
- rclone copy: https://rclone.org/commands/rclone_copy/
- rclone Local Filesystem backend: https://rclone.org/local/