• 李明阳

Chia挖矿:如何高效地P盘(绘图 Plots)





为什么P盘效率如此重要

与BTC和ETH这种买来矿机就可以立即开挖的币种不同,Chia挖矿有一个独特的过程,需要先把硬盘使用特殊的数据填满,这个操作就叫P盘。


只有完成了P盘的硬盘,才可以用于挖矿,因此,P盘的速度直接决定了你的硬盘容量何时可以转化为挖矿的算力。




让我们来做一个计算。


Chia的区块时间为每5分钟16个区块。


因此,我们可以很容易地计算出,Chia每天产生的区块数大约为:


60 x 24 / 5 * 16 = 4,608 个区块


Chia的区块奖励初始为2XCH,之后每3年减半一次,减半4次后,奖励固定,不再减半。


由于Chia主网刚上线不到3个月,还在第一阶段,区块奖励为最高的2XCH。


因此,每天总的区块奖励为:


4608 x 2 = 9216 XCH


交易费目前占的比例极小,可以忽略不计。


也就是说每天全体矿工能分到的奖励,只有9216XCH。



看明白了吗?


奖励每天只有9216XCH,而矿工却是越来越多的,谁能更早开始挖矿,便可以分到更多的XCH,在项目早期更是如此,也就是大家常说的头矿。


举个例子,5月23日,1PB算力一天可以挖到0.94XCH,到6月4日,就只能挖到0.48XCH了。


谁能更早完成P盘,就可以更早开挖,抢占头矿期,无疑可以获得巨大的利益。


现在知道为什么SSD和高性能CPU最近涨价了吧,因为这两样东西是高效P盘的基础。


P盘神器:Plotman

Plotman是一个P盘管理工具,它并不负责具体的P盘操作,仅仅对P盘程序进行调度和管理。


实际P盘操作依然是使用官方提供的chia命令来完成,Plotman可以根据需要,自动生成相关命令,并自动调用P盘程序。


这样设计的好处非常明显,Plotman和官方的P盘程序间,可以相互独立,如果官方有了新的P盘程序发布,用户只需要更新P盘程序就可以了,只要命令行参数不变,Plotman就可以直接兼容,方便用户使用。




  • 安装

工欲善其事,必先利其器,我们先来看看如何安装Plotman吧。


Plotman是使用Python编写的,一行命令就可以安装。


pip install git+https://github.com/ericaltendorf/plotman@main

▼如果你看到“Successfully installed”字样,恭喜你,安装成功了。





  • 生成配置文件

安装完成后,我们需要先生成一个配置模版,等下我们要在这个模版的基础上,根据需要,设置我们自己的参数。


使用这行命令即可生成配置模版。


plotman config generate

▼生成的配置文件很长,通常我们只需要修改如下这些选项即可。






这一大堆,看起来挺吓人的,别着急,我们一点点来解释,只要你耐心看完,相信都能理解。


相比更复杂的P盘调度系统,Plotman很好的平衡了功能和易用性。


  • Plotman的配置

Plotman的配置文件使用的是一种叫Yaml的格式,这种格式使用缩进代表从属关系,也就是说,每一行前面有几个空格是有要求的,修改配置文件时,一定要注意不要动前面的空格。


配置文件由三部分组成,我们一个个来看。


▼plotting:传递给P盘程序的参数




k:Plot文件的k值。

k值越大,Plot文件越大,P盘需要的时间越长,通常取32。


e:是否禁用位域(bitfield),true表示禁用,false表示不禁用。

启用位域可以提高速度,但是会少量增加对SSD的写入,通常设置为false。


n_threads:P盘使用的线程数。

线程数需要根据CPU的核心数以及你的并行P盘数来设定


n_buckets:P盘时的桶(bucket)的数量。

Chia官方不建议修改n_buckets,保持128即可。


job_buffer:P盘时使用的内存上限。

设置得过低会造成P盘失败,通常保持默认值,如果内存充裕,设置4000也就足够了。


超过推荐值没有任何意义,并不会加速,除了浪费内存没任何好处。


farmer_pk:你的农夫公钥(Farmer Public Key)。

pool_pk:你的矿池公钥(Pool Public Key)。



▼directories:P盘程序需要使用到的存储位置




log:P盘程序输出的日志的保存位置。

