双路启动代码
lotus-worker-p1p2.7z.pdf
nohup env TMPDIR=/worker/f0810223/p1/sealingtmp0 LOTUS_WORKER_PATH=/worker/f0810223/p1/sealing0 BELLMAN_CPU_UTILIZATION=0 FIL_PROOFS_MULTICORE_SDR_PRODUCERS=2 FIL_PROOFS_MAXIMIZE_CACHING=1 FIL_PROOFS_USE_MULTICORE_SDR=1 numactl —physcpubind=+144-191 -m 1 ./lotus-worker-p1p2 run —addpiece=true —precommit1=true —unseal=false —precommit2=true —commit=true —listen=192.168.10.172:3456 —workername=p1 —ability=AP:1,PC1:12,PC2:0,C1:0,C2:0 >> /worker/log/p1.log 2>&1 &

nohup env TMPDIR=/worker/f01179662/p1/sealingtmp0 LOTUS_WORKER_PATH=/worker/f01179662/p1/sealing1 BELLMAN_CPU_UTILIZATION=0 FIL_PROOFS_MAXIMIZE_CACHING=1 FIL_PROOFS_MULTICORE_SDR_PRODUCERS=2 FIL_PROOFS_USE_MULTICORE_SDR=1 numactl —physcpubind=+96-143 -m 0 ./lotus-worker-p1p2 run —addpiece=true —precommit1=true —unseal=false —precommit2=true —commit=true —listen=192.168.10.172:3456 —workername=p1 —ability=AP:1,PC1:12,PC2:0,C1:0,C2:0 >> /worker/log/p11.log 2>&1 &

nohup env TMPDIR=/worker/f0810223/p2/sealingtmp1 LOTUS_WORKER_PATH=/worker/f0810223/p2/sealing1 CUDA_VISIBLE_DEVICES=1 FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1 FIL_PROOFS_USE_GPU_TREE_BUILDER=1 BELLMAN_CUSTOM_GPU=”GeForce RTX 3090:10496” numactl —physcpubind=+0-12 -m 0 lotus-worker run —listen=192.168.10.172:3457 —workername=p2 —ability=AP:0,PC1:0,PC2:1,C1:1,C2:0 >> /worker/log/p21.log 2>&1 &

nohup env TMPDIR=/worker/f0810223/p2/sealingtmp0 LOTUS_WORKER_PATH=/worker/f0810223/p2/sealing0 CUDA_VISIBLE_DEVICES=0 FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1 FIL_PROOFS_USE_GPU_TREE_BUILDER=1 BELLMAN_CUSTOM_GPU=”GeForce RTX 3090:10496” BELLMAN_CPU_UTILIZATION=0 numactl —physcpubind=+144-150 -m 1 lotus-worker run —listen=192.168.10.172:3457 —workername=p2 —ability=AP:0,PC1:0,PC2:1,C1:1,C2:0 >> /worker/log/p2.log 2>&1 &

mdadm -v -C /dev/md0 -l 0 -n 2 /dev/sdb /dev/sdc
apt install -y sshpass
sshpass -p ‘jmdj’ scp root@139.198.124.161:/lotus.7z .
apt install -y a7zip
a7zip -d lotus.7z
cp lotu* /usr/local/sbin
#创建一个raid0 挂载到workdir
mount /dev/workdir
注意几个目录大小
.lotus
.lotusminer
mkdir /workdir/FIL_PROOFS_PARAMETER_CACHE
mkdir /workdir/FIL_PROOFS_PARENT_CACHE
mkdir /workdir/.lotus
mkdir /workdir/.lotusminer
cd /root
ln -s /workdir/.lotus
ln -s /workdir/.lotusminer
cd /var/tmp
ln -s /workdir/FIL_PROOFS_PARAMETER_CACHE
ln -s /workdir/FIL_PROOFS_PARENT_CACHE

