笔记本合盖 → 休眠几秒后消耗最少电量。服务器空闲 → CPU 进入深度 C-state。数据中心 → 关闭整个刀片。电源管理贯穿从单设备到整个系统。
一、先看图
flowchart TD
subgraph 设备级
RPM[Runtime PM<br/>单设备自动休眠]
end
subgraph 系统级
S2I[suspend-to-idle<br/>s2idle / S0ix]
S3[S3 suspend<br/>suspend-to-RAM]
S4[S4 hibernate<br/>suspend-to-disk]
end
RPM --> DEVICE[设备空闲<br/>→ 低功耗]
S2I --> FREEZE[冻结进程<br/>+ CPU idle]
S3 --> RAM[关闭设备<br/>+ 内存保持供电]
S4 --> DISK[内存写入磁盘<br/>+ 断电]
classDef dev fill:#388bfd22,stroke:#388bfd,color:#adbac7;
classDef sys fill:#3fb95022,stroke:#3fb950,color:#adbac7;
class RPM,DEVICE dev
class S2I,S3,S4,FREEZE,RAM,DISK sys
二、Runtime PM
单个设备的电源管理:
pm_runtime_get_sync(dev); // 使用设备前
// ... 使用设备 ...
pm_runtime_put_autosuspend(dev); // 使用完毕设备空闲超时 → 自动进入低功耗状态。
2.1 autosuspend
pm_runtime_set_autosuspend_delay(dev, 2000); // 2 秒后自动休眠
pm_runtime_use_autosuspend(dev);避免频繁开关设备(USB 设备、GPU)。
三、系统级休眠
3.1 suspend-to-idle(s2idle)
echo s2idle > /sys/power/mem_sleep
echo mem > /sys/power/state- 冻结所有进程
- CPU 进入最深 idle state
- 设备保持供电(但 runtime PM 可能关闭部分)
最快恢复(~100ms)。
3.2 S3 suspend-to-RAM
echo deep > /sys/power/mem_sleep
echo mem > /sys/power/state- 冻结进程
- 关闭设备
- 内存保持供电
- CPU 断电
恢复需要重新初始化 CPU 和设备(~1-3s)。
3.3 S4 hibernate
echo disk > /sys/power/state- 内存内容写入 swap 分区
- 完全断电
- 开机后从 swap 恢复
恢复慢(10+ 秒),但零功耗。
四、休眠流程
sequenceDiagram
participant PM as PM Core
participant DEV as 设备驱动
participant PROC as 进程
PM->>PROC: freeze_processes()
PM->>DEV: suspend() 每个设备
PM->>PM: 平台休眠(ACPI/DT)
Note over PM: 系统休眠中...
PM->>PM: 唤醒
PM->>DEV: resume() 每个设备
PM->>PROC: thaw_processes()
五、pm_qos
应用和驱动声明延迟需求:
// 内核
pm_qos_add_request(&req, PM_QOS_CPU_DMA_LATENCY, 50); // 50μs
// 用户态
echo 50 > /dev/cpu_dma_latencypm_qos 阻止 CPU 进入高延迟的 C-state → 保证响应时间。
六、C-state 与 P-state
| 概念 | 含义 |
|---|---|
| C-state | 空闲状态(C0=运行、C1=halt、C6=深度休眠) |
| P-state | 性能状态(频率/电压档位) |
cpuidle governor(menu/haltpoll)选择 C-state。 cpufreq governor(schedutil/ondemand)选择 P-state。
七、笔记本 vs 服务器
| 场景 | 策略 |
|---|---|
| 笔记本 | s2idle/S3 频繁休眠、积极降频 |
| 服务器 | 很少休眠、P-state 按负载调整 |
| 数据中心 | 空闲刀片可能完全关闭 |
| 嵌入式 | 深度定制 runtime PM |
八、唤醒源
cat /sys/power/wakeup_count
cat /sys/devices/.../power/wakeupUSB 设备、网卡(Wake-on-LAN)、RTC alarm、键盘 → 可配置为唤醒源。
九、观察
# 支持的休眠模式
cat /sys/power/state # freeze mem disk
cat /sys/power/mem_sleep # s2idle [deep]
# Runtime PM 状态
cat /sys/devices/.../power/runtime_status
# pm_qos
cat /dev/cpu_dma_latency
# 电源事件
dmesg | grep -i "suspend\|resume\|PM:"
journalctl -b | grep -i suspend十、小结
- Runtime PM:单设备自动休眠 → 移动设备省电关键
- s2idle/S3/S4:系统级休眠,恢复时间递增
- pm_qos:声明延迟需求 → 阻止过深的休眠
- C-state 控制空闲功耗,P-state 控制运行功耗
- 笔记本和服务器策略截然不同
参考文献
Documentation/power/drivers/base/power/- Rafael Wysocki, “System Sleep States.” kernel.org
include/linux/pm_qos.h
工具
/sys/power/powertopturbostatpm-utils
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
EEVDF 调度器:Linux 6.6 为什么换掉了 CFS
Linux 6.6 用 EEVDF 取代了 CFS 的 SCHED_NORMAL 选取逻辑。从 1995 年原始论文的 lag、eligibility、virtual deadline,到 commit 147f3ef 只重写 placement/pick/preempt,再到本机内核 6.6 上读 sched/debug 把每个任务的 vruntime、eligible 标志、deadline 一一对上 vd=ve+r/w,外加 nice 带宽与 base_slice 抢占两组实测,讲清换的是哪一块、延迟敏感任务凭什么先跑。
【操作系统百科】Windows 内核与 Linux 的关键差异
NT Executive/Kernel/HAL 分层、Object Manager 与 handle、IRP 驱动栈、IOCP 完成端口 vs epoll/io_uring、EPROCESS/KTHREAD vs task_struct、Registry vs 文件配置,以及 WSL2 为何选择 Hyper-V 轻量 VM。
【操作系统百科】实时 OS 巡礼
硬实时与软实时的可调度性边界、VxWorks/QNX/Zephyr 机制对照、Linux PREEMPT_RT 与主线合入、DO-178C/ISO 26262 认证语境,以及选型决策树。
【操作系统百科】Unikernel
Unikernel 在云上为什么没成主流?MirageOS、IncludeOS、Unikraft、OSv 的设计取舍——库操作系统、启动时间、工具链、调试困难、POSIX 兼容。