Lotus Worker 是一个单独的应用程序,可用于将密封过程的各个阶段卸载到单独的机器或过程。本指南解释了如何设置一个或多个 Lotus Workers。虽然 Lotus Miner 默认运行每个密封阶段,但您可以使用 Lotus Workers 创建密封管道以提高资源利用率。密封管道将 Lotus Miner 从 CPU 密集型任务中解放出来,专注于执行和提交 WindowPoST 和 WinningPoST 到链。
每个 Lotus Worker 可以运行多个任务,具体取决于您的硬件资源。每个槽称为一个窗口。最终数量取决于可用处理器核的数量以及分配给它的密封阶段的要求。这意味着一个带有单个 GPU 的 8 核 CPU 上的单个工作程序最多可以运行:
默认资源表位于 resources.go,可以编辑以调整计划行为以更好地适应特定的密封集群。
默认资源值表。其中一些值相当保守:
扇区大小 | 任务类型 | 线程 | 最小 RAM | 最小磁盘空间 | GPU |
---|---|---|---|---|---|
32G | AddPiece | 1* | 4G | 4G | |
PreCommit1 | 1** | 56G | 64G | ||
PreCommit2 | 92%*** | 15G | 15G | 如果存在 | |
Commit1 | 0**** | 1G | 1G | ||
Commit2 | 92%*** | 32G+30G | 32G+150G | 如果存在 | |
64G | AddPiece | 1* | 8G | 8G | |
PreCommit1 | 1** | 112G | 128G | ||
PreCommit2 | 92%*** | 30G | 30G | 如果存在 | |
Commit1 | 0**** | 1G | 1G | ||
Commit2 | 92%*** | 64G+60G | 64G+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 任务具有相同的资源使用。
调度器使用资源窗口的概念来防止需要大量资源的任务被具有较小资源需求的任务造成资源匮乏。
资源窗口只是一桶密封任务,可以由给定的 worker 根据 worker 在没有任务运行时可用的资源并行运行。
在调度程序中,每个 worker 都有:
当任务到达全局调度队列时,调度器会寻找空的调度窗口,并基于多种因素,比如worker是否已经可以直接访问扇区数据、worker支持的任务类型、worker是否有磁盘扇区数据空间,任务优先级 - 任务可以分配给调度窗口。
在一个调度窗口被大量任务填满后,它被发送给工作人员进行处理。工作人员将从调度窗口中拉出任务并在准备窗口中开始准备它们。准备步骤完成后,任务将在执行窗口中执行。
在worker处理完一个调度窗口后,它被发送回全局调度器以获得更多的密封任务。
当调度程序决定运行哪些任务时,它会考虑运行特定任务的优先级。
有两个优先级层 - 高优先级,用于执行成本低但阻止其他操作的任务,以及所有其他任务的正常优先级。默认优先级在下表中定义。
任务类型 | 优先 |
---|---|
AddPiece | 6 |
PreCommit1 | 5 |
PreCommit2 | 4 |
Commit2 | 3 |
Commit1 | 2 |
Unseal | 1 |
Fetch | -1 |
ReadUnsealed | -1 |
Finalize | -2 |
比较任务优先级时:
在密封期间,大量数据在 worker 之间移动/复制,因此他们之间必须有良好的网络连接。
lotus-worker 按照安装指南,该应用程序应该已经与其他应用程序一起构建和安装。为简单起见,我们建议在将运行 Lotus Workers 的机器中遵循相同的过程(仅构建二进制文件所需的步骤)。
Lotus Miner 需要准备好接受来自 worker 的 API 连接。
设置ListenAddress并RemoteListenAddress到本地网络接口的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 本身就是一名 Worker ,并将像其他 Worker 一样为密封作业做出贡献。根据您希望Worker执行的密封过程的哪个阶段,您可以选择配置 Lotus Miner 将直接执行的阶段。这是在Lotus Miner 的 config.toml 的存储扇区完成设置:
[Storage] AllowAddPiece = true AllowPreCommit1 = true AllowPreCommit2 = true AllowCommit = true AllowUnseal = true
如果您想将这些操作中的任何一个完全委托给 Worker ,请将它们设置为false.
确保工作人员在运行时可以访问以下环境变量。
# 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
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
您可以在与Lotus Miner相同的机器上运行Lotus Worker。这有助于管理进程之间的优先级或更好地为每个任务分配可用的 CPU。为避免冲突,我们建议在Miner密封配置中禁用所有任务类型。
此外,请注意密封过程使用的本地资源(尤其是 CPU)。WindowPoST 是 CPU 密集型的,需要由矿工定期提交。如果矿工在并行执行其他受 CPU 限制的密封操作,则可能无法及时提交 WindowPoST,从而在此过程中丢失抵押品。出于这个原因,我们建议为 Lotus Miners 和 Lotus Workers 仔细分配可用的 CPU 内核和密封阶段。
请注意,如果您将Miner 和 worker放在一起,则不需要打开矿工 API,它可以继续监听本地接口。
在大多数情况下,每台机器应该只运行一个 Lotus Worker,因为它lotus-worker会尝试使用所有可用资源。在一个操作系统上下文中运行多个 Lotus Workers 会导致资源分配问题,这将导致调度程序分配比可用资源更多的工作。
每台机器运行多个 worker 可能是一个好主意的唯一情况是当有多个 GPU 可用时,因为 lotus 目前只支持单个 GPU - 在这种情况下,建议在具有非重叠资源的单独容器中运行 worker(单独的CPU 内核、单独的 RAM 分配、单独的 GPU)
使用专有 Nvidia 驱动程序时,可以通过设置 NVIDIA_VISIBLE_DEVICES=[device number] 的环境变量,来决定要使用哪个GPU。
运行以下命令用于获取设备编号:
nvidia-smi -L