提高性能
本文提供有关与性能相关的基本系统诊断的信息,以及可以采取的步骤来减少资源消耗或以其他方式优化系统,最终目标是感知到或记录在案的系统性能改进。另请参阅 Gaming#提高性能,以获取更多针对游戏和低延迟的建议。
基础知识
了解你的系统
优化系统的最佳方法是针对瓶颈,即限制整体速度的子系统。系统规格可以帮助识别它们。
- 如果当大型应用程序(例如 LibreOffice 和 Firefox)同时运行时计算机变慢,请检查 RAM 容量是否足够。使用以下命令,并检查“available”列
$ free -h
- 如果启动时间很慢,并且应用程序在首次启动时加载时间很长(仅限首次),那么硬盘驱动器很可能是罪魁祸首。可以使用
hdparm
命令测量硬盘驱动器的速度# hdparm -t /dev/sdX
注意: hdparm 仅指示硬盘驱动器的纯读取速度,而不是有效的基准。但是,在平均系统上,高于 40MB/s(空闲时)的值是可以接受的。 - 如果即使在有足够的可用 RAM 的情况下 CPU 负载仍然持续很高,请尝试通过禁用正在运行的守护进程和/或进程来降低 CPU 使用率。这可以通过多种方式进行监控,例如使用 htop、
pstree
或任何其他系统监控工具$ htop
- 如果使用直接渲染的应用程序速度很慢(即那些使用 GPU 的应用程序,例如视频播放器、游戏,甚至窗口管理器),那么提高 GPU 性能应该会有所帮助。第一步是验证是否实际启用了直接渲染。这由
glxinfo
命令指示,它是 mesa-utils 软件包的一部分,当使用时应返回direct rendering: Yes
$ glxinfo | grep "direct rendering"
- 当运行桌面环境时,禁用(未使用的)视觉桌面效果可能会降低 GPU 使用率。如果当前环境不符合硬件和/或个人要求,请使用更轻量级的环境或创建自定义环境。
- 使用优化的内核可以提高性能。通常,linux-zen 是一个不错的选择。但是,可以按照本文某些部分所示的方式调整默认内核以获得更好的性能。
基准测试
优化的效果通常难以判断。但是,可以通过基准测试工具来衡量它们。
存储设备
扇区大小
检查你的 NVMe 驱动器和高级格式硬盘驱动器是否正在使用最佳逻辑扇区大小。
分区
确保你的分区已正确对齐。
多驱动器
如果你有多个可用磁盘,你可以将它们设置为软件 RAID 以获得显著的速度提升。
在单独的磁盘上创建 交换空间 也有很大帮助,特别是当你的机器频繁交换时。
使用 SSD 作为 HDD 的缓存
当放弃硬盘驱动器不是一种选择时,可以添加固态驱动器作为缓存层,以提高读取和/或写入速度并减少随机访问产生的噪音。实现此目的的选项包括 LVM#缓存、Bcache 和 Bcachefs#SSD 缓存。
在 HDD 上的布局
如果使用传统的旋转式 HDD,你的分区布局会影响系统的性能。驱动器开始处的扇区(更靠近磁盘外部)比末尾处的扇区更快。此外,较小的分区需要驱动器磁头的移动更少,从而加快磁盘操作。因此,建议仅为你的系统创建一个小分区(15-20GiB,或多或少取决于你的需求),尽可能靠近驱动器的开头。其他数据(图片、视频)应保存在单独的分区上,这通常通过将主目录 (/home
) 与系统 (/
) 分开来实现。
选择和调整你的文件系统
为特定系统选择最佳文件系统非常重要,因为每个文件系统都有自己的优势。《文件系统》文章简要概述了最流行的文件系统。你还可以在Category:文件系统中找到相关文章。
挂载选项
各种 *atime 选项可以减轻 strictatime
的性能损失。
其他挂载选项是文件系统特定的,因此请参阅文件系统的相关文章
调整内核参数
有几个关键的可调参数会影响块设备的性能,有关更多信息,请参阅 sysctl#虚拟内存。
输入/输出调度器
背景信息
输入/输出(I/O)调度器是内核组件,它决定将块 I/O 操作提交到存储设备的顺序。在此提醒一下两种主要驱动器类型的一些规范很有用,因为 I/O 调度器的目标是优化它们处理读取请求的方式
- HDD 具有旋转磁盘和一个物理移动到所需位置的磁头。因此,随机延迟非常高,范围在 3 到 12 毫秒之间(无论是高端服务器驱动器还是笔记本电脑驱动器,并绕过磁盘控制器写入缓冲区),而顺序访问提供更高的吞吐量。典型的 HDD 吞吐量约为每秒 200 次 I/O 操作(IOPS)。
- SSD 没有移动部件,随机访问与顺序访问一样快,通常低于 0.1 毫秒,并且它可以处理多个并发请求。典型的 SSD 吞吐量大于 10,000 IOPS,这在常见的工作负载情况下绰绰有余。
如果有许多进程向不同的存储部件发出 I/O 请求,则可能会生成数千个 IOPS,而典型的 HDD 只能处理大约 200 个 IOPS。有一个请求队列必须等待访问存储。这就是 I/O 调度器发挥优化作用的地方。
调度算法
提高吞吐量的一种方法是线性化访问:通过按逻辑地址对等待请求进行排序,并将最接近的请求分组在一起。从历史上看,这是第一个 Linux I/O 调度器,称为 电梯算法。
电梯算法的一个问题是,对于执行顺序访问的进程来说,它不是最优的:读取一个数据块,处理几微秒,然后读取下一个数据块,依此类推。电梯调度器不知道进程即将读取附近的另一个块,因此,它会移动到另一个位置的其他进程的请求。 预读式 I/O 调度器克服了这个问题:它会暂停几毫秒,以预期会有另一个附近的读取操作,然后再处理另一个请求。
虽然这些调度器试图提高总吞吐量,但它们可能会使一些不幸的请求等待很长时间。举个例子,假设大多数进程在存储空间的开头发出请求,而一个不幸的进程在存储空间的另一端发出请求。这种潜在的无限期推迟进程被称为饥饿。为了提高公平性,开发了 截止时间 算法。它有一个按地址排序的队列,类似于电梯算法,但是如果某个请求在这个队列中停留时间过长,它就会移动到一个按过期时间排序的“过期”队列。调度器首先检查过期队列并处理那里的请求,然后才移动到电梯队列。请注意,这种公平性会对整体吞吐量产生负面影响。
完全公平队列 (CFQ) 以不同的方式处理问题,它根据提交进程的优先级,为每个队列分配时间片和允许的请求数量。它支持 cgroup,允许为特定的进程集合预留一些 I/O。这对于共享和云托管尤其有用:为某些 IOPS 付费的用户希望在需要时获得他们的份额。此外,它在同步 I/O 结束时空闲,等待附近的其他操作,从预读式调度器接管了这个特性,并带来了一些增强。预读式和电梯调度器都已从 Linux 内核中移除,取而代之的是下面介绍的更高级的替代方案。
预算公平队列 (BFQ)[死链接 2024-12-15 ⓘ] 基于 CFQ 代码,并带来了一些增强。它不为每个进程分配固定的时间片来使用磁盘,而是为进程分配以扇区数衡量的“预算”并使用启发式方法。它是一个相对复杂的调度器,可能更适合旋转驱动器和慢速 SSD,因为其较高的单次操作开销,特别是与慢速 CPU 关联时,可能会拖慢快速设备的速度。BFQ 在个人系统上的目标是,对于交互式任务,存储设备实际上就像空闲时一样响应迅速。在其默认配置中,它侧重于提供最低的延迟,而不是实现最大的吞吐量,这有时可以极大地加速硬盘上应用程序的启动。
Kyber 是一个受用于网络路由的主动队列管理技术启发的最新调度器。该实现基于“令牌”,令牌充当限制请求的机制。分配请求需要排队令牌,这用于防止请求饥饿。还需要调度令牌,它限制给定设备上特定优先级的操作。最后,定义了目标读取延迟,调度器会自行调整以达到此延迟目标。该算法的实现相对简单,并且被认为对于快速设备是高效的。
内核的 I/O 调度器
虽然一些早期的算法现在已被弃用,但官方 Linux 内核支持多种 I/O 调度器。 多队列块 I/O 排队机制 (blk-mq) 将 I/O 查询映射到多个队列,任务分布在多个线程和 CPU 核心上。在此框架内,可以使用以下调度器
- None,不应用排队算法。
- mq-deadline,截止时间调度器(见下文)到多线程的适配。
- Kyber
- BFQ
更改 I/O 调度器
列出设备的可用调度器和活动调度器(在括号中)
$ cat /sys/block/sda/queue/scheduler
mq-deadline kyber [bfq] none
列出所有设备的可用调度器
$ grep "" /sys/block/*/queue/scheduler
/sys/block/pktcdvd0/queue/scheduler:none /sys/block/sda/queue/scheduler:mq-deadline kyber [bfq] none /sys/block/sr0/queue/scheduler:[mq-deadline] kyber bfq none
要将设备 sda 的活动 I/O 调度器更改为 bfq,请使用
# echo bfq > /sys/block/sda/queue/scheduler
更改 I/O 调度器的过程,取决于磁盘是否旋转,可以自动化并在重启后保持。例如,下面的 udev 规则将旋转驱动器的调度器设置为 bfq,将 SSD/eMMC 驱动器的调度器设置为 bfq,将 NVMe 驱动器的调度器设置为 none
/etc/udev/rules.d/60-ioschedulers.rules
# HDD ACTION=="add|change", KERNEL=="sd[a-z]*", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq" # SSD ACTION=="add|change", KERNEL=="sd[a-z]*|mmcblk[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="bfq" # NVMe SSD ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"
重启或强制 udev#加载新规则。
调整 I/O 调度器
内核的每个 I/O 调度器都有自己的可调参数,例如延迟时间、过期时间或 FIFO 参数。它们有助于将算法调整到特定的设备和工作负载组合。这通常是为了在给定的利用率下实现更高的吞吐量或更低的延迟。可调参数及其描述可以在 内核文档 中找到。
要列出设备的可调参数,在下面的示例中,sdb 正在使用 deadline,请使用
$ ls /sys/block/sdb/queue/iosched
fifo_batch front_merges read_expire write_expire writes_starved
为了以延迟为代价提高 deadline 的吞吐量,可以使用以下命令增加 fifo_batch
# echo 32 > /sys/block/sdb/queue/iosched/fifo_batch
电源管理配置和写入缓存
在处理传统旋转磁盘 (HDD) 时,您可能需要完全禁用或降低节能功能,并检查是否启用了写入缓存。
请参阅 Hdparm#电源管理配置 和 Hdparm#写入缓存。
之后,您可以创建一个 udev 规则 以在启动时应用它们。
减少磁盘读取/写入
避免不必要地访问慢速存储驱动器有利于性能,也有利于延长设备的使用寿命,尽管在现代硬件上,寿命预期的差异通常可以忽略不计。
显示磁盘写入
iotop 软件包可以按磁盘写入进行排序,并显示程序写入磁盘的量和频率。有关详细信息,请参阅 iotop(8)。
将文件重定位到 tmpfs
将文件(例如您的浏览器配置文件)重定位到 tmpfs 文件系统,以提高应用程序响应速度,因为所有文件现在都存储在 RAM 中
- 有关同步浏览器配置文件,请参阅 Profile-sync-daemon。某些浏览器可能需要特别注意,例如,请参阅 RAM 上的 Firefox。
- 有关同步任何指定文件夹,请参阅 Anything-sync-daemon。
- 有关通过在 tmpfs 中构建软件包来缩短编译时间,请参阅 Makepkg#提高构建时间。
文件系统
如果文件系统页面中有性能改进说明,请参阅相应的 文件系统 页面,请参阅 #选择和调整文件系统 中的列表。
交换空间
有关详细信息,请参阅 Swap#性能。
回写间隔和缓冲区大小
有关详细信息,请参阅 Sysctl#虚拟内存。
禁用核心转储
请参阅 Core dump#禁用自动核心转储。
使用 ionice 进行存储 I/O 调度
许多任务(例如备份)不依赖于短的存储 I/O 延迟或高存储 I/O 带宽来完成其任务,它们可以被归类为后台任务。另一方面,快速 I/O 对于桌面上的良好 UI 响应速度是必要的。因此,减少后台任务可用的存储带宽量是有益的,而其他任务则需要存储 I/O。这可以通过使用 Linux I/O 调度器 CFQ 来实现,该调度器允许为进程设置不同的优先级。
可以通过使用以下命令启动后台进程,将其 I/O 优先级降低到“空闲”级别
# ionice -c 3 command
有关更多信息,请参阅 ionice 简介 和 ionice(1)。
TRIM
为了获得最佳性能,应定期丢弃(也称为 TRIM)固态硬盘的空块,以优化随机写入速度。有关更多信息,请参阅 固态硬盘#TRIM。
CPU
超频
超频 通过提高 CPU 的峰值时钟频率来提高其计算性能。超频能力取决于 CPU 型号和主板型号的组合。它最常通过 BIOS 完成。超频也有缺点和风险。此处既不推荐也不反对超频。
许多 Intel 芯片不会将它们的时钟频率正确报告给 acpi_cpufreq 和大多数其他实用程序。这将导致 dmesg 中出现过多的消息,可以通过卸载和黑名单内核模块 acpi_cpufreq
来避免这种情况。要读取它们的时钟速度,请使用 i7z 软件包中的 i7z。要检查超频 CPU 的正确运行情况,建议进行 压力测试。
频率调节
请参阅 CPU 频率调节。
CPU 调度器
主线 Linux 内核中的默认 CPU 调度器是 EEVDF。
- MuQSS — 多队列跳跃列表调度器。可通过 Con Kolivas 开发的
-ck
补丁集获得。
- 非官方用户仓库/Repo-ck || linux-ckAUR
- Project C — 将 BMQ 重构为 Project C 的跨项目,并基于 Project C 代码库重新创建 PDS。因此,它是两个项目的合并,随后将 PDS 更新为 Project C。推荐作为更新近的开发项目。
- BORE — BORE 调度器侧重于牺牲一些公平性来降低交互式任务调度的延迟,它构建在 CFS 之上,仅针对 vruntime 代码更新进行了调整,因此与其他非官方 CPU 调度器相比,总体更改相当小。
实时内核
某些应用程序(例如以全高清分辨率 (1080p) 运行电视调谐器卡)可能会受益于使用 实时内核。
调整进程优先级
Ananicy
Ananicy CPP 是一个守护进程,可以作为 ananicy-cpp 或 ananicy-cpp-gitAUR 获取,用于自动调整可执行文件的 nice 值。Nice 值代表分配 CPU 资源时可执行文件的优先级。
cgroups
参见 cgroups。
Cpulimit
Cpulimit 是一个限制特定进程 CPU 使用率百分比的程序。安装 cpulimitAUR 后,您可以使用 0 到 100 乘以计算机 CPU 核心数的比例来限制进程 PID 的 CPU 使用率。例如,对于八核 CPU,百分比范围将为 0 到 800。用法
$ cpulimit -l 50 -p 5081
irqbalance
irqbalance 的目的是在多处理器系统上将硬件中断分配到各个处理器,以提高性能。它可以通过提供的 irqbalance.service
进行控制。
关闭 CPU 漏洞缓解
关闭 CPU 漏洞缓解可能会提高性能。使用以下内核参数禁用所有缓解措施
mitigations=off
所有开关的解释都可以在 kernel.org 上找到。您可以使用 spectre-meltdown-checkerAUR 或 lscpu(1) (来自 util-linux) 进行漏洞检查。
图形
Xorg 配置
图形性能可能取决于 xorg.conf(5) 中的设置;请参阅 NVIDIA、AMDGPU 和 Intel 文章。不正确的设置可能会阻止 Xorg 正常工作,因此建议谨慎操作。
Mesa 配置
Mesa 驱动程序的性能可以通过 drirc 进行配置。adriconf (高级 DRI 配置器) 是一个 GUI 工具,用于通过设置选项并将它们写入标准 drirc 文件来配置 Mesa 驱动程序。
硬件视频加速
硬件视频加速 使视频卡能够解码/编码视频。
超频
与 CPU 一样,超频可以直接提高性能,但通常不建议这样做。有几个软件包可以实现超频,例如 rovclockAUR (ATI 显卡)、rocm-smi-lib (较新的 AMD 显卡)、nvclockAUR (旧 NVIDIA 显卡 - 最高 Geforce 9) 和 nvidia-utils (用于较新的 NVIDIA 显卡)。
请参阅 AMDGPU#超频 或 NVIDIA/技巧和提示#在 nvidia-settings 中启用超频。
启用 PCIe Resizable BAR
- 在某些系统上,启用 PCIe resizable BAR 可能会导致明显的性能损失。请对您的系统进行基准测试,以确保它能提高性能。
- 必须禁用 兼容性支持模块 (CSM) 才能使此功能生效。
PCI 规范允许使用更大的 基地址寄存器 (BAR) 以将 PCI 设备内存暴露给 PCI 控制器。这可以提高显卡的性能。访问完整的显存可以提高性能,还可以启用图形驱动程序中的优化。Resizable BAR、4G 以上解码和这些驱动程序优化的组合是 AMD 所谓的 AMD Smart Access Memory[死链接 2024-07-30 ⓘ],最初在 AMD 500 系列芯片组主板上可用,后来通过 UEFI 更新扩展到 AMD 400 系列和 Intel 300 系列及更高版本。此设置可能并非在所有主板上都可用,并且已知有时会在某些主板上导致启动问题。
如果 BAR 的大小为 256M,则表示该功能未启用或不受支持
# dmesg | grep BAR=
[drm] Detected VRAM RAM=8176M, BAR=256M
要启用它,请在主板设置中启用名为 “Above 4G Decode” 或 “>4GB MMIO” 的设置。验证 BAR 现在是否更大
# dmesg | grep BAR=
[drm] Detected VRAM RAM=8176M, BAR=8192M
RAM、交换分区和 OOM 处理
时钟频率和时序
RAM 可以在不同的时钟频率和时序下运行,这些可以在 BIOS 中配置。内存性能取决于这两个值。选择 BIOS 提供的最高预设值通常可以提高性能,优于默认设置。请注意,将频率提高到主板和 RAM 供应商都不支持的值是超频,并且存在类似的风险和缺点,请参阅 #超频。
Root on RAM overlay
如果从写入速度较慢的介质(USB、机械硬盘)运行且存储需求较低,则 root 可以运行在 RAM 覆盖层之上,位于(磁盘上的)只读 root 之上。这可以极大地提高性能,但代价是 root 的可写空间有限。请参阅 liverootAUR。
zram 或 zswap
使用 zswap 或 zram 可以实现类似的好处(以类似的成本)。两者在目的上通常相似,但在操作上有所不同:zswap 作为压缩 RAM 缓存运行,既不需要(也不允许)广泛的用户空间配置,而 zram 是一个内核模块,可用于在 RAM 中创建压缩块设备。zswap 与交换设备协同工作,而 zram 则不需要后备交换设备。
使用显卡的 RAM
在极少数情况下,如果您的 RAM 非常少但显存过剩,则可以使用后者作为交换分区。请参阅 Swap on video RAM。
提高低内存条件下的系统响应能力
在传统的 GNU/Linux 系统上,特别是对于图形工作站,当分配的内存超出承诺时,整个系统的响应能力可能会降低到几乎无法使用的状态,然后才会触发内核 OOM killer 或释放足够的内存(当系统无响应时,不太可能快速发生这种情况,因为您几乎无法关闭任何可能继续分配更多内存的内存密集型应用程序)。行为还取决于特定的设置和条件,恢复到正常的响应状态可能需要几秒钟到半个多小时,这在诸如会议演示之类的严肃场景中可能难以忍受。
虽然内核以及用户空间事物在低内存条件下的行为可能会在未来得到改善,正如在 kernel 和 Fedora 邮件列表中讨论的那样,但用户可以使用比硬重启系统或调整 vm.overcommit_*
sysctl 参数更可行和有效的选项
- 使用 Magic SysRq 键 手动触发内核 OOM killer,即
Alt+SysRq+f
。 - 使用用户空间 OOM 守护程序来自动(或交互式地)处理这些问题。
有时用户可能更喜欢 OOM 守护程序而不是 SysRq,因为使用内核 OOM killer,您无法确定要(或不要)终止的进程的优先级。以下列出一些 OOM 守护程序
- systemd-oomd — 由 systemd 作为
systemd-oomd.service
提供,它使用 cgroups-v2 和压力暂缓信息 (PSI) 来监控进程并在内核空间中发生 OOM 之前采取措施。
- earlyoom — 用 C 语言编写的简单用户空间 OOM killer 实现。
- oomd — 基于 PSI 的 OOM killer 实现,需要 Linux 内核版本 4.20+。配置采用 JSON 格式,相当复杂。已确认在 Facebook 的生产环境中工作。
- nohang — 用 Python 编写的复杂的 OOM 处理程序,具有可选的 PSI 支持,比 earlyoom 更可配置。
- low-memory-monitor — GNOME 开发人员的努力,旨在为用户空间应用程序提供更好的通信以指示低内存状态,此外,它还可以配置为触发内核 OOM killer。基于 PSI,需要 Linux 5.2+。
- uresourced — 一个小型守护程序,为活动的图形用户会话启用基于 cgroup 的资源保护。
网络
- 内核网络:请参阅 Sysctl#提高性能
- 网卡:请参阅 网络配置#设置设备 MTU 和队列长度
- DNS:考虑使用缓存 DNS 解析器,请参阅 域名解析#DNS 服务器
- Samba:请参阅 Samba#提高吞吐量
看门狗
- 看门狗定时器 [...] 是一种电子定时器,用于检测计算机故障并从中恢复。在正常操作期间,计算机会定期重置看门狗定时器 [...]。如果,[...],计算机未能重置看门狗,则定时器将超时并生成超时信号 [...] 用于启动纠正 [...] 措施 [...] 通常包括将计算机系统置于安全状态并恢复正常的系统操作。
Systemd 看门狗
Systemd 包括一个内置的看门狗重置机制,如果加载了正确的内核模块(见下文),该机制与通过 /dev/watchdog
暴露给用户空间的硬件看门狗交互。当系统变得无响应时,硬件看门狗将触发系统重置。
启用看门狗的好处
- 防止无限期关机延迟
- 如果没有看门狗,某些服务可能会在关机期间无限期挂起,从而导致长时间延迟。
- 通过正确配置 watchdog,systemd 会在设定的超时时间内强制执行重启,从而确保更快的关机。
- 避免关键服务冻结
- 如果关键系统服务(例如,网络、文件系统、ACPI)变得无响应,watchdog 会检测到这种情况并触发立即重启。
- 这可以防止由原本会无限期停顿的服务导致的 启动变慢。
- 优化内核恢复
- 如果内核停止响应超过 RuntimeWatchdogSec 阈值,watchdog 会自动触发重启,避免系统死锁。
- 这有助于防止 随机启动冻结 并保持系统稳定性。
- 增强资源管理
- 如果资源密集型进程导致系统停顿,watchdog 会强制重启,在系统完全无响应之前。
- 这可以帮助通过保持系统响应能力,在高 CPU/RAM 使用率场景中维持性能。
在 systemd 中配置 Watchdog
默认情况下,RuntimeWatchdogSec
是禁用的。要启用系统 watchdog,创建一个 systemd-system.conf(5) drop-in 文件,内容如下
/etc/systemd/system.conf.d/watchdog.conf
[Manager] RuntimeWatchdogSec=10s RebootWatchdogSec=45s
RuntimeWatchdogSec=10s
: 如果 systemd 无响应超过 10 秒,系统会重启。RebootWatchdogSec=45s
: 如果系统在重启期间挂起,watchdog 会在 45 秒后强制复位。
使用以下命令应用更改
# systemctl daemon-reexec
验证 watchdog 是否已激活
$ systemctl show | grep Watchdog
RuntimeWatchdogUSec=10000000 RebootWatchdogUSec=45000000
检查硬件 Watchdog 支持
在许多系统中,硬件 watchdog 支持可能由不同的内核模块提供(例如,在某些 Intel 芯片组上的 iTCO_wdt
,在某些 AMD 平台上的 sp5100_tco
)。要检查硬件 watchdog 模块,运行
$ lsmod | grep wdt
如果您找到相关的 watchdog 模块(例如,iTCO_wdt
、sp5100_tco
),请确保它在 启动时加载,方法是创建类似以下的文件
/etc/modules-load.d/watchdog.conf
module_name
# modprobe module_name
将 module_name
替换为您硬件的实际模块名称。
参考
- systemd-system.conf(5)
- Linux 内核 Watchdog 文档
- Arch Wiki – Systemd 启动
- Lennart Poettering 关于 systemd watchdog 的博客文章