简介面向比特币及莱特币等数字货币挖矿这里提供CGMiner 3.1.1在Windows系统下的资源包适合管理GPU、FPGA或ASIC矿机的矿工、运维人员以及希望研究挖矿客户端原理的开发者。程序采用多线程架构可同时连接多个矿池并针对ATI显卡提供实时监控、超频和风扇转速控制同时明确提示不要在多个区块链网络上并行运行。压缩包约6.83MB共43个文件包括可执行主程序、动态库、挖矿算法内核脚本、矿池接口示例、FPGA及ASIC相关位流文件以及大量文本说明和配置模板目录划分清晰。借助包内配置样例、API文档和硬件手册使用者能快速完成部署理解矿池参数设置、掌握接口二次开发也可尝试加载FPGA位流进行实验节省自行编译源码的时间。目前已有558人学习无论新手初配还是进阶调优都有参考价值。1. cgminer 3.1.1 windows 只是旧矿工它其实是本地算力测试的稳定底子刚拿到“cgminer 3.1.1 windows”这个资源时我跟大家一样先瞄了一眼版本号2010 年代的老矿工能干什么我用它在 win10 上跑了一周结论正相反3.1.1 把 SHA-256 和 Scrypt 两类算法的参数、配置文件、API 监控三件事做得非常清楚比部分新版本更直接很适合当“算力黑匣子”来用。它解决的是旧显卡、老矿池账号、教学演示机这三类场景里的测试和复现需求。你也想快速验证某台机器有没有算力又不熟悉新矿工的依赖那就值得把它下载装起来。以下按“让它跑→写配置→读数据→排错→固化”的顺序拆每步都给能照抄的参数。2. 让 Windows 端的老矿工跑起来目录检查、OpenCL 运行时和裸启动2.1 解包之后先看三样东西先把压缩包解到一个纯英文短路径我习惯放D:\tools\cgminer中文路径在这代程序里容易让日志和 conf 文件路径读串。解压完目录大致是这样cgminer-3.1.1-windows/ ├── cgminer.exe ├── example.conf ├── miner-test.conf ├── *.dll ├── doc\ │ └── cgminer.txt └── README 或自述文件拿到目录后不要急着双击 exe先找三样东西一是 exe 旁边那一堆 dll它们决定了运行依赖二是example.conf这是作者留给你的活配置模板三是doc目录里的说明文件。很多讲 cgminer 的教程只教命令行参数但 3.1.1 真正好用的地方恰恰是 conf 配置后面会专门讲。接着检查 dll 是否齐全。老版本 Windows 二进制对运行库非常敏感缺一个库的表现不是弹窗而是进程直接消失。我自己踩过一次解压之后杀掉杀毒软件误隔离的 dll结果启动时闪一下就没。所以解压后先看一眼杀软隔离区如果有libgcc_s_dw2-1.dll这类被误拦的文件先恢复并加入信任。2.2 确认 OpenCL 运行时到位cgminer 3.1.1 在 Windows 上主要靠 OpenCL 访问显卡。这里有一个容易翻车的地方64 位系统上你看到C:\Windows\System32\opencl.dll存在不代表 32 位版本的 cgminer 能调用到。老矿工很多是 32 位编译它会去SysWOW64里找 32 位版本的 opencl.dll。先开一个命令行检查where opencl.dll正常情况下会输出两个路径C:\Windows\System32\opencl.dll C:\Windows\SysWOW64\opencl.dll如果只有 System32 有而 SysWOW64 没有那就是 32 位运行时缺失。解决办法是重装一次完整版显卡驱动不要用最小安装包。A 卡和 N 卡老型号的完整驱动包里都带 OpenCL 运行时装完再跑where opencl.dll基本就两条都在了。另外要单独确认 GPU 驱动没有被 Windows 换成“Microsoft 基本显示适配器”。在设备管理器里看显示适配器如果看到这个名字说明驱动没装好后面所有算力测试都是白做。此时右键更新驱动选择本地安装路径把厂商驱动重新装上再继续。2.3 裸命令行启动确认依赖没问题后第一步先不要碰 conf用最原始的命令行启动一次这样能最快定位“矿工本身能不能起来”cgminer.exe -o stratumtcp://pool.example.com:3333 -u user.worker -p x --sha256d这里几个参数拆开看-o指定矿池地址stratumtcp://表示走 stratum 协议这是现在矿池最常见的接入方式。有些老教程写http://那是更老的 getwork 协议很多矿池已经不支持了。-u是把账号和矿工名拼在一起格式通常是用户名.矿工号。-p是密码大部分矿池填x即可不需要真实钱包密码。--sha256d强制指定 SHA-256 算法避免矿工自己探测搞错。窗口起来后如果终端出现一个小尺寸交互界面并能看到 GPU 温度和算力跳动说明裸启动已经成功。这时候别用鼠标点击界面cgminer 的界面是键盘交互按q退出按s可以切换算力显示单位。注意一个反直觉的点在 Windows 上“双击 exe”通常只会闪退必须先把命令行终端打开cd 到解压目录再执行。原因后面避坑章节专门会讲。2.4 验证裸启动的输出启动后的输出分三块日志区、设备状态区、交互提示区。重点看带Accepted字样的行它表示矿池收下了你提交的任务结果。如果只看到Rejected或一直停在Connecting说明网络或账户信息有问题。日志中偶尔出现Stratum connection failed也不要立刻认为程序坏了有时是矿池临时断开矿工会自动重连。连续三轮都失败再去查网络和端口或者换一个池子地址再试。验证阶段最重要的指标不是“算力显示多高”而是“Accepted 出现频率是否稳定”。裸启动跑通后再进入 conf 配置阶段才算有意义。提示裸启动阶段不要同时开浏览器下载、不要跑其他 GPU 任务否则算力波动会让你误判配置问题。3. 给 3.1.1 写一份像样的 conf算法、线程、API 端口和边界3.1 算法参数明确指定而不是让程序猜cgminer 3.1.1 支持 SHA-256 和 Scrypt 等主流算法。命令行可以加--sha256d或--scrypt但更推荐写进 conf 文件避免每次启动手滑写错。下面是一个最简 conf 文件只干一件事固定算法和矿池{ pools : [ { url : stratumtcp://pool.example.com:3333, user : user.worker, pass : x } ], algorithm : sha256d }保存成my.conf用cgminer.exe -c my.conf启动。需要说明的是conf 里的algorithm字段在不同版本写法不完全一致3.1.1 认的是sha256d和scrypt这种连写形式。如果你复制网上的新版配置很可能写的是SHA256或者小写scrypt前者会直接报错。这也是为什么我建议第一版配置只放算法和矿池不要急着堆参数一个字段一个字段加出问题才好定位。3.2 线程和并发参数显卡不黑屏的底线很多人把新版 cgminer 的参数带过来用结果一启动就黑屏或掉驱动。3.1.1 时代的显卡和驱动意识跟现在不一样几个参数要按老逻辑来。--gpu-threads指每张卡开几条 GPU 线程一般设 1 就行设 2 在某些老显卡上会直接让交互界面卡死。真正的算力大头是--thread-concurrency它控制 OpenCL 的全局工作规模。新手第一反应是把并发调高但老显卡没有动态调频保护并发过高会触发驱动看门狗轻则算力归零重则黑屏重启。我一般会先这样试探{ gpu-threads : 1, worksize : 256, thread-concurrency : 4096, intensity : 10 }其中worksize是本地工作规模必须是 2 的整数次幂常见有 64、128、256、512。intensity是计算强度老矿工里取值 0 到 14 或更高你可以理解成“越激进越吃算力但越容易崩”。我验卡的顺序是先把intensity压到 8thread-concurrency从 2048 起步跑十分钟不崩再往上加。不要一上来就抄网上的8192 13组合那是针对特定年代旗舰卡的数据放在低端亮机卡上就是翻车现场。3.3 温度、风扇和断电保护老版本 cgminer 对显卡温度的接管做得比新版本更直接。控制风扇转速的参数是--auto-fan它会根据显卡当前温度自动拉转速。注意在 Windows 上某些显卡驱动默认关闭外部调速你开了auto-fan但转速不动原因多数是显卡 BIOS 里风扇策略被驱动锁死。温度参数要一起设{ temp-target : 70, temp-cutoff : 85, auto-fan : true, gpu-fan : 60 }temp-target是目标温度temp-cutoff是强制停机温度到了 85 度矿工会直接让核心进入保护状态这是好事不要试图关掉它。gpu-fan是手动指定风扇百分比如果 auto-fan 没用就靠它兜底。这里有一个血泪经验不要只设temp-cutoff不设temp-target。有些教程为了省事只写切断线结果是风扇一直在最低速温度反复撞墙又降下来算力曲线像拉链一样。正确做法是先给一个偏保守的目标温度让矿工提前加速散热cutoff 只是最后一道闸。3.4 API 端口把监控口打开3.1.1 自带了一个 HTTP API默认不监听。想要远程或者用脚本读算力需要在 conf 里加{ api-listen : true, api-port : 4028, api-allow : W:127.0.0.1 }api-allow的格式是权限:IPW表示允许写操作R表示只读127.0.0.1表示只允许本机访问。如果你要支持局域网内监控机器读数据可以写成R:192.168.1.0/24子网表示法这代矿工是认的。写操作权限建议不要开放给非本机否则任何能访问到该端口的人都能用api-digest重置部分状态。API 监听到后浏览器直接访问http://127.0.0.1:4028/summary能看到一大段 JSON 文本里面有MHS 5s、Accepted、Rejected等字段。后面章节会写怎么用 Python 定时去拉这些数据。API 是 cgminer 3.1.1 里最值得老玩家利用的部分因为它不需要任何额外的挖矿协议直接 HTTP 请求就能拿到实时状态。3.5 参数边界哪些功能 3.1.1 没有写配置前先认清边界能省不少事。3.1.1 不支持 USB ASIC不管是常见厂商的矿机还是后来的各种盒子都要 3.4 以上的版本才摸得到。它也不支持--gpu-vddc电压调节那个参数是更靠后的版本加的。如果你手里的机器是显卡矿场退役下来的老卡3.1.1 还能玩如果你连的是 USB 矿机趁早换新矿工别在 conf 里找 usb 相关字段。另外3.1.1 的 conf 没有“include”文件能力你想把矿池和调优参数拆成两个文件引入做不到。所有参数只能写在一个 conf 里。这带来一个问题当你需要在不同矿池间切换时复制几份完整 conf 比每次改一份更稳妥。我实际使用中会按矿池命名比如pool_a.conf、pool_b.conf切换时改启动脚本里的文件名即可。4. 从纸面到数据裸启动、conf 启动、API 读取三步对照4.1 第一步裸命令行拿到基准裸启动里最需要记住的一点是第一轮跑出来的算力只是基准不一定是真实水平。因为 GPU 驱动可能还开着 DPM 省电模式核心频率没拉高频。所以裸启动跑 3 分钟后记下两个数一是终端显示的当前算力二是温度。然后退出再进 conf 阶段。裸启动命令保持最简cgminer.exe -o stratumtcp://pool.example.com:3333 -u user.worker -p x --sha256d --gpu-threads 1 --worksize 256 --thread-concurrency 4096这里把后面三个参数也加上是为了避免矿工拿保守默认值跑。默认的线程并发一般很低算力会难看得要命。裸启动加这些参数不是追求最高算力而是要一个“能稳定跑起来”的中等值。如果中等值都保不住后面也不用继续调了。启动后记录日志GPU0: 236.1K/236.1K/236.2K Hash/min Accepted 1/1 (0.0% reject) 12s这里的三个数字分别表示 5 秒、15 秒、60 秒算力。注意单位是Hash/min还是MH/s取决于显示切换等第 3 步用 API 读到的 JSON 才是统一单位。4.2 第二步用 conf 把参数固化裸启动跑通后就把相同参数写进 conf并加上 API、温度和风扇设置{ pools : [ { url : stratumtcp://pool.example.com:3333, user : user.worker, pass : x } ], algorithm : sha256d, gpu-threads : 1, worksize : 256, thread-concurrency : 4096, intensity : 10, temp-target : 70, temp-cutoff : 85, api-listen : true, api-port : 4028, api-allow : W:127.0.0.1 }启动命令变成cgminer.exe -c my.confconf 启动成功有个标志终端界面右上角会显示配置文件名而且窗口标题带cgminer 3.1.1字样。如果只显示裸命令参数说明 conf 没有被读入检查当前目录下文件名和大小写。Windows 上没关系大小写但千万别把文件保存成 UTF-8 带 BOM老程序读这种文件会忽略整个 JSON。保存时选 ANSI 或 UTF-8 无 BOM这是我在第 5 章会重点讲的坑。conf 启动后以 API 里的数据为准来验证参数是否生效。终端界面显示的是瞬时的API 能给你一个跨 5 秒/15 秒/60 秒的平均视野更适合判断毛刺。4.3 第三步用 Python 拉 API 状态API 输出了 JSON但直接看浏览器太累我习惯用一个几十行的 Python 脚本定时拉取。代码不长import json import urllib.request url http://127.0.0.1:4028/summary try: with urllib.request.urlopen(url, timeout5) as resp: data json.load(resp) except Exception as exc: print(API fetch failed:, exc) exit(1) summary data.get(SUMMARY, [{}])[0] print(Accepted: , summary.get(Accepted, 0)) print(Rejected: , summary.get(Rejected, 0)) print(MHS 5s: , round(summary.get(MHS 5s, 0), 2)) print(MHS 15s: , round(summary.get(MHS 15s, 0), 2)) print(MHS 60s: , round(summary.get(MHS 60s, 0), 2)) print(Temperature:, summary.get(Temperature, N/A))这段代码先请求/summary端点再用json.load解析返回的 JSON。关键字段是MHS 5s、MHS 15s、MHS 60s它们分别对应 5 秒、15 秒、60 秒的平均算力。Accepted和Rejected是矿池接受和拒绝的任务数如果 Rejected 占比超过 5%优先怀疑网络延迟或矿池节点链路质量而不是显卡本身。注意 API 返回的 JSON 不是单纯的字典里面有一个STATUS数组和一个SUMMARY数组。直接取顶层字段会报KeyError所以代码里用了get(SUMMARY, [{}])的容错写法。如果 API 端口没开脚本会直接触到urlopen异常。4.4 对照日志判断参数是否生效跑十分钟后回归日志本身判断。日志里有一些人容易忽略的字段它们是排错的第一手材料日志字段含义正常表现GPU0第一张卡的算力三个值接近波动不超过 5%HW硬件错误数长时间不增加U:排队中的任务数保持在 1 到 3ST:已提交任务数持续上涨Accepted矿池接受份额稳定跳动硬件错误数HW非常关键。如果它在一分钟内增加了十几条说明参数过于激进核心开始算错结果。解决方法是把intensity降 1 档或把thread-concurrency减半。很多人看算力达标就忽略了HW然后坐等 Rejected 上涨这就是典型的重复踩坑。日志中偶尔出现Pool communication issue也不用慌先看 U 值。如果 U0 且一直不变说明矿工没收到任务如果 U 正常但 Accepted 不涨才是矿池连接问题。5. 避坑与排查3.1.1 在 Windows 上最典型的六个坑5.1 现象双击 exe 后窗口一闪就消失原因有两类。第一程序一开始就检测到没有可用设备直接退出第二缺少 dll 被系统拒绝运行。我在 2.1 节已经提过这里再补一个细节闪退时鼠标点右键选“以管理员身份运行”并不能解决必须用 cmd 窗口看报错。解决方法是先打开cmdcd 到路径执行cd /d D:\tools\cgminer cgminer.exe --version如果这里能打印版本信息说明依赖没问题。再执行裸启动命令闪退前的一闪就是最后一行报错。如果仍然没有报错用管理员 cmd 再跑一次排除权限问题。5.2 现象窗口正常但算力一直为 0这种坑最折腾人因为你看到的交互界面是好的日志也有连接记录。原因很可能是thread-concurrency设置过大导致 OpenCL 编译内核失败矿工没有拿到 GPU 的全局工作项。解决方式是先把并发降到一个保险值比如显卡显存 2GB 以上设 40962GB 以下设 2048。然后观察日志里的HW如果 HW 数不再增长再逐步加。加的过程必须重启矿工不能热改参数3.1.1 对thread-concurrency的运行时改动支持很差热改后算力反而会掉到 0。另一个隐藏原因是 Windows 的 TDR 机制。驱动检测到单个 GPU 任务耗时超过 2 秒就会触发重置重置后矿工拿不到设备资源算力显示 0 但不会主动退出。检查方法设备管理器里看显卡是否偶尔出现黄色感叹号如果出现说明 TDR 被触发。解决方法是调低worksize或intensity而不是加补丁去改注册表延迟上限因为改 TDR 参数反而会让更多黑屏变成“不重置卡死”。5.3 现象改了频率或显存频率启动后黑屏这是最危险的一个坑。有些人会抄一份带gpu-engine、gpu-memclock的配置文件过来老显卡超频稳定性不足黑屏后要重启进安全模式才能清配置。原因不只是超频本身而是矿工启动时先接管显卡再加载配置频率设置一旦触发驱动保护画面直接没有信号。解决方法是不要把这些参数写进默认 conf单独放一个o.c的删掉超频参数测试。正确顺序是先用只调intensity的方式看能不能提升算力等稳定后再考虑核心频率每次只加 20MHz 量级跑 20 分钟看有没有 HW 增长。如果已经黑屏能进安全模式就在安全模式下把 conf 改名让默认启动不加载超频配置。黑屏期间矿工可能还在后台挖重启后也正是看日志的好时机千万在重启前设法把日志导出不然又得重新试。5.4 现象API 连不上脚本报错原因通常是三个api-listen没开、端口被防火墙拦、api-allow写错。浏览器访问http://127.0.0.1:4028/summary如果被拒绝第一件事先检查 conf 里是不是忘了写api-listen : true。只写了端口没写监听等于白搭。防火墙那边第一次启动矿工时系统会弹窗询问是否允许通过如果你点了取消API 端口全局不可见。去防火墙的“允许应用通过防火墙”里把 cgminer.exe 加进去或者针对 4028 端口单独加一条入站规则。api-allow的写法也容易搞错。常见错误是写成W:local或只写W。3.1.1 要求必须带 IP本机就写W:127.0.0.1要开放局域网先用R:192.168.1.10这种具体 IP 测试确认通了再考虑网段。5.5 现象日志大量出现 stale 或 RejectedStale 是指任务超时没有被矿池接受不算绝对错误但占比高了说明矿工提交太慢或节点延迟高。原因有两层第一层是矿池节点与你的网络链路有抖动第二层是矿工的scan-time参数默认偏短老版本对网络波动更敏感。解决顺序是先换矿池地址的节点线路同一矿池一般有多个 stratum 端口选一个延迟低的。再不行就把scan-time从默认的 60 调到 120让矿工每次工作周期持续时间更长减少重复获取任务的频率。注意scan-time调太高会让任务响应变慢一般不要超过 180。配合把expiry参数调到 120让过期的任务更早被丢弃避免提交无效任务。这两个参数在 conf 里都属于全局参数写在 pools 外面即可{ scan-time : 120, expiry : 120 }调完之后观察 Rejected 占比目标压在 2% 以下。如果还压不下来问题大概率在硬件散热导致的算力波动继续调参数没意义回头拆机清灰换硅脂。5.6 现象开机启动矿工总是重复跑很多人把启动脚本丢进启动文件夹没有做二次校验结果矿工崩了以后又自动拉起一个两个进程抢同一个配置文件和 API 端口反而谁也连不上。解决方法是给启动脚本加一个端口占用检查或者在脚本里先检测进程再决定是否启动。更稳的办法是让看门狗脚本负责拉起矿工而不是让系统启动文件夹直接带矿工。下一章就给出一个我常用的看门狗写法可以把“启动、监控、重启”成套固化下来。6. 沉淀成一套可继承的启动与自愈脚本6.1 一个带检查的启动批处理裸启动和 conf 启动确认没问题后把它变成批处理省得每天敲参数。我这个批处理做了三件事检查 exe 存在、检查 API 端口没被占用、启动 conf。echo off cd /d D:\tools\cgminer if not exist cgminer.exe ( echo cgminer.exe not found exit /b 1 ) netstat -ano | findstr :4028 nul 21 if %errorlevel%0 ( echo API port 4028 already in use exit /b 1 ) start cgminer cgminer.exe -c my.conf echo cgminer started这段批处理的逻辑是先用netstat检查 4028 端口如果被占用就退出避免两个矿工互踩。start命令给了窗口标题cgminer方便后面写一个按键脚本去查找并关闭它。注意这里不要用cd /d之外的方式定位路径因为后面每次启动都可能在不同的当前目录。6.2 一个负责自愈的看门狗看门狗脚本可以说是整套资源里最值钱的部分。它每 30 秒请求一次 API连续三次拿不到数据就杀掉矿工进程并重新启动。这样在显卡驱动被 TDR 重置、矿工僵死但进程还在的情况下能第一时间恢复。import json import subprocess import time import signal API_URL http://127.0.0.1:4028/summary CGMINER_CMD [D:\\tools\\cgminer\\cgminer.exe, -c, my.conf] def api_alive(): import urllib.request try: with urllib.request.urlopen(API_URL, timeout3) as resp: json.load(resp) return True except Exception: return False def restart(): subprocess.run([taskkill, /IM, cgminer.exe, /F], capture_outputTrue) time.sleep(2) subprocess.Popen(CGMINER_CMD) miss_count 0 while True: if api_alive(): miss_count 0 else: miss_count 1 print(API miss count:, miss_count) if miss_count 3: print(restarting cgminer) restart() miss_count 0 time.sleep(30)看门狗里的api_alive不会区分是端口没开还是矿工僵死这个判断对自愈来说已经足够。它只负责恢复不负责调优所以逻辑越简单反而越不容易出问题。真正要做的配套动作是把批处理和这个 Python 脚本绑定成计划任务或者放进一个开机自启目录里顺序是看门狗先起来再由看门狗拉起矿工。从那以后我每次部署老矿工都强制走一遍“裸启动确认、conf 固化、API 验证、看门狗接管”四条流程跑一个月不用进后台省心不少。希望这趟拆包笔记能帮你也把 3.1.1 在 Windows 上稳稳跑起来。本文还有配套的精品资源点击获取