资讯动态

为什么chia-plotter能把SSD带宽榨干?流水线多线程架构完整解析

发布时间:2026/10/16 3:07:58 来源:尧图企业网站定制
【免费下载链接】chia-plotter项目地址https://gitcode.com/gh_mirrors/ch/chia-plotter点击查看免费下载chia-plotter 是一个针对 Chia 网络的高性能 plotter绘图工具它采用流水线 多线程架构只需增加线程数就能把任意存储设备的读写带宽榨干。与官方 chiapos 逐表串行处理不同它把绘图过程拆成可并行的小任务让 CPU 计算与磁盘 I/O 始终同时工作从而在同等硬件下大幅缩短 k32 plot 的生成时间。什么是 chia-plotterChia 的绘图过程Plotting需要反复做三类事计算用 ChaCha8 / BLAKE3 等密码学函数生成和匹配海量条目排序将数十亿条记录按 key 分桶、排序读写磁盘临时表动辄上百 GiB写放大是主要瓶颈传统实现是算完再写、写完再读磁盘大部分时间在等 CPUCPU 又在等磁盘。而 chia-plotter 的核心思想直接写在官方 README 里designed as a processing pipeline, similar to how GPUs work, only the cores are normal software CPU threads. —— README.md也就是说像 GPU 一样用流水线组织任务核心就是普通的 CPU 线程。线程数由-r参数控制默认 4不同阶段会按倍数派出更多线程。四阶段流水线总览一次完整绘图在 src/chia_plot.cpp 的create_plot()中按顺序驱动四个阶段但每个阶段内部都是并行流水线阶段主要工作读/写特征源码位置Phase 1生成表 1~7找出所有匹配matches计算密集 大量随机分桶写phase1.hppPhase 2用 bitfield 标记无效条目丢弃并压缩表顺序读 顺序写phase2.hppPhase 3归并排序后写入最终 plot 文件顺序读 顺序大块写phase3.hppPhase 4写入 C1/C2/C3 检查点表顺序写phase4.hpp 关键点P3/P4 产生的最终文件会由后台复制线程同步搬到目标目录下一个 plot 可以立刻开始复制不阻塞绘图——这是带宽榨干的第二道保险见 include/chia/copy.h。支撑榨干带宽的两大核心机制机制一ThreadPool 任务池 严格保序整个项目的并行骨架是 include/chia/ThreadPool.h它解决并行计算中最经典的两个难题任务调度主线程通过take()以轮询方式把任务编号分发给空闲线程任何线程算完就立刻接下一个任务不存在空转输出保序每个线程完成计算后会等待上一个任务也完成才把结果交给下游output-take(out)。保序为什么重要因为 Chia 的表必须按 key 有序后续阶段的分桶归并依赖严格的顺序输入。ThreadPool 用条件变量 任务编号比较实现无锁化的顺序汇合让 N 个线程的乱序计算最终输出成一条有序数据流——这正是流水线能成立的前提。机制二DiskSort 分桶文件 大块缓冲区include/chia/DiskSort.h 和 include/chia/DiskSort.hpp 实现了外排序分桶buckets每条记录的 key 取高位作为桶号数据直接写进对应的桶文件默认 256 个-u可调。这样写入天然局部化同一桶的数据物理上相邻后续读取基本是顺序 I/O每线程独立 WriteCache每个线程拥有按桶划分的写缓冲include/chia/buffer.h攒够一块才落盘避免海量零散小写大块读读取按g_read_chunk_size默认 65536 条成块进行写缓冲为g_write_chunk_size默认 4096 条均可在 include/chia/settings.h 中找到定义。以 Phase 1 计算表 2~7 的流水线为例phase1.hpp 中compute_matches()读 L 表分块读盘→ 切分成桶 → 匹配match→ 计算 Fxblake3→ 写入 R 表分桶文件 读线程池 单线程 线程池 N 线程 线程池 N 线程 写缓存线程池每一级都由独立的线程池承担匹配和哈希计算吃满 CPU同时读线程持续从磁盘拉数据、写缓存持续落盘——计算、读、写三件事在时间上完全重叠。这就是带宽榨干的直接来源磁盘永远不会因为 CPU 慢而空转。磁盘布局策略让 75% 的写入落进内存chia-plotter 对写入量的分配非常明确见 README.md 与 src/chia_plot.cpp 的参数说明tmpdir-t约 220 GiB承担约25%的写入如 P1 的 tmp 表tmpdir2-2约 110 GiB承担约75%的写入强烈建议挂 RAM 盘tmpfsfinaldir-d最终 plot 文件目录README 给出了 Linux 下 110G 内存盘的挂载示例需要至少 128 GiB 内存sudo mount -t tmpfs -o size110G tmpfs /mnt/ram/ 由于 P1 的大表写入几乎全在 tmpdir2把热数据留在内存里SSD 只承受顺序大块读写和最终文件复制——这正是 SSD 最能发挥的 I/O 形态。关键参数调优清单想让 SSD 带宽利用率最大化重点调这几个参数chia_plot --help可见全部选项参数含义调优建议-r, --threads基础线程数默认 4CPU 核心够多就往上加README 明确建议 crank up threads它是各阶段线程数的乘数-u, --bucketsP1 分桶数默认 256影响内存占用默认约 0.5 GB/线程与桶文件大小均衡-v, --buckets3P3P4 分桶数默认同-u可单独调节最终写入阶段的缓冲粒度-2, --tmpdir2第二个临时目录挂 110G 内存盘收益最大的一步-K, --rmulti2P2 线程乘数默认 1磁盘强、CPU 富余时可适当放大 P2 并行度-w, --waitforcopy等待复制完成再画下一个连续绘图且怕磁盘打满时开启注意分桶数越多、线程越多并发打开的文件句柄越多。程序启动时会自行setrlimit提升限制src/chia_plot.cpp 中RLIMIT_NOFILE逻辑macOS 用户可能还需手动执行ulimit -n 3000。真实性能参考README 收录了一组典型环境的成绩单双路 Xeon E5-2650v2 256 GB 内存 3 盘 RAID0 SATA SSD 110G tmpfs16 线程Phase 1约 18 分钟生成 7 张表找到约 42.9 亿条匹配Phase 2约 10 分钟丢弃约 13%~20% 无效条目Phase 3约 12 分钟向最终 plot 写入 218 亿条记录Phase 4约 1.4 分钟C1/C2/C3 检查点总计约 42 分钟完成一个 k32 plot可以看出各阶段耗时与磁盘吞吐高度匹配没有明显的等待空档——这正是流水线架构生效的标志。上手从零开始绘制git clone https://gitcode.com/gh_mirrors/ch/chia-plotter cd chia-plotter git submodule update --init ./make_devel.sh依赖很简单cmake 3.14和libsodium见 CMakeLists.txt。编译产物位于build/目录。然后一条命令即可开画./build/chia_plot -t /mnt/tmp/ -2 /mnt/ram/ -d /mnt/plot/ -r 8 -p poolkey -f farmerkey一句话总结chia-plotter 之所以能把 SSD 带宽榨干不是靠某个单点优化而是靠三件结构性的事——保序的 ThreadPool 让 CPU 永远有活干DiskSort 分桶把随机 I/O 变成顺序 I/Otmpdir2 内存盘 后台复制线程把最热、最重的写从 SSD 上卸载。理解并调好-r、-2、-u三个参数你就拿到了它全部的加速红利。赞分享【免费下载链接】chia-plotter项目地址https://gitcode.com/gh_mirrors/ch/chia-plotter点击查看免费下载相关推荐开源数字人 SDK端侧实时对话低至 120ms 延迟开源数字人 SDK端侧实时对话低至 120ms 延迟 Duix Mobile 是 duix.ai 推出的开源数字人 SDK让开发者在手机、平板和嵌入式屏幕上人工智能数字人本地部署语音榨干CPU性能Demucs多线程配置终极指南榨干CPU性能Demucs多线程配置终极指南 你是否遇到过用Demucs分离一首歌曲要等待十几分钟明明CPU有8个核心却只用到2个本文将带你通过3个步骤完人工智能深度学习音频Go Faker 终极指南如何为Go结构体快速生成逼真假数据Go Faker 终极指南如何为Go结构体快速生成逼真假数据 Go Faker 是一个功能强大的 Go 结构体假数据生成工具能够帮助开发者快速创建逼真的测试创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