systemctl suspend VS pm-suspend

因为 RHEL 7 及其衍生版 CentOS 7.0 和 Oracle Linux 7.0 的相继发布,开始系统地学习 systemd ;-D

RHEL 7 的文档是一如既往的棒,而且红帽系的血统纯正,拿来当参照物学习再好不过的选择了。虽然之前在 Arch Linux 上用 systemd 已近两年(2012年10月起 systemd 就成为新安装系统的默认 init 系统),但仅停留在需要用到什么用什么学习什么的层次。

最近看 RHEL 7 的文档注意到 systemctl 工具已经替换了旧的 pm-utils 包提供的电源管理命令,建议尽可能使用 systemctl 命令来做相关的电源管理操作,比如 {halt,poweroff,reboot,pm-suspend} 等。

此前三星在 N148 上网本上 sleep 都是通过 pm-utils 里的 pm-suspend 做的,看完文档决定试了一下 systemctl suspend 结果发现后者快多了!

花了点时间一探究竟,简单的说 systemd 完全是新的实现,没有调用 pm-utils 中的命令,和后者没有关系。

从技术上来讲 systemctl suspend 的过程是这样的

  • systemctl suspend 进入目标 suspend.target

  • 该目标绑定的服务是 systemd-suspend.service

  • 这个服务调用的底层命令是 /usr/lib/systemd/systemd-sleep suspend
    做了十几次测试,结论是 systemctl suspendpm-suspend 快的根本原因是前者在 user mode (用户模式)和 kernel mode (内核模式,主要是系统调用)下执行所消耗的 CPU 时间之和远小于后者。

在三星 N148 上测试的结果为: systemctl suspend 在用户模式+内核模式执行共消耗时间约0.01秒,而后者超过2秒!因为用了最新的 3.16 内核,可能还受益于 Linux 3.15 中加入的 SATA HDD 异步快速恢复特性。

如图(忽略 _real _与测试无关)

systemctl suspend VS pm-suspend

此外,在 CentOS 7.0 的台式机上测试 systemctl suspend 速度也非常快。所以,是时候和 pm-utils 说再见了。

Enjoy systemd :-D