# damocles-worker 配置指北
# sealing 任务各阶段资源消耗情况 (32 GiB 扇区)
测试机型:
- CPU: AMD EPYC 7642 (max MHz: 2300)
- GPU: RTX 3080
- Memory: DIMM DDR4 Synchronous Registered (Buffered) 2933 MHz (0.3 ns)
Stage | 并发数 | 耗时 | 内存 | CPU | GPU | DiskIO 读 | DiskIO 写 | 备注 |
---|---|---|---|---|---|---|---|---|
WindowPoSt | 1 | ~4-10mins | ~120GiB | RAYON_NUM_THREADS *100% | ✓ | TODO | - | |
WinningPoSt | 1 | ~1-10s | - | - | - | - | - | |
AddPieces | 1 | ~3mins | ~210MiB | RAYON_NUM_THREADS *100% | x | <=32GiB | 32GiB | |
TreeD | 1 | ~1min | ~47GiB | RAYON_NUM_THREADS *100% | x | 32GiB | 64GiB | 64 GiB 扇区 ~60GiB RAM |
PC1 | 1 | ~177mins | <=64GiB | 150% | x | - | 352GiB | |
PC2 | 1 | ~10-13mins | ~64GiB | RAYON_NUM_THREADS *100% | ✓ | 384GiB | ~37GiB | |
SupraPC2 | 1 | ~2-5mins | ~40GiB | ~400% | ✓ | 384GiB | ~37GiB | |
WaitSeed | - | 75mins | - | - | x | - | - | |
C1 | 1 | ~1s | - | - | x | - | - | |
C2 | 1 | ~13-16mins | TODO | RAYON_NUM_THREADS *100% | ✓ | - | - | |
SupraC2 | 1 | ~3-5mins | 128GiB | RAYON_NUM_THREADS *100% | ✓ | - | - | |
SnapEncode | 1 | ~3-5mins | TODO | RAYON_NUM_THREADS *100% | ✓ | ~32GiB(NFS) | ~32GiB(NFS) | 建议每个 GPU 并发多个 SnapEncode 任务,让 IO 并发, 减少 GPU 空闲时间 |
SnapProve | 1 | ~3-5mins | TODO | RAYON_NUM_THREADS *100% | ✓ | - | - | |
SupraSnapProve | 1 | ~3-5mins | TODO | RAYON_NUM_THREADS *100% | ✓ | ~32GiB(NFS) | ~32GiB(NFS) | |
Unseal | 1 | TODO | TODO | TODO | x | TODO | TODO |
备注: RAYON_NUM_THREADS
环境变量用于配置任务使用的线程数量,默认为 CPU 核心数。
# damocles-worker-util 工具使用
damocles-worker-util 包含一组 damocles-worker 相关的实用工具。其中包括:
- hwinfo (Hardware information)
- sealcalc (Sealing calculator)
# hwinfo
hwinfo 显示硬件信息,我们可以根据输出的硬件信息合理的配置 damocles-worker, 以便于我们更有效地利用它们。
hwinfo 当前可获取的信息如下:
- CPU 拓扑 (包括 CPU 核心数,NUMA Memory Node, CPU Cache 等)
- 磁盘信息
- GPU 信息
- 内存信息
参数说明:
damocles-worker-util-hwinfo
显示硬件信息
USAGE:
damocles-worker-util hwinfo [OPTIONS]
OPTIONS:
--full 显示完整的 CPU 拓扑信息
-h, --help 打印帮助信息
# hwinfo 依赖安装
- hwloc 2.x 用于获取 CPU 拓扑信息
- OpenCL 用于获取 GPU 信息
# hwloc 2.x 安装
# 在 Ubuntu 20.04 或之后的版本可以直接使用 apt
安装
apt install hwloc=2.\*
# 源码安装:
# 安装必要的工具.
apt install -y wget make gcc
# 下载 hwloc-2.7.1.tar.gz
wget https://download.open-mpi.org/release/hwloc/v2.7/hwloc-2.7.1.tar.gz
tar -zxpf hwloc-2.7.1.tar.gz
cd hwloc-2.7.1
./configure --prefix=/usr/local
make -j$(nproc)
sudo make install
ldconfig /usr/local/lib
# OpenCL 安装
apt install ocl-icd-opencl-dev
# hwinfo 实例
在一台有 2 个 32 核 CPU 的机器上运行:
damocles-worker-util hwinfo
输出:
CPU topology:
Machine (503.55 GiB)
├── Package (251.57 GiB) (*** *** *** 32-Core Processor)
│ ├── NUMANode (#0 251.57 GiB)
│ ├── L3 (#0 16 MiB)
│ │ └── PU #0 + PU #1 + PU #2 + PU #3
│ ├── L3 (#1 16 MiB)
│ │ └── PU #4 + PU #5 + PU #6 + PU #7
│ ├── L3 (#2 16 MiB)
│ │ └── PU #8 + PU #9 + PU #10 + PU #11
│ ├── L3 (#3 16 MiB)
│ │ └── PU #12 + PU #13 + PU #14 + PU #15
│ ├── L3 (#4 16 MiB)
│ │ └── PU #16 + PU #17 + PU #18 + PU #19
│ ├── L3 (#5 16 MiB)
│ │ └── PU #20 + PU #21 + PU #22 + PU #23
│ ├── L3 (#6 16 MiB)
│ │ └── PU #24 + PU #25 + PU #26 + PU #27
│ └── L3 (#7 16 MiB)
│ └── PU #28 + PU #29 + PU #30 + PU #31
└── Package (251.98 GiB) (*** *** *** 32-Core Processor)
├── NUMANode (#1 251.98 GiB)
├── L3 (#8 16 MiB)
│ └── PU #32 + PU #33 + PU #34 + PU #35
├── L3 (#9 16 MiB)
│ └── PU #36 + PU #37 + PU #38 + PU #39
├── L3 (#10 16 MiB)
│ └── PU #40 + PU #41 + PU #42 + PU #43
├── L3 (#11 16 MiB)
│ └── PU #44 + PU #45 + PU #46 + PU #47
├── L3 (#12 16 MiB)
│ └── PU #48 + PU #49 + PU #50 + PU #51
├── L3 (#13 16 MiB)
│ └── PU #52 + PU #53 + PU #54 + PU #55
├── L3 (#14 16 MiB)
│ └── PU #56 + PU #57 + PU #58 + PU #59
└── L3 (#15 16 MiB)
└── PU #60 + PU #61 + PU #62 + PU #63
Disks:
╭───────────┬─────────────┬─────────────┬────────────┬───────────────────────────────────────╮
│ Disk type │ Device name │ Mount point │ Filesystem │ Space │
├───────────┼─────────────┼─────────────┼────────────┼───────────────────────────────────────┤
│ SSD │ /dev/sda3 │ / │ ext4 │ 346.87 GiB / 434.68 GiB (79.80% used) │
├───────────┼─────────────┼─────────────┼────────────┼───────────────────────────────────────┤
│ SSD │ /dev/sda2 │ /boot │ ext4 │ 675.00 MiB / 3.87 GiB (17.01% used) │
├───────────┼─────────────┼─────────────┼────────────┼───────────────────────────────────────┤
│ SSD │ /dev/md127 │ /mnt/mount │ ext4 │ 4.83 TiB / 13.86 TiB (34.86% used) │
╰───────────┴─────────────┴─────────────┴────────────┴───────────────────────────────────────╯
GPU:
╭─────────────────────────┬────────┬───────────╮
│ Name │ Vendor │ Memory │
├─────────────────────────┼────────┼───────────┤
│ NVIDIA GeForce RTX 3080 │ NVIDIA │ 9.78 GiB │
├─────────────────────────┼────────┼───────────┤
│ NVIDIA GeForce RTX 3080 │ NVIDIA │ 9.78 GiB │
├─────────────────────────┼────────┼───────────┤
│ NVIDIA GeForce RTX 3080 │ NVIDIA │ 9.78 GiB │
╰─────────────────────────┴────────┴───────────╯
Memory:
╭──────────────┬───────────────────┬────────────┬─────────────╮
│ Total memory │ Used memory │ Total swap │ Used swap │
├──────────────┼───────────────────┼────────────┼─────────────┤
│ 515.63 GiB │ 33.51 GiB (6.50%) │ 0 B │ 0 B (0.00%) │
╰──────────────┴───────────────────┴────────────┴─────────────╯
从输出 CPU topology 信息来看,这台机器有两个 NUMANode:
- NUMANode #0 的 CPU 集合:0-31
- NUMANode #1 的 CPU 集合:32-63
我们可以在 damocles-worker 的配置文件中修改外部执行器配置组 ([[[processors.{stage_name}]]](./03.damocles-worker 的配置解析.md#processorsstage_name))
通过 cgroup.cpuset
+ numa_preferred
配置项限制该外部执行仅使用指定的 NUMANode 中的 CPU, 内存也尽量优先从该 NUMANode 中分配,进而提高 CPU 工作效率 (damocles v0.5.0 之后,支持加载 NUMA 亲和的 hugepage 内存文件,如果启用该功能可以跨 NUMA 节点分配 cpuset 不会产生影响)。
例:
# damocles-worker.toml
[[processors.{stage_name}]]
numa_preferred = 0
cgroup.cpuset = "0-3"
# ...
[[processors.{stage_name}]]
numa_preferred = 1
cgroup.cpuset = "32-35"
# ...
# sealcalc
sealcalc 通过给定的参数计算出各个时间段每个阶段任务的运行状态,可以通过调整各任务的最大并发数量以及 sealing_threads
来达到封装效率的最大化。
参数说明:
USAGE:
damocles-worker-util sealcalc [OPTIONS] --tree_d_mins <tree_d_mins> --tree_d_concurrent <tree_d_concurrent> --pc1_mins <pc1_mins> --pc1_concurrent <pc1_concurrent> --pc2_mins <pc2_mins> --pc2_concurrent <pc2_concurrent> --c2_mins <c2_mins> --c2_concurrent <c2_concurrent> --sealing_threads <sealing_threads>
OPTIONS:
--c2_concurrent <c2_concurrent> 指定 c2 阶段的最大并发数量
--c2_mins <c2_mins> 指定单次执行 c2 阶段的任务的时间, 单位: 分钟
--calculate_days <calculate_days> 计算总时长, 单位: 天 [默认: 30]
--calculate_step_mins <calculate_step_mins> 输出的步长, 单位: 分钟 [默认: 60], 如果此值为 60 则每行结果间隔 1 小时
--csv 以 csv 格式输出结果
-h, --help 打印帮助信息
--pc1_concurrent <pc1_concurrent> 指定 pc1 阶段的最大并发数量
--pc1_mins <pc1_mins> 指定单次执行 pc1 阶段的任务所需的时间, 单位: 分钟
--pc2_concurrent <pc2_concurrent> 指定 pc2 阶段的最大并发数量
--pc2_mins <pc2_mins> 指定单次执行 pc2 阶段的任务所需的时间, 单位: 分钟
--sealing_threads <sealing_threads> 指定 sealing_threads 工作线程的数量
--seed_mins <seed_mins> 指定等待 seed 的时长, 单位: 分钟 [默认: 80]
--tree_d_concurrent <tree_d_concurrent> 指定 tree_d 阶段的最大并发数量
--tree_d_mins <tree_d_mins> 指定单次执行 tree_d 阶段的任务的时间, 单位: 分钟
# sealcalc 实例:
# 固定的参数:
- tree_d 任务执行所需时间:10 分钟
- pc1 任务执行所需时间:320 分钟
- pc2 任务执行所需时间:25 分钟
- c2 任务执行所需时间:18 分钟
# 可调整的参数:
- sealing_threads 工作线程数量:18
- tree_d 最大并发数:2
- pc1 最大并发数:10
- pc2 最大并发数:5
- c2 最大并发数:2
damocles-worker-util sealcalc --tree_d_mins=10 --pc1_mins=320 --pc2_mins=1 --c2_mins=2 --tree_d_concurrent=2 --pc1_concurrent=10 --pc2_concurrent=5 --c2_concurrent=2 --sealing_threads=18
输出如下:
┌sealing calculator─────────────────────────────────────────────────────┐
│time sealing tree_d pc1 pc2 wait c2 finished│
│(mins) threads (...) (...) (...) seed (...) sectors │
│ │
│0 2/18 2/2 0/10 0/5 0 0/2 0 │
│60 14/18 2/2 10/10 0/5 0 0/2 0 │
│120 18/18 0/2 10/10 0/5 0 0/2 0 │
│180 18/18 0/2 10/10 0/5 0 0/2 0 │
│240 18/18 0/2 10/10 0/5 0 0/2 0 │
│300 18/18 0/2 10/10 0/5 0 0/2 0 │
│360 18/18 0/2 10/10 2/5 6 0/2 0 │
│420 18/18 2/2 8/10 0/5 8 0/2 2 │
│480 18/18 0/2 10/10 0/5 0 0/2 10 │
│540 18/18 0/2 10/10 0/5 0 0/2 10 │
│600 18/18 0/2 10/10 0/5 0 0/2 10 │
│660 18/18 0/2 10/10 2/5 2 0/2 10 │
│720 18/18 0/2 10/10 0/5 8 0/2 10 │
│780 18/18 0/2 10/10 0/5 2 0/2 18 │
│840 18/18 0/2 10/10 0/5 0 0/2 20 │
│900 18/18 0/2 10/10 0/5 0 0/2 20 │
│960 18/18 0/2 10/10 0/5 0 0/2 20 │
│1020 18/18 0/2 10/10 0/5 8 0/2 20 │
│1080 18/18 2/2 10/10 0/5 4 0/2 26 │
│1140 18/18 0/2 10/10 0/5 2 0/2 28 │
│1200 18/18 0/2 10/10 0/5 0 0/2 30 │
│1260 18/18 0/2 10/10 0/5 0 0/2 30 │
│1320 18/18 0/2 10/10 2/5 6 0/2 30 │
│1380 18/18 2/2 10/10 0/5 6 0/2 32 │
│1440 18/18 0/2 10/10 0/5 2 0/2 38 │
│1500 18/18 0/2 10/10 0/5 0 0/2 40 │
│1560 18/18 0/2 10/10 0/5 0 0/2 40 │
│1620 18/18 0/2 10/10 2/5 2 0/2 40 │
│1680 18/18 0/2 10/10 0/5 8 0/2 40 │
│1740 18/18 0/2 10/10 0/5 2 0/2 48 │
└───────────────────────────────────────────────────────────────────────┘
方向键可以翻页
输出结果各列说明:
- time (mins): 时间,单位分钟。输出的每一项数据都是在此时间的运行结果
- sealing thread (running/total): 封装线程状态 (正在运行的线程/总线程)
- tree_d (running/total): tree_d 阶段的任务状态 (正在运行的任务数量/总任务数量)
- pc1 (running/total): pc1 阶段的任务状态 (正在运行的任务数量/总任务数量)
- pc2 (running/total): pc2 阶段的任务状态 (正在运行的任务数量/总任务数量)
- wait seed: 等待 seed 的任务数量
- c2 (running/total): c2 阶段的任务状态 (正在运行的任务数量/总任务数量)
- finish sector: 当前时间已完成的扇区
我们可以通过不断的调整更合理的上述的可调整的参数, 来达到封装效率的最大化。这些参数可以给 damocles-worker 的配置作为参考。