FileCoin 挖矿教程(五)之五:如何最优地设置seal workers(密封工人)

Lotus Worker 是一个单独的应用程序,可用于将密封过程的各个阶段卸载到单独的机器或过程。本指南解释了如何设置一个或多个 Lotus Workers。虽然 Lotus Miner 默认运行每个密封阶段,但您可以使用 Lotus Workers 创建密封管道以提高资源利用率。密封管道将 Lotus Miner 从 CPU 密集型任务中解放出来,专注于执行和提交 WindowPoST 和 WinningPoST 到链。

Lotus Workers 中的资源分配

每个 Lotus Worker 可以运行多个任务,具体取决于您的硬件资源。每个槽称为一个窗口。最终数量取决于可用处理器核的数量以及分配给它的密封阶段的要求。这意味着一个带有单个 GPU 的 8 核 CPU 上的单个工作程序最多可以运行:
  1. CPU 多线程数将被使用
  2. 保证顺畅运行的最小RAM的容量
  3. 运行任务所需的最大 RAM 量,系统可以将部分 RAM 迁移到磁盘,性能不会受到太大影响。
  4. 系统是否可以使用GPU

任务资源表

默认资源表位于 resources.go,可以编辑以调整计划行为以更好地适应特定的密封集群。 默认资源值表。其中一些值相当保守:
扇区大小任务类型线程最小 RAM最小磁盘空间GPU
32GAddPiece1*4G4G
PreCommit11**56G64G
PreCommit292%***15G15G如果存在
Commit10****1G1G
Commit292%***32G+30G32G+150G如果存在
64GAddPiece1*8G8G
PreCommit11**112G128G
PreCommit292%***30G30G如果存在
Commit10****1G1G
Commit292%***64G+60G64G+190G如果存在
*AddPiece 可以使用多个线程,这个值很可能在不久的将来会改变 ** 与 FIL_PROOFS_USE_MULTICORE_SDR=1 环境变量一起使用时,PreCommit1 可以使用多个内核(最多共享 L3 缓存的内核数量) *** 根据可用线程的数量,此值表示:
 12  * 0.92 = 11
 16  * 0.92 = 14
 24  * 0.92 = 22
 32  * 0.92 = 29
 64  * 0.92 = 58
 128 * 0.92 = 117
**** Commit1 步骤在 CPU 时间方面非常便宜,并且会阻塞 Commit2 步骤。将其分配给 0号 线程使其更有可能以更高的优先级进行调度。 Unseal 任务与 PreCommit1 任务具有相同的资源使用。

Resource windows

调度器使用资源窗口的概念来防止需要大量资源的任务被具有较小资源需求的任务造成资源匮乏。 资源窗口只是一桶密封任务,可以由给定的 worker 根据 worker 在没有任务运行时可用的资源并行运行。 在调度程序中,每个 worker 都有:
  1. 调度窗口 - 两个资源窗口,用于从全局队列中分配要执行的任务
  2. 准备窗口 - 一个资源窗口,任务准备在其中执行(例如,如果需要,获取扇区数据)
  3. 执行窗口 - 当前正在执行的任务的一个资源窗口
当任务到达全局调度队列时,调度器会寻找空的调度窗口,并基于多种因素,比如worker是否已经可以直接访问扇区数据、worker支持的任务类型、worker是否有磁盘扇区数据空间,任务优先级 - 任务可以分配给调度窗口。 在一个调度窗口被大量任务填满后,它被发送给工作人员进行处理。工作人员将从调度窗口中拉出任务并在准备窗口中开始准备它们。准备步骤完成后,任务将在执行窗口中执行。 在worker处理完一个调度窗口后,它被发送回全局调度器以获得更多的密封任务。

任务优先级

当调度程序决定运行哪些任务时,它会考虑运行特定任务的优先级。 有两个优先级层 - 高优先级,用于执行成本低但阻止其他操作的任务,以及所有其他任务的正常优先级。默认优先级在下表中定义。
任务类型优先
AddPiece6
PreCommit15
PreCommit24
Commit23
Commit12
Unseal1
Fetch-1
ReadUnsealed-1
Finalize-2
  • 较低的数字意味着较高的优先级。
  • 负数表示最高优先级。
比较任务优先级时:
  • 优先考虑高优先级任务
  • 有交易的扇区被视为第二(更多交易增加更多优先级)
  • 如果以上相等,则根据表中的优先级选择任务
  • 如果以上相等,则选择扇区号较低的扇区(这可以在向链提交消息时稍微优化 gas 使用)

安装

在密封期间,大量数据在 worker 之间移动/复制,因此他们之间必须有良好的网络连接。 lotus-worker 按照安装指南,该应用程序应该已经与其他应用程序一起构建和安装。为简单起见,我们建议在将运行 Lotus Workers 的机器中遵循相同的过程(仅构建二进制文件所需的步骤)。

设置 Lotus Miner

Lotus Miner 需要准备好接受来自 worker 的 API 连接。

允许外部连接到 Miner API

设置ListenAddressRemoteListenAddress到本地网络接口的IP作为记录在这里。为了安全起见,API 端口不应向 Internet 开放。

获取身份验证令牌