大部分人认知中的日志,是可有可无的,但是对Plotman来说,它是通过P盘程序输出的日志来感知P盘进度的,所以这个路径很重要,其中的内容不能随意删除。


tmp:P盘程序使用的SSD缓存位置。

可以添加很多个,如果你有多个SSD,每行一个,往下加就行了,Plotman会自动把P盘任务分布到各个SSD上。


dst:P盘程序存储Plot文件的位置。

同样可以添加很多个,如果你有很多机械盘,每行一个,往下加,Plotman同样会把Plot文件分布到各个机械盘,直到装满。




▼scheduling:调度参数,用于控制Plotman该如何调度P盘程序




Chia的P盘程序分为四个阶段,每个阶段又包含若干个子阶段。


P盘进度用X:Y的方式来表示,X代表阶段,Y代表子阶段。


比如1:1代表阶段一的第一个子阶段,2:3代表阶段二的第三个子阶段。


其中阶段一对CPU和SSD的压力最大,之后三个阶段的压力要小很多。


因此,需要让P盘任务的阶段一交错着,不要同时都跑阶段一,否则把CPU和SSD都占满了,P盘时间就会大大延长。


tmpdir_stagger_phase_major和tmpdir_stagger_phase_minor:用于设置交错屏障,默认值表示屏障设置在2:1,也就是阶段一刚完成的时候,这个不要乱改,默认值就是最佳的了。

tmpdir_stagger_phase_limit:每个SSD上,处于交错屏障阶段之前的任务总数。

tmpdir_max_jobs:每个SSD上允许的任务数。

global_max_jobs:所有SSD上的任务加在一起,允许同时运行的总任务数。

global_stagger_m:启动任务之间的间隔,单位是分钟,一般设置为10分钟就可以了。

polling_time_s:间隔多久检查一次是否可以启动新的P盘任务,单位是秒,一般用默认值20秒就可以了。



性能调优的关键基本上就是这四个参数:


n_threads

tmpdir_stagger_phase_limit

tmpdir_max_jobs

global_max_jobs

慢慢实验,找出一个最佳组合,使相同时间内(比如一两天)能P出来的Plot文件尽可能多。


小测验

对完全没有基础的朋友,Plotman的调度参数理解起来可能还是有些困难。


之前的咨询中,我不止一次发现这种情况:我问我说明白了吗?大家很自信地说明白了,结果改出来的配置文件一团糟,显然没有完全理解。


为了帮助大家理解,我来出两道题,答案我会放在文章最后面,大家先别着急看答案,自己回答一下,如果都答对了,就说明你完全理解了。


题目一:


某台机器有3个SSD:SSD1、SSD2、SSD3。


配置文件如下:


tmpdir_stagger_phase_major: 2

tmpdir_stagger_phase_minor: 1

tmpdir_stagger_phase_limit: 2

tmpdir_max_jobs: 3

global_max_jobs: 7

执行过程中,是否会出现如下情况:


SSD1上的任务:1:1、1:3、1:5


SSD2上的任务:1:1、1:2、2:1


SSD3上的任务:1:1、2:1、3:1




题目二:


某台机器有3个SSD:SSD1、SSD2、SSD3。


配置文件如下:


tmpdir_stagger_phase_major: 2

tmpdir_stagger_phase_minor: 1

tmpdir_stagger_phase_limit: 2

tmpdir_max_jobs: 4

global_max_jobs: 10

执行过程中,是否会出现如下情况:


SSD1上的任务:1:1、1:3、2:5、3:1


SSD2上的任务:1:1、1:2、2:1、3:2


SSD3上的任务:1:1、1:3


Plotman的使用

配置完成后,我们就可以启动Plotman,正式开始P盘啦。


使用这行命令即可启动Plotman,并进入交互模式。


plotman interactive

▼Plotman主界面主要分4大部分,任务列表、SSD列表、Plot存储列表、执行日志。





下面,我们就来介绍下每部分的作用和含义。


▼任务列表:列出所有当前正在执行的P盘任务。



plot id:当前P盘任务正在生成的Plot文件的绘图ID。

这个绘图ID是随机生成的,每个Plot文件都不同,因此可以用于唯一标记Plot文件。


绘图ID其实很长,为了方便显示,Plotman只显示了前8位,已经足够区分Plot文件了。