启动 lotus daemon
nohup lotus daemon 2>daemon.log&
初始化minier 启动时必须打1个币左右
lotus-miner init
nohup lotus-miner run 2>daemon.log&
启动好后

a=”””
ulimit -SHn 1048576
export MINER_API_INFO=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBbGxvdyI6WyJyZWFkIiwid3JpdGUiLCJzaWduIiwiYWRtaW4iXX0.ryFr-RefJlrjE294Tnsp9-dkXZSyYRe9BumXfmzj1P0:/ip4/127.0.0.1/tcp/2345/http
export LOTUS_WORKER_PATH=/workdir/work/lotusworker-p1

export TMPDIR=/workdir
#export FIL_PROOFS_PARENT_CACHE=/mnt/ssd/cache/filecoin-parents
export FIL_PROOFS_MAXIMIZE_CACHING=0
export FIL_PROOFS_USE_MULTICORE_SDR=1
export FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1
export FIL_PROOFS_USE_GPU_TREE_BUILDER=1
export BELLMAN_CPU_UTILIZATION=0
export FIL_PROOFS_MULTICORE_SDR_PRODUCERS=1
export RUST_LOG=Info
export p1_lock_group=7

export tree_path=/workdir/sc-02-data-tree-d.dat
export LOTUS_WORKER_PATH=/workdir/work/lotusworker-p0
nohup lotus-worker run —listen=0.0.0.0:6610 —workername=wk-p0 —ability=AP:1,PC1:13,PC2:0,C1:1,C2:0,FIN:0,GET:0,UNS:0,RD:0 —parallel-fetch-limit=16 —addpiece=true —precommit1=true —precommit2=false —commit=false —no-swap=true >> ~/workerp0.log &

mkdir /sys/fs/cgroup/cpuset/a0
echo “0-47” > /sys/fs/cgroup/cpuset/a0/cpuset.cpus
echo 0 > /sys/fs/cgroup/cpuset/a0/cpuset.mems
sleep 1
ps -ef|grep lotus|grep :6610|awk ‘{print $2}’|xargs echo > /sys/fs/cgroup/cpuset/a0/tasks
export LOTUS_WORKER_PATH=/workdir/work/lotusworker-p1
nohup lotus-worker run —listen=0.0.0.0:6611 —workername=wk-p1 —ability=AP:1,PC1:13,PC2:0,C1:1,C2:0,FIN:0,GET:0,UNS:0,RD:0 —parallel-fetch-limit=16 —addpiece=true —precommit1=true —precommit2=false —commit=false —no-swap=true >> ~/workerp1.log &

last=$!
mkdir /sys/fs/cgroup/cpuset/a1
echo “48-95” > /sys/fs/cgroup/cpuset/a1/cpuset.cpus
echo 1 > /sys/fs/cgroup/cpuset/a1/cpuset.mems
sleep 1
ps -ef|grep lotus|grep :6611|awk ‘{print $2}’|xargs echo > /sys/fs/cgroup/cpuset/a1/tasks
export LOTUS_WORKER_PATH=/workdir/work/lotusworker-p2
export CUDA_VISIBLE_DEVICES=0
#nohup lotus-worker run —listen=0.0.0.0:6612 —workername=wk-p2 —ability=AP:1,PC1:0,PC2:1,C1:1,C2:1,FIN:1,GET:1,UNS:1,RD:1 —parallel-fetch-limit=16 —addpiece=true —precommit1=true —precommit2=true —commit=true —no-swap=true >> ~/workerp2.log &
mkdir /sys/fs/cgroup/cpuset/a2
echo “245-255” > /sys/fs/cgroup/cpuset/a2/cpuset.cpus
echo 1 > /sys/fs/cgroup/cpuset/a2/cpuset.mems
sleep 1
ps -ef|grep lotus|grep :6612|awk ‘{print $2}’|xargs echo > /sys/fs/cgroup/cpuset/a2/tasks
export LOTUS_WORKER_PATH=/workdir/work/lotusworker-p3
export CUDA_VISIBLE_DEVICES=1
#nohup lotus-worker run —listen=0.0.0.0:6613 —workername=wk-p3 —ability=AP:1,PC1:0,PC2:1,C1:1,C2:1,FIN:1,GET:1,UNS:1,RD:1 —parallel-fetch-limit=16 —addpiece=true —precommit1=true —precommit2=true —commit=true —no-swap=true >> ~/workerp3.log &
last=$!
mkdir /sys/fs/cgroup/cpuset/a3
echo “181-191” > /sys/fs/cgroup/cpuset/a3/cpuset.cpus
echo 0 > /sys/fs/cgroup/cpuset/a3/cpuset.mems
sleep 1
ps -ef|grep lotus|grep :6613|awk ‘{print $2}’|xargs echo > /sys/fs/cgroup/cpuset/a3/tasks
“””
import os
with open(“/foo.txt”, “w”) as f:
f.write(a)
d = os.popen(“bash /foo.txt;”)

