提升性能

来自 ArchWiki
(重定向自 Performance

本文提供有关与性能相关的基本系统诊断的信息,以及可以采取的步骤来减少资源消耗或以其他方式优化系统,最终目标是系统性能的感知或记录的改进。另请参阅 Gaming#Improving performance,以获取更多游戏和低延迟方面的具体建议。

基础知识

了解你的系统

调整系统的最佳方法是针对瓶颈,或限制整体速度的子系统。系统规格可以帮助识别它们。

  • 如果计算机在同时运行大型应用程序(如 LibreOffice 和 Firefox)时变慢,请检查 RAM 容量是否足够。使用以下命令,并检查“available”列
    $ free -h
  • 如果启动时间很慢,并且应用程序在首次启动时加载时间很长(仅限首次),则可能是硬盘驱动器的原因。可以使用 hdparm 命令测量硬盘驱动器的速度
    # hdparm -t /dev/sdX
    注意: hdparm 仅指示硬盘驱动器的纯读取速度,而不是有效的基准。但是,在普通系统上,高于 40MB/s(空闲时)的值是可以接受的。
  • 如果即使在 RAM 容量充足的情况下 CPU 负载仍然持续很高,请尝试通过禁用正在运行的 守护进程 和/或进程来降低 CPU 使用率。这可以通过多种方式进行监控,例如使用 htoppstree 或任何其他 系统监控 工具
    $ htop
  • 如果使用直接渲染的应用程序速度很慢(即那些使用 GPU 的应用程序,例如视频播放器、游戏,甚至 窗口管理器),那么提高 GPU 性能应该会有所帮助。第一步是验证是否实际启用了直接渲染。这由 glxinfo 命令指示,该命令是 mesa-utils 软件包的一部分,使用时应返回 direct rendering: Yes
    $ glxinfo | grep "direct rendering"
  • 当运行 桌面环境 时,禁用(未使用的)可视化桌面效果可能会降低 GPU 使用率。如果当前环境不符合硬件和/或个人要求,请使用更轻量级的环境或创建 自定义环境
  • 使用优化的 内核 可以提高性能。通常,linux-zen 是一个不错的选择。但是,可以按照本文某些部分所示的方式调整默认内核以获得更好的性能。

基准测试

优化的效果通常难以判断。但是,可以使用 基准测试 工具来衡量它们。

存储设备

扇区大小

检查您的 NVMe 驱动器和高级格式硬盘驱动器是否正在使用最佳逻辑扇区大小

分区

确保您的分区已正确对齐

多驱动器

如果您有多个可用磁盘,您可以将它们设置为软件 RAID 以获得显著的速度提升。

在单独的磁盘上创建 交换空间 也有很大帮助,尤其是在您的机器频繁交换时。

使用 SSD 作为 HDD 的缓存

当放弃硬盘驱动器不是一种选择时,可以添加固态驱动器作为缓存层,以提高读取和/或写入速度并减少随机访问产生的噪音。实现此目的的选项包括 LVM#CacheBcacheBcachefs#SSD caching

HDD 上的布局

如果使用传统的旋转 HDD,您的分区布局会影响系统性能。驱动器开始处的扇区(更靠近磁盘外部)比末尾的扇区更快。此外,较小的分区需要驱动器磁头移动更少,因此可以加快磁盘操作速度。因此,建议仅为您的系统创建一个小分区(15-20GiB,或多或少取决于您的需求),尽可能靠近驱动器的开头。其他数据(图片、视频)应保存在单独的分区上,这通常通过将主目录 (/home) 与系统 (/) 分开来实现。

注意: 与此页面上的所有建议一样,请衡量所提供的好处:除非短行程硬盘驱动器并仅使用其总容量的几个百分比,否则分隔分区只会将访问时间提高几个百分比,因为读/写操作通常仍会在整个驱动器上展开。相比之下,升级到 SSD 将使性能提高一个数量级以上。

选择和调整文件系统

为特定系统选择最佳文件系统非常重要,因为每个文件系统都有自己的优势。文件系统文章简要概述了最流行的文件系统。您还可以在 Category:File systems 中找到相关文章。

挂载选项

各种 *atime 选项可以缓解 strictatime 的性能损失。

其他挂载选项是文件系统特定的,因此请参阅文件系统的相关文章

调整内核参数

有几个关键的可调参数会影响块设备的性能,有关更多信息,请参见 sysctl#Virtual memory

输入/输出调度器

背景信息

输入/输出 (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 调度器克服了这个问题:它暂停几毫秒,以预期另一个附近的读取操作,然后再处理另一个请求。

虽然这些调度器试图提高总吞吐量,但它们可能会使一些不幸的请求等待很长时间。例如,想象一下,大多数进程都在存储空间的开头发出请求,而一个不幸的进程在存储的另一端发出请求。进程的这种可能无限期的延迟称为饥饿。为了提高公平性,开发了 deadline 算法。它有一个按地址排序的队列,类似于电梯,但是如果某个请求在此队列中停留时间过长,则会移动到按过期时间排序的“过期”队列。调度器首先检查过期队列并处理那里的请求,然后才移动到电梯队列。请注意,这种公平性对整体吞吐量有负面影响。

完全公平队列 (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,deadline 调度器(见下文)到多线程的适配。
  • Kyber
  • BFQ

更改 I/O 调度器

注意: 最佳调度器选择取决于设备和工作负载的确切性质。此外,MB/s 的吞吐量不是衡量性能的唯一标准:deadline 或 fairness 会降低整体吞吐量,但可能会提高系统响应速度。基准测试 可能有助于指示每个 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#Loading new rules

调整 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#Power management configurationHdparm#Write cache

之后,您可以创建一个 udev 规则,以便在启动时应用它们。

提示: GNOME 允许通过“磁盘”应用程序设置其中一些参数,并且不需要 udev 规则。
注意: 某些功能可能不受您的硬盘驱动器支持。如果是这种情况,Hdparm 将通知您。因此,只需忽略此特定功能的配置即可。

减少磁盘读取/写入

避免不必要地访问速度较慢的存储驱动器有利于性能,并且还可以延长设备的使用寿命,尽管在现代硬件上,预期寿命的差异通常可以忽略不计。

注意: 具有中等 10 倍写入放大系数、标准 10000 次写入/擦除周期和每天写入 10GB 数据的 32GB SSD,将获得 8 年的预期寿命。对于 更大的 SSD 和具有更少写入放大的现代控制器,情况会更好。另请参阅 此耐久性实验,以考虑是否实际需要任何限制磁盘写入的特定策略。

显示磁盘写入

iotop 软件包可以按磁盘写入进行排序,并显示程序写入磁盘的量和频率。有关详细信息,请参见 iotop(8)

将文件重定位到 tmpfs

将文件(例如您的浏览器配置文件)重定位到 tmpfs 文件系统,以提高应用程序响应速度,因为所有文件现在都存储在 RAM 中

文件系统

如果文件系统页面中有性能改进说明,请参阅相应的文件系统页面,请参见#选择和调整文件系统中的列表。

交换空间

有关详细信息,请参见 Swap#Performance

回写间隔和缓冲区大小

有关详细信息,请参见 Sysctl#Virtual memory

禁用核心转储

请参见 Core dump#Disabling automatic core dumps

使用 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),以优化随机写入速度。有关更多信息,请参见 Solid state drive#TRIM

CPU

超频

超频 通过提高 CPU 的峰值时钟频率来提高其计算性能。超频能力取决于 CPU 型号和主板型号的组合。它最常通过 BIOS 完成。超频也有缺点和风险。此处既不推荐也不反对。

许多 Intel 芯片无法向 acpi_cpufreq 和大多数其他实用程序正确报告其时钟频率。这将导致 dmesg 中出现过多的消息,这可以通过卸载和黑名单内核模块 acpi_cpufreq 来避免。要读取其时钟速度,请使用 i7z 软件包中的 i7z。要检查超频 CPU 的正确运行情况,建议进行 压力测试

频率调节

请参见 CPU frequency scaling

CPU 调度器

主线 Linux 内核中的默认 CPU 调度器是 EEVDF

本文或本节需要扩充。

原因: 将之前的默认调度器 CFS 添加到列表中。(在 Talk:Improving performance 中讨论)
  • MuQSS — 多队列跳跃列表调度器。可与 <代码>-ck 补丁集一起使用,该补丁集由 Con Kolivas 开发。
Unofficial user repositories/Repo-ck || linux-ckAUR
  • Project C — 将 BMQ 重构为 Project C 的跨项目,并基于 Project C 代码库重新创建 PDS。因此,它是两个项目的合并,随后将 PDS 更新为 Project C。推荐作为更新的开发。
https://cchalpha.blogspot.com/ || linux-prjcAUR
  • BORE — BORE 调度器侧重于牺牲一些公平性,以降低调度交互式任务的延迟,它构建在 CFS 之上,仅针对 vruntime 代码更新进行了调整,因此与其他非官方 CPU 调度器相比,总体更改非常小。
https://github.com/firelzrd/bore-scheduler || linux-cachyos-boreAUR

实时内核

某些应用程序(如以全高清分辨率 (1080p) 运行电视调谐器卡)可能会受益于使用 实时内核

调整进程优先级

另请参见 nice(1)renice(1)

Ananicy

Ananicy CPP 是一个守护程序,可用作 ananicy-cppananicy-cpp-gitAUR,用于自动调整可执行文件的 nice 级别。nice 级别表示分配 CPU 资源时可执行文件的优先级。

警告: GameModeAnanicy CPP 都会调整进程的 nice 级别。但是,不建议同时使用这两种工具。[1]

cgroups

请参见 cgroups

Cpulimit

Cpulimit 是一个限制特定进程的 CPU 使用率百分比的程序。安装 cpulimitAUR 后,您可以使用 0 到计算机拥有的 CPU 核心数 100 倍的比例来限制进程 PID 的 CPU 使用率。例如,对于八个 CPU 核心,百分比范围为 0 到 800。用法

$ cpulimit -l 50 -p 5081

irqbalance

irqbalance 的目的是在多处理器系统上跨处理器分配硬件中断,以提高性能。它可以由提供的 irqbalance.service 进行控制

关闭 CPU 漏洞缓解

警告: 在未考虑其打开的漏洞的情况下,请勿应用此设置。有关更多信息,请参见 此链接此链接

关闭 CPU 漏洞缓解可能会提高性能。使用以下 内核参数 以禁用所有缓解

mitigations=off

所有它切换的开关的解释都在 kernel.org 上给出。您可以使用 spectre-meltdown-checkerAURlscpu(1)(来自 util-linux)进行漏洞检查。

注意: 当使用第 10 代及更高版本的 Intel CPU 或 AMD Ryzen 1000 系列及更高版本时,禁用缓解措施的性能提升仅高达 5%,而不是早期 CPU 世代的高达 25%。请参见 2021 年初的总体评论Rocket Lake 上的测试Alder Lake 上的测试

图形

Xorg 配置

图形性能可能取决于 xorg.conf(5) 中的设置;请参见 NVIDIAAMDGPUIntel 文章。不正确的设置可能会阻止 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 可调整大小的 BAR

注意
  • 在某些系统上,启用 PCIe 可调整大小的 BAR 可能会导致显著的性能损失。请对您的系统进行基准测试,以确保它能提高性能。
  • 必须禁用 兼容性支持模块 (CSM) 才能使此功能生效。

PCI 规范允许使用更大的 基地址寄存器 (BAR) 来将 PCI 设备内存暴露给 PCI 控制器。这可以提高视频卡的性能。访问完整的显存可以提高性能,并且还可以在图形驱动程序中实现优化。可调整大小的 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 供应商都不支持的值是超频,并且存在类似的风险和缺点,请参阅 #超频

基于 RAM 覆盖的 Root 文件系统

此文章或章节已过时。

原因: liveroot 脚本似乎已无人维护,但此方法应该仍然有效。(在 Talk:Improving performance#Section_5.2: liveroot hasn't been updated since 2016 中讨论)

如果从写入速度慢的介质(USB、机械硬盘)运行,并且存储需求较低,则 root 文件系统可以在 RAM 覆盖层上运行,覆盖在(磁盘上的)只读 root 文件系统之上。这可以极大地提高性能,但代价是 root 文件系统的可写空间有限。请参阅 liverootAUR

zram 或 zswap

使用 zswapzram 可以实现类似的好处(以及类似的代价)。两者在目的上大致相似,但在操作上有所不同:zswap 充当压缩 RAM 缓存,既不需要(也不允许)广泛的用户空间配置,而 zram 是一个内核模块,可用于在 RAM 中创建压缩块设备。zswap 与交换设备协同工作,而 zram 不需要后备交换设备。

使用显卡的 RAM

在极少数情况下,如果您 RAM 非常小而显存充足,则可以使用后者作为交换分区。请参阅 在显存上使用交换分区

提高低内存条件下的系统响应能力

在传统的 GNU/Linux 系统上,特别是对于图形工作站,当分配的内存过度提交时,整体系统的响应能力可能会下降到几乎无法使用的状态,之后才会触发内核 OOM-killer 或释放足够的内存(当系统无响应时,不太可能快速发生内存释放,因为您几乎无法关闭任何可能继续分配更多内存的内存密集型应用程序)。此行为还取决于特定的设置和条件,恢复到正常的响应状态可能需要几秒钟到半个多小时,这在诸如会议演示之类的严肃场景中等待可能会很痛苦。

虽然内核以及用户空间在低内存条件下的行为可能会在未来得到改善,正如在 kernelFedora 邮件列表中讨论的那样,但用户可以使用比硬复位系统或调整 vm.overcommit_* sysctl 参数更可行和有效的选项。

  • 使用 Magic SysRq 键 手动触发内核 OOM-killer,即 Alt+SysRq+f
  • 使用用户空间 OOM 守护程序来自动(或交互式地)处理这些问题。
警告: 触发 OOM killer 杀死正在运行的应用程序可能会丢失您未保存的工作。这取决于您是足够耐心等待应用程序最终正常释放内存,还是希望尽快恢复无响应的系统。

有时,用户可能更喜欢 OOM 守护程序而不是 SysRq,因为使用内核 OOM-killer 您无法确定要(或不要)终止的进程的优先级。以下列出一些 OOM 守护程序:

  • systemd-oomd — 由 systemd 提供,作为 systemd-oomd.service,它使用 cgroups-v2 和压力暂缓信息 (PSI) 来监控进程并在内核空间中发生 OOM 之前采取行动。
https://github.com/systemd/systemd, systemd-oomd(8) || systemd
  • earlyoom — 用 C 语言编写的简单用户空间 OOM-killer 实现。
https://github.com/rfjakob/earlyoom || earlyoom
  • oomd — 基于 PSI 的 OOM-killer 实现,需要 Linux 内核版本 4.20+。配置采用 JSON 格式,并且相当复杂。已确认在 Facebook 的生产环境中工作。
https://github.com/facebookincubator/oomd || oomdAUR
  • nohang — 用 Python 编写的复杂 OOM 处理程序,具有可选的 PSI 支持,比 earlyoom 更可配置。
https://github.com/hakavlad/nohang || nohang-gitAUR
  • low-memory-monitor — GNOME 开发人员的努力,旨在为用户空间应用程序提供更好的通信,以指示低内存状态,此外,它可以配置为触发内核 OOM-killer。基于 PSI,需要 Linux 5.2+。
https://gitlab.freedesktop.org/hadess/low-memory-monitor/ || low-memory-monitor-gitAUR
  • uresourced — 一个小型守护程序,为活动图形用户会话启用基于 cgroup 的资源保护。
https://gitlab.freedesktop.org/benzea/uresourced || uresourcedAUR

网络

看门狗

根据 维基百科:看门狗定时器

看门狗定时器 [...] 是一种电子定时器,用于检测计算机故障并从中恢复。在正常操作期间,计算机定期重置看门狗定时器 [...]。如果,[...],计算机未能重置看门狗,则定时器将超时并生成超时信号 [...] 用于启动纠正 [...] 操作 [...] 通常包括将计算机系统置于安全状态并恢复正常的系统操作。

Systemd 看门狗

本文或本节需要扩充。

原因
  • 硬件看门狗的 systemd 配置是一方面。另一方面,是 systemd.service(5) 看门狗设置。描述将两者融合在一起,并省略了进程管理功能(例如,在失败时重启服务,发送通知等)。并非所有事情都需要立即重启,但了解哪个 pid 出错是关键。如果不是给出示例或链接到合适的示例(例如,基于 Systemd#通知有关失败的服务),则最好单独介绍单元设置。
  • nowatchdog 设置已通过 Special:diff/826099 更新,但已 交叉链接,并且可能(在个别情况下)对提高性能有用。(在 Talk:Improving performance 中讨论)

Systemd 包括一个内置的看门狗重置机制,如果加载了适当的内核模块(见下文),则与通过 /dev/watchdog 暴露给用户空间的硬件看门狗交互。当系统变得无响应时,硬件看门狗将触发系统重置。

启用看门狗的好处

  • 防止无限期的关机延迟
    • 在没有看门狗的情况下,某些服务可能会在关机期间无限期挂起,从而导致长时间的延迟。
    • 通过正确配置的看门狗,systemd 会在定义的超时时间内强制重置,从而确保更快的关机。
  • 避免关键服务冻结
    • 如果关键系统服务(例如,网络、文件系统、ACPI)变得无响应,看门狗会检测到这一点并触发立即重启。
    • 这可以防止由原本会无限期停顿的服务引起的启动速度减慢
  • 优化内核恢复
    • 如果内核在超过 RuntimeWatchdogSec 阈值后停止响应,看门狗会自动触发重启,避免系统死锁。
    • 这有助于防止随机启动冻结并保持系统稳定性。
  • 增强资源管理
    • 如果资源密集型进程导致系统停顿,看门狗将在系统完全无响应之前强制重启。
    • 这可以通过保持系统响应能力来帮助在高 CPU/RAM 使用率场景中维持性能

在 systemd 中配置看门狗

默认情况下,RuntimeWatchdogSec 是禁用的。要启用系统看门狗,请使用以下内容创建一个 systemd-system.conf(5) drop-in 文件

/etc/systemd/system.conf.d/watchdog.conf
[Manager]
RuntimeWatchdogSec=10s
RebootWatchdogSec=45s
  • RuntimeWatchdogSec=10s:如果 systemd 无响应超过 10 秒,系统将重启。
  • RebootWatchdogSec=45s:如果系统在重启期间挂起,看门狗将在 45 秒后强制重置。

应用更改,使用

# systemctl daemon-reexec

验证看门狗是否处于活动状态

$ systemctl show | grep Watchdog
RuntimeWatchdogUSec=10000000
RebootWatchdogUSec=45000000

检查硬件看门狗支持

在许多系统上,硬件看门狗支持可能由不同的内核模块提供(例如,某些 Intel 芯片组上的 iTCO_wdt,某些 AMD 平台上的 sp5100_tco)。要检查硬件看门狗模块,请运行

$ lsmod | grep wdt

如果您找到相关的看门狗模块(例如,iTCO_wdt, sp5100_tco),请确保通过创建如下文件在启动时加载

/etc/modules-load.d/watchdog.conf
module_name
# modprobe module_name

module_name 替换为您的硬件的实际模块名称。

参考

另请参阅