在芯片研发环境中,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

而不是开启单个文件的分片多线程传输。

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 小文件目录同步,建议流程是:

  1. 从 rclone 官方下载 Linux Intel/AMD 64-bit 版本;
  2. 将 zip 包放入红区;
  3. 在红区解压,并直接使用解压目录中的 rclone 可执行文件;
  4. 先使用 rclone copy --dry-run 预演;
  5. 再使用 rclone copy 正式同步;
  6. 同步完成后使用 rclone check 检查;
  7. 首轮迁移不建议直接使用 sync,避免误删目标端文件。

对于 72 核机器与 PDK 小文件目录,推荐起步并发为:

1
--transfers 48 --checkers 96 --multi-thread-streams 0

后续根据 NFS Server、网络和目标存储压力再做调整。

参考资料