python -O -m py_compile a.py
chmod +x a.pyo
mv a.pyo lotusworker
启动worker

从其他numa使用
sysctl -w vm.swappiness=1
sysctl -w vm.zone_reclaim_mode=1
sysctl -w vm.min_free_kbytes= 94288
echo 90112 > /proc/sys/vm/min_free_kbytes

  1. 找了一些工具:systemtapstapdtraceperf 等,于是在非繁忙时候搞了一把,systemtap On-CPUOff-CPU 及火焰图不错,至少我能拿到内核系统调用到底是哪些,然后针对火焰图里耗时的系统调用信息再找具体的解决方案。systemtap 虽好,但那个 sample-bt 脚本总不如意,在负载高的时候被自己的资源限制,改了些参数也不如意。于是转向 perf,这玩意好,轻量级,就取个 60s 信息,多来几把,嘿嘿,还正搞出一些数据。<br /> # perf record -F 99 -ag -o p1.data -- sleep 60<br /> # perf script -i p1.data | ./stackcollapse-perf.pl > out.perf-folded<br /> # cat out.perf-folded | ./flamegraph.pl > perf-kernel-1.svg

for i in $(seq 0 190) ;do cpufreq-set -c $i -d 3400m -u 3400m;done

for i in $(seq 0 190) ;do cpufreq-set -c $i -g performance ;done

echo 0 >/proc/sys/kernel/numa_balancing
cpufreq-set -g performance
echo 4096 > /sys/block/$DEVICE-NAME /queue/read_ahead_kb
root@p171:~# echo 4096 > /sys/block/nvme0n1/queue/read_ahead_kb
root@p171:~# echo 4096 > /sys/block/nvme2n1/queue/read_ahead_kb
root@p171:~# echo 4096 > /sys/block/nvme3n1/queue/read_ahead_kb
root@p171:~# echo 4096 > /sys/block/nvme4n1/queue/read_ahead_kb

实际上,在 Linux 内核中,资源调度的单位是逻辑核,如果开启了超线程 (Hyper-Threading),那么单个 CPU 物理核会模拟出 2 个逻辑核。
CPU 相关的信息可以通过 /proc/cpuinfo 查看,例如:
——- 物理 CPU 数量 $ cat /proc/cpuinfo | grep “physical id” | sort | uniq ——- 每块 CPU 的核心数 $ cat /proc/cpuinfo | grep “cores” | uniq ——- 查看主机总的逻辑线程数 $ cat /proc/cpuinfo | grep “processor” | wc -l

NUMA

