Chia Plot盘简易配置

因为服务器上面装CentOS比较方便,这文章是按照CentOS 8来写的,当然基于CentOS的docker也可以用这个来构建一个镜像。

注意:炒币有风险,不建议自行购置大量硬盘来挖和炒,尤其是现在。这玩意是被炒作起来的连公开交易都没开不知道价格,高价购置硬盘很可能血本无归。
5/5/2021更新:少许配置注意事项

1. 安装好系统

假设使用GUI安装器来安装,软件集选Server就可以了,不需要GUI。

2. 安装必要软件包,更新内核

yum -y install epel-release
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-8.0-2.el8.elrepo.noarch.rpm
yum -y --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel
yum -y install git python38 python38-devel screen make gcc nload htop iotop
yum -y --enablerepo=powertools install fuse-sshfs

这几行指令添加了两个软件库:epel-release和elrepo,然后安装了mainline版本的内核,以及必要软件git、python 3.8、make、gcc和常用软件screen、nload、htop、iotop、sshfs。

那些常用软件不是必要的,自己按需安装即可。内核更新主要是因为CentOS 8自带的4.x内核没有bbr,我需要把P好的文件传到储存服务器上,bbr帮助还是很大的。我使用的是sshfs来传,bbr开启之后基本可以保持在满速(同地区)。

3. 安装Chia程序

cd /
git clone https://github.com/Chia-Network/chia-blockchain -b latest
cd chia-blockchain
bash install.sh
. ./activate
chia init

程序是装在python的venv内的,每次运行之前都需要先执行一下". ./activate"来添加路径到PATH。执行完之后bash的提示会稍有改变。

[root@static chia-blockchain]# . ./activate
(venv) [root@static chia-blockchain]#
注意前面那个(venv),这是激活成功的标志,在这个环境下就可以执行chia执行程序。

4. 激活BBR

如果刚才安装了mainline内核,就需要在sysctl那激活一下bbr然后重启机器。

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
init 6

重启完成后,如果下面指令能出现mod_bbr,则为激活成功。

(venv) [root@static chia-blockchain]# lsmod | grep bbr
tcp_bbr                20480  20

5. 连接远程目录

首先需要创建一个公私钥对,密码可以为空,目录保持默认即可。

ssh-keygen

然后把"~/.ssh/id_rsa.pub"的内容拷贝到仓库机器的"~/.ssh/authorized_keys"内。重启一下远程仓库机器的ssh进程。然后用这个指令就可以挂载远程目录到本地:

# 指令格式
sshfs -o allow_other,default_permissions <远程用户名>@<远程地址>:<远程目录> <本地目录>
# 范例
sshfs -o allow_other,default_permissions root@example.com:/disk1 /remote/disk1

然后就可以把这个作为P盘的目的目录了。

6. 开P

我这个配置的机器是存粹的P盘机器,它不运行节点也不运行farmer。P出来的东西立马就会传到远程。

首先需要在主节点(钱包节点)找到你的farmer pk和pools pk。用chia key show就可以看到。然后就可以开始P了。这是一个范例的指令:

nice -n -15 \
    chia plots create -f <farmer key> \
    -p <pool key> \
    -t /chia_temp -d /remote/disk1 -b 10000 -u 64 -n 10 -r 4 -k 32 -x

这些参数我暂时还在摸索中,很多参数都是因人而异的(比如b、u、r)。建议自己推敲一下。

我选择这个参数的配比是因为:每个K=32的Plot需要至少260GB左右的空间来做临时储存。也就是说,我机器上面的1000G的SSD只能同时开P 3个地块。我机器有32G内存,也就是每个进程最多可以分10G左右,10G我就可以把u设置到64来减少对硬盘的随机访问量。

同时,我服务器是4C8T的,理论上来说最多8个线程在运行。但这个P盘有些步骤是单线程的(比如第四步骤),所以实际上可以把所有进程的n总和设置在12~16来保持CPU资源的饱和使用。同时,我用了nice来提高优先级,让这些线程能有更高的CPU使用效率。