lotus-miner auth api-info --perm admin
Lotus Workers 将需要这个令牌来连接到 Lotus Miner。 具体详情,请打开这里:https://blog.csdn.net/weixin_46596227/article/details/114676918

配置 Lotus Miner 密封功能

Lotus Miner 本身就是一名 Worker ,并将像其他 Worker 一样为密封作业做出贡献。根据您希望Worker执行的密封过程的哪个阶段,您可以选择配置 Lotus Miner 将直接执行的阶段。这是在Lotus Miner 的 config.toml 的存储扇区完成设置:
[Storage]
  AllowAddPiece = true
  AllowPreCommit1 = true
  AllowPreCommit2 = true
  AllowCommit = true
  AllowUnseal = true
如果您想将这些操作中的任何一个完全委托给 Worker ,请将它们设置为false.

启动 Lotus Worker

环境变量

确保工作人员在运行时可以访问以下环境变量。
# MINER_API_INFO as obtained before
export TMPDIR=/fast/disk/folder3                    # used when sealing
export MINER_API_INFO:<TOKEN>:/ip4/<miner_api_address>/tcp/<port>/http`
export BELLMAN_CPU_UTILIZATION=0.875      # optimal value depends on exact hardware
export FIL_PROOFS_MAXIMIZE_CACHING=1
export FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1 # when GPU is available
export FIL_PROOFS_USE_GPU_TREE_BUILDER=1   # when GPU is available
export FIL_PROOFS_PARAMETER_CACHE=/fast/disk/folder # > 100GiB!
export FIL_PROOFS_PARENT_CACHE=/fast/disk/folder2   # > 50GiB!

# The following increases speed of PreCommit1 at the cost of using a full
# CPU core-complex rather than a single core.
# See https://github.com/filecoin-project/rust-fil-proofs/ and the
# "Worker co-location" section below.
export FIL_PROOFS_USE_MULTICORE_SDR=1
最初获取参数文件时,记得在从中国运行时设置 IPFS_GATEWAY变量,请参考:https://blog.csdn.net/weixin_46596227/article/details/114666646

运行 Worker

lotus-worker run <flags>
上面的命令将启动工作程序。根据您希望 worker 执行的操作以及它运行的硬件,您需要指定 worker 将使其自身可用的密封阶段:
   --addpiece                    enable addpiece (default: true)
   --precommit1                  enable precommit1 (32G sectors: 1 core, 128GiB RAM) (default: true)
   --unseal                      enable unsealing (32G sectors: 1 core, 128GiB RAM) (default: true)
   --precommit2                  enable precommit2 (32G sectors: multiple cores, 96GiB RAM) (default: true)
   --commit                      enable commit (32G sectors: multiple cores or GPUs, 128GiB RAM + 64GiB swap) (default: true)
一旦 worker 运行,它应该连接到 Lotus miner。您可以通过以下方式验证:
$ lotus-miner sealing workers
Worker 0, host computer
        CPU:  [                                                                ] 0 core(s) in use
        RAM:  [||||||||||||||||||                                              ] 28% 18.1 GiB/62.7 GiB
        VMEM: [||||||||||||||||||                                              ] 28% 18.1 GiB/62.7 GiB
        GPU: GeForce RTX 2080, not used

Worker 1, host othercomputer
        CPU:  [                                                                ] 0 core(s) in use
        RAM:  [||||||||||||||                                                  ] 23% 14 GiB/62.7 GiB
        VMEM: [||||||||||||||                                                  ] 23% 14 GiB/62.7 GiB
        GPU: GeForce RTX 2080, not used

Miner 和 worker 协同

您可以在与Lotus Miner相同的机器上运行Lotus Worker。这有助于管理进程之间的优先级或更好地为每个任务分配可用的 CPU。为避免冲突,我们建议在Miner密封配置中禁用所有任务类型。 此外,请注意密封过程使用的本地资源(尤其是 CPU)。WindowPoST 是 CPU 密集型的,需要由矿工定期提交。如果矿工在并行执行其他受 CPU 限制的密封操作,则可能无法及时提交 WindowPoST,从而在此过程中丢失抵押品。出于这个原因,我们建议为 Lotus Miners 和 Lotus Workers 仔细分配可用的 CPU 内核和密封阶段。 请注意,如果您将Miner 和 worker放在一起,则不需要打开矿工 API,它可以继续监听本地接口。

Lotus Worker 之间协同

在大多数情况下,每台机器应该只运行一个 Lotus Worker,因为它lotus-worker会尝试使用所有可用资源。在一个操作系统上下文中运行多个 Lotus Workers 会导致资源分配问题,这将导致调度程序分配比可用资源更多的工作。 每台机器运行多个 worker 可能是一个好主意的唯一情况是当有多个 GPU 可用时,因为 lotus 目前只支持单个 GPU - 在这种情况下,建议在具有非重叠资源的单独容器中运行 worker(单独的CPU 内核、单独的 RAM 分配、单独的 GPU)

分离 Nvidia GPU

使用专有 Nvidia 驱动程序时,可以通过设置 NVIDIA_VISIBLE_DEVICES=[device number] 的环境变量,来决定要使用哪个GPU。 运行以下命令用于获取设备编号:
nvidia-smi -L