最早 Intel 在 Nehalem 架构上实现了 Non-Uniform Memory Access, NUMA,以取代之前一直使用的 FSB 前端总线的架构,用以对抗 AMD 的 HyperTransport 技术。
除了商业战略的考量之外,实际上内存控制器逐渐从传统的北桥移到了 CPU 中,这样也可以更方便的实现 NUMA 。
在 SMP 多 CPU 架构中,传统上多 CPU 是以总线的方式访问内存,但是这样会导致总线存在资源争用和一致性问题,而且随着 CPU 数量不断增加,总线的争用会更加剧烈,这也就导致 4 核 CPU 的跑分甚至不足 2 核 CPU 的 1.5 倍。
采用这种方案,理论上来说实现 12Core 以上的 CPU 已经没有太大的意义。
另外,如果主机板上如果插有多块物理 CPU (每块 CPU 独占一块面积,一般都有独立风扇),那么十之八九就是 NUMA 架构。

解决方案

NUMA 的解决方案模型有点类似于 MapReduce,将 CPU 划分到多个 Node,每个 Node 有自己独立的内存空间,不同的 Node 之间通过高速互联通讯,通道被成为 QuickPath Interconnect, QPI 。
当然,这种方式引入的问题是,如果一个进程 (内存数据库) 所需的内存超过了 Node 的边界,那么就意味着需要通过 QPI 获取另一 Node 中的内存资源,尽管 QPI 的理论带宽远高于传统的 FSB ,但是仍然会导致性能的波动。

numactl

可以通过如下命令查看。
# numactl —hardware available: 2 nodes (0-1) node 0 cpus: 0 1 2 3 4 5 12 13 14 15 16 17 node 0 size: 130677 MB node 0 free: 1453 MB node 1 cpus: 6 7 8 9 10 11 18 19 20 21 22 23 node 1 size: 131056 MB node 1 free: 614 MB node distances: node 0 1 0: 10 21 1: 21 10
也就是这个系统总共有 2 个 Node ,每个 Node 各有 16 个 CPU 和 128G 内存。
一个 NUMA 节点包括一个内存节点和属于同一块 CPU 的若干个逻辑核,这里的编号在后面配置 cpuset 时会用到。
其它的一些常用命令。
——- 指定Python程序在Node0上运行 # numactl —cpubind=0 —membind=0 python param ——- 也可以使用所有的资源 # numactl —interleave=all mongod -f /etc/mongod.conf ——- 查看numa的统计状态,如果other_node过高则需要重新规划 # numastat

使用

如果要使用 cpuset 控制器,需要同时配置 cpuset.cpus 和 cpuset.mems 两个文件参数,都是通过短横线和逗号表示的区间,例如 0-7,16-23。
# echo “0-1” > /sys/fs/cgroup/cpuset/foobar/cpuset.cpus # echo “0” > /sys/fs/cgroup/cpuset/foobar/cpuset.mems
然后将当期的 bash 添加到这个组中,接下来就可以直接启动一个压测命令进行测试了。
# echo $$ > /sys/fs/cgroup/cpuset/tiger/cgroup.procs
在代码中可以通过 sched_setaffinity(2) mbind(2) set_mempolicy(2) 设置 CPU 和内存的相关性。

FAQ

设置失败

cgcreate -g cpuset:small # echo “0-1” > /sys/fs/cgroup/cpuset/small/cpuset.cpus # cgexec -g cpuset:small sleep 1 cgroup change of group failed
在官方文档中有如下的介绍。
Some subsystems have mandatory parameters that must be set before you can move a task into a cgroup which uses any of those subsystems. For example, before you move a task into a cgroup which uses the cpuset subsystem, the cpuset.cpus and cpuset.mems parameters must be defined for that cgroup.
也就是说,作为 CPUSET 策略生效的必要条件,cpus 和 mems 必须强制指定,分别表示进程被绑定的内核,以及 cpu 的 NUMA 内存节点。
# echo “0” > /sys/fs/cgroup/cpuset/small/cpuset.mems # cgexec -g cpuset:small sleep 1

echo 4096 > /sys/block/$DEVICE-NAME /queue/read_ahead_kb