← 全部项目

Fanctl

Apple Silicon 智能风扇控制

唐艺家 (Tom)

类别
Mac 应用
平台
macOS 13+ · Apple Silicon
版本
2.7.0
大小
1.3 MB
许可
MIT
语言
8 种语言

Apple Silicon Mac 的智能自学习风扇控制。苹果把风扇调成静音优先,芯片快到 90 °C 才肯使劲转;Fanctl 让你自己定 48、55 或 58 °C,由一个会学习的控制器安静地守住。

真机截图真实的菜单栏面板
网页演示温控模拟:CPU 满载
网页演示与 macOS 默认曲线对比

在浏览器里试试

下面是在浏览器里跑的交互演示,用的全是虚构的样例数据,不连接任何真实服务。真实软件请到 GitHub 下载。

CPU 温度
— °C
 
风扇转速
—
 
整机功耗
— W
t 00:00
控制状态
—
 
  • 温度
  • 目标温度
  • 转速
  • 功耗
  • 另一种控制(虚线)

同一份负载,两台"机器"并排跑:实线是你选的控制方式,虚线是另一种。控制器逻辑移植自真实的守护进程(3 秒一个控制周期,风扇量程取 14 寸 M4 Pro 的 2317–7826 转)。热模型和 macOS 默认曲线(风扇停转或停在 2317 转,约 85 °C 以上才真正提速)都是简化近似,具体数值仅供示意。 系统接管期间,转速线显示为灰色。

热量还没到,风扇先动

整机功耗基本就是发热量,Fanctl 把它当作前馈信号:开始编译、加载模型时,下一个控制周期就把目标转速提上去,不用等芯片热起来。在开发者的 M4 Pro 上,10 线程满载时风扇 6 秒内就有响应。温度接近目标、或者正在往上爬时,前馈完全放开;离目标还远时则收着用——因为这些瓦数里有不少(屏幕、外设)根本到不了散热片。

平滑过渡,不突然狂转

前馈之上是一个针对温差的 PI 回路,大约 3 秒跑一轮。输出钳位和变速限幅只要有一个饱和,反算抗饱和就会把积分泄掉,不让它攒出一笔余量、过后再冲过头。每次调速都限了斜率,转速变化始终是缓坡。长时间重负载下物理规律说了算——风冷就算满转也只能稳在 55–65 °C 左右,Fanctl 守住这个真实的平衡点,而不是一直满转硬吼。

越用越懂这台机器

前馈是一张「功耗 → 平衡转速」的映射表,在 10、20、35、55、80 W 处各有一个锚点,每个档位各存一张。温度稳定一段时间后,积分里长期背着的那部分偏差会迁进相邻的锚点,并写盘保存。跑得越久,反馈回路要干的活越少——两台 Mac 最后会学出两个不一样的控制器。

能更安静,用电池时主动让开

SMC 标称的最低转速(测试机上是 2317 转)其实只是建议值。打开可选的低转速区后,在负载轻、温度有富余时,Fanctl 会把风扇降到真正的物理最低转速,甚至完全停转;稍一升温就立刻回到正常区间。温度足够低时,它会把风扇交还给 macOS;用电池时则直接释放控制、完全停止采样。

干活的是三个小程序:smcfan(C,约 200 行)负责读写 AppleSMC 风扇寄存器,fanctld(Python 写的 root 守护进程)跑控制回路,Swift 写的菜单栏 App 只读守护进程写出的状态文件。每条退出路径都先把风扇交还系统,目标转速始终钳在风扇实测的上下限内,芯片自带的过热保护永远优先于任何软件。没有任何遥测。