还有就是,为了资源利用最大化,需要错开各个进程。推荐的时间是45~2小时。这能避免资源撞车,比如几个进程一起开始向远端拷贝文件占满网口。

当前尝试过的一些配比:

  • u=64 r=3 b=15000 NVMe SSD RAID0大概3000速,同盘3开间隔45分钟,5.5小时左右三块
  • u=64 r=3 b=10000 机械盘200速,同盘单开,7.5小时左右一块
  • u=128 r=2 b=4300 SATA SSD RAID0大概700速,同盘7开间隔30分钟,巨慢无比直接卡死

正在尝试

  • u=32 r=4 b=20000 NVMe SSD RAID0大概3000速,同盘3开间隔45分钟

如果感兴趣的话可以参考一下官方放出来的一份数据集合:

chia plotting performance.xlsx
TiB day k,System Name,OS,Motherboard / SAS Adapter (Server),CPU,DRAM,Temp Drive,Time Phase 1 (s),Total Time per Plot (s),Time (min),Time (hr),GiB Written,GiB/min,// Plots,TiB/day (all // Plots),Total Price (USD),$/TiB/day,version,-r (Threads),-b (Memory)@xorinox,node-3,Fedora Server 32,Asus ROG...

7. 一些新的更新/发现

如果我有很多个盘,是做RAID 0然后全跑在一个逻辑盘上还是分开?

就比如说我有两个1T的NVMe SSD,实测分开成两个SSD每个上面跑三个plot,会比组成一个RAID 0然后跑7个plot要高效。根据Raddit上面的说法,这是因为同时跑太多进程会导致IO中断和线程切换占用的时间太多,从而低效。同时,软阵列即便是RAID 0这种简单的,也会占用系统资源去分割。在系统满载的时候也会拖慢IO速度。

所以如果是两个1T就没必要组RAID 0了,但如果是两个512G可以考虑组一下不然空间浪费太多。

CPU多少线程比较合适?

上面也提及了,因为一个线程不是100%占用CPU的,所以可以超出总逻辑线程20%~50%的量。同时,假如是在单核非常羸弱的CPU上跑(比如那些洋垃圾),单进程可以考虑配更多线程(6~8)不然在P1瓶颈会在CPU上。

我当时也考虑过多线程会不会导致线程切换以及磁盘分开寻道带来的延迟过高导致效率低下,但实测的话HDD P盘在D-1541这种弱鸡CPU上3线程比8线程慢。如果是比较好的U,应该是4~6线程左右最优。

绑定进程到CPU核心上有用么?

因为我机器核心数不多,实际测试上每个进程2线程绑定到逻辑线程上比每进程4线程自由分配要效率低。绑定到核心有个优点就是更有效利用CPU缓存,但这个优点貌似并不比开多两个线程更有效利用CPU来的划算。因为每个线程不是100%利用CPU的,这样绑定就浪费掉了一部分CPU时间了。

选多少Bucket以及Bucket内存需求?

理论上来说内存足够的话bucket数越少越好,毕竟硬盘IO减少了。bucket减半的时候应该是内存翻倍。实测128/64/32在一下内存下可以使用:3700/7700/20000。当然这个不是最小值,但如果被SSD空间限制了不能P更多,那多于内存分给P盘也无妨(内存多了不会让你P盘变慢,虽然超过了最大值也不会让它变快)。

Swap?

没swap和有swap貌似没有太大区别。考虑到swap本身也会占用IO,我所有机器都关掉了swap。

数据转移 - SSHFS太慢了

SSHFS在同一个运营商/机房内还行,但因为它是单连接的,在跨机房/地区的时候就会变得巨慢无比。可以考虑使用axel或者curl之类的东西来多线程传输。

能薅Google Drive企业盘/教育盘羊毛么

没试过,理论上来说应该可以。

参考/相关文献