k:当前P盘任务正在生成的Plot文件的K值。

tmp:当前P盘任务使用的缓存位置。

dst:当前P盘任务将会保存Plot文件的位置。

wall:其实是Wall Time的缩写,也就是墙上时间,指的是当前P盘任务已经执行了多久。

phase:当前P盘任务正在执行的阶段。

tmp:第二个tmp指的是当前P盘任务已经占用了多少SSD缓存。

你会发现随着P盘任务的执行,SSD缓存占用会在阶段一先增加,之后慢慢减少。


pid:当前P盘任务的进程ID。

stat:当前P盘任务的状态。

mem:当前P盘任务占用的内存容量。



▼SSD列表:监控每个SSD的状态



tmp:SSD缓存位置,Plotman为了显示方便,会省略目录的公共部分。

ready:当前SSD是否还可以容纳其他任务。

如果SSD已经被占满,不能同时跑更多任务了,这里就会显示为"----",如果SSD还可以再跑更多任务,会显示为"OK"。


phases:当前SSD上正在执行的P盘任务所处的阶段。



▼Plot存储列表:监控每个机械盘的状态



dst:存储Plot文件的位置,Plotman为了显示方便,会省略目录的公共部分。

plots:当前位置下已经存储了多少个Plot文件。

GBfree:当前位置还有多少可用空间,单位是GB。

inbnd phases:将要存储Plot文件到当前位置的P盘任务所处的阶段。

pri:当前位置的优先级(priority)。

Plotman会自动计算优先级,并根据优先级决定把Plot文件写入哪个位置,减少多个任务同时向同一位置写入数据的情况,从而避免机械盘出现性能瓶颈。




▼执行日志



之前我们说过,Plotman其实只是调度,具体操作还是调用Chia官方P盘程序来完成。


在这里我们可以看到Plotman到底做了什么操作,使用了什么命令。


李明阳有话说

在几次跳票之后,Chia官方终于在6月3日凌晨公布了官方矿池协议。


▼官方矿池协议要求P盘时使用Pool Contract Address而不是现在的Pool Public Key,这也是实现矿工自由切换矿池的关键。



目前,官方矿池协议仍在Testnet上测试,还没有进入主网。


如果矿工想接入使用官方协议的矿池,必须重新P盘。


如果不想加入的话,继续独立挖矿或者使用第三方协议的矿池,可以不必重新P盘。


随着全网算力的上升,独立挖矿出块将会越来越困难。


第三方协议的矿池无法解决双挖问题,这会造成大量收益被作弊矿工偷走,整体收益偏低,更不用说需要使用助记词签名带来的潜在安全风险。


对比之下,官方协议矿池显然是矿工们的最好选择,一旦官方矿池上线主网,矿工间的P盘大战势必一触即发,以求在这轮算力洗牌中,抢占先机。


你准备好了吗?




习题答案

题目一:


global_max_jobs为7,说明任务总数不能超过7,数一下,有9个任务,不符合。


tmpdir_max_jobs为3,说明每个SSD上的任务数不能超过3。


数一下,SSD1有3个任务,符合;SSD2有3个任务,符合;SSD3只有3个任务,也符合。


tmpdir_stagger_phase_limit为2,说明每个SSD上处于2:1之前(不包含2:1)的任务不能超过2,其实就是处于阶段一的任务的数量不能超过2。


SSD1有3个,不符合;SSD2上有2个,符合;SSD3上只有1个,也符合。


不能满足global_max_jobs和tmpdir_stagger_phase_limit设定的限制,所以这种情况不可能出现。




题目二:


global_max_jobs为10,说明任务总数不能超过10,数一下,正好10个任务,符合。


tmpdir_max_jobs为4,说明每个SSD上的任务数不能超过4。


数一下,SSD1有4个任务,符合;SSD2有4个任务,符合;SSD3只有2个任务,也符合。


tmpdir_stagger_phase_limit为2,说明每个SSD上处于2:1之前(不包含2:1)的任务不能超过2,其实就是处于阶段一的任务的数量不能超过2。


SSD1有2个,符合;SSD2上有2个,符合;SSD3上也有2个,还是符合。


各项要求都满足,所以这种情况是可以出现的。




你答对了吗?

7 views0 comments

Recent Posts

See All