# 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:

  1. NUMANode #0 的 CPU 集合:0-31
  2. 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 的配置作为参考。