跳转至内容

提升性能

来自 ArchWiki
(重定向自 Performance)

本文档提供有关性能的基本系统诊断信息,以及为减少资源消耗或优化系统而可能采取的步骤,最终目标是实现系统性能的可感知或可记录的提升。另请参阅 Gaming#Improving performance 以获取更多针对游戏和低延迟的特定建议。

基础知识

了解您的系统

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

  • 如果计算机在同时运行大型应用程序(如 LibreOffice 和 Firefox)时变得缓慢,请检查 RAM 容量是否充足。使用以下命令,并查看“可用”列
    $ 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)与系统(/)分开来实现。

注意 和此页面上的所有建议一样,请衡量所带来的好处:除非对硬盘驱动器进行 短冲程(short stroking)并仅使用其总容量的一小部分,否则在一般使用中,分区分离只会提高访问时间百分之几,因为读/写操作仍然会分布在整个驱动器上。相比之下,升级到 SSD 会将性能提高一个数量级以上。

选择和调整您的文件系统

为特定系统选择最佳文件系统非常重要,因为每个文件系统都有其自身的优点。《文件系统》文章提供了最流行文件系统的简要概述。您也可以在 文件系统类别中找到相关文章。

挂载选项

各种 *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 调度器,称为 电梯(elevator)

电梯算法的一个问题是它不适合进行顺序访问的进程:读取一块数据,处理几微秒,然后读取下一块数据,依此类推。电梯调度器不知道进程即将读取附近的另一块数据,因此会切换到处理另一个进程在其他位置的请求。预测(anticipatory) I/O 调度器解决了这个问题:它会暂停几毫秒,以预测附近的另一读取操作,然后再处理另一个请求。

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

完全公平队列(CFQ)以不同的方式处理问题,它根据提交进程的优先级分配时间片和每个队列允许的请求数。它支持 cgroup,允许为特定进程集合保留一定的 I/O 量。这对于共享和云托管特别有用:为某些 IOPS 付费的用户希望在需要时获得他们的份额。此外,它会在同步 I/O 结束时空闲等待其他附近的 I/O 操作,从而从 anticipatory 调度器继承了此功能并带来了一些增强。anticipatoryelevator 调度器都已从 Linux 内核中弃用,取而代之的是下面介绍的更高级的替代方案。

预算公平队列(BFQ)基于 CFQ 代码并带来了一些增强。它不为每个进程分配固定的时间片来授予磁盘访问权限,而是分配一个以扇区数为单位的“预算”,并使用启发式方法。它是一个相对复杂的调度器,可能更适合旋转驱动器和慢速 SSD,因为其较高的每个操作开销,尤其是与慢速 CPU 关联时,可能会减慢快速设备的运行速度。BFQ 在个人系统上的目标是,对于交互式任务,存储设备就像空闲时一样响应迅速。在其默认配置中,它侧重于提供最低延迟而不是实现最大吞吐量,这有时可以大大 加速硬盘上的应用程序启动

Kyber 是一个受网络路由中使用的活动队列管理技术启发的最新调度器。其实现基于“令牌”,作为限制请求的机制。分配请求需要一个队列令牌,用于防止请求饿死。还需要一个调度令牌,它限制特定优先级在给定设备上的操作。最后,定义了目标读取延迟,调度器会自我调整以达到此延迟目标。该算法的实现相对简单,对于快速设备被认为效率很高。

内核的 I/O 调度器

虽然一些早期算法已被弃用,但官方 Linux 内核支持多种 I/O 调度器。多队列块 I/O 排队机制(blk-mq)将 I/O 查询映射到多个队列,任务分布在线程和 CPU 核心之间。在此框架内,以下调度器可用

  • None,不应用任何排队算法。
  • mq-deadline,截止日期调度器(见下文)的多线程适配。
  • Kyber
  • BFQ

更改 I/O 调度器

注意 最佳调度器选择取决于设备和工作负载的确切性质。此外,吞吐量(MB/s)不是性能的唯一衡量标准:截止日期或公平性会降低整体吞吐量,但可能提高系统响应能力。基准测试可能有助于指示每个 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 允许通过 Disks 应用程序设置其中一些参数,并且不需要 udev 规则。
注意 某些功能可能不受您的硬盘驱动器支持。如果发生这种情况,Hdparm 将通知您。因此,只需忽略该特定功能的配置。

减少磁盘读写

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

注意 一个具有一般 10 倍写入放大系数、标准 10000 次擦写周期和每天写入 10GB 数据的 32GB SSD,其寿命可达 8 年。使用 更大的 SSD 和具有较低写入放大系数的现代控制器可以延长寿命。在考虑是否需要任何限制磁盘写入的特定策略时,还可以参考 此耐久性实验

显示磁盘写入

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

将文件移至 tmpfs

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

文件系统

如果性能有所提高,请参阅相应 文件系统页面,请参阅 #Choosing and tuning your filesystem 中的列表。

交换空间

有关详细信息,请参阅 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 调度器 BFQ 来实现,该调度器允许为进程设置不同的优先级。

可以通过以下方式启动后台进程来将其 I/O 优先级降低到“Idle”级别

$ ionice -c 3 command

有关更多信息,请参阅 ionice 的简要介绍ionice(1)

TRIM

为了获得最佳性能,应定期丢弃(也称为 TRIM)固态驱动器的空块,以优化随机写入速度。有关更多信息,请参阅 Solid state drive#TRIM

网络

一般信息

监管域

本文档或节有望与 Network configuration/Wireless#Respecting the regulatory domain 合并。

注意:我们已经在目标页面上有一个关于此的良好章节,将大部分内容移至那里可能是有益的,而只留下一个存根,并重点关注当内核参数应用不正确时进行覆盖。 (请在 Talk:Improving performance 中讨论)

不同国家/地区对无线网络服务有不同的标准,通过设置正确的网络配置域,您通常可以获得更强的信号。这通常在设置过程中配置,但在某些情况下 设置可能未正确应用。检查 /sys/module/cfg80211/parameters/ieee80211_regdom 的内容;如果值为 00(通常更严格的全局设置)或设置为不正确的区域,请尝试添加以下 内核参数,将 XX 替换为正确的国家/地区代码(例如,美国为 US

cfg80211.ieee80211_regdom=XX

然后重启您的系统。

电源 management

某些设备存在问题,导致其网络适配器在使用中时错误地进入省电模式,从而降低性能或导致连接中断。如果发生这种情况,请确保您 升级 您的软件包到最新版本以获取任何必要的固件更新,并参阅 Power management#Network interfaces

CPU

超频

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

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

频率缩放

请参阅 CPU 频率缩放

CPU 调度器

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

本文章或章节需要扩充。

原因:将 CFS,即之前的默认调度器,添加到列表中。(请在 Talk:Improving performance 中讨论)
  • 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
  • SCX — 允许动态注入各种 CPU 调度器,而无需系统重置。
https://github.com/sched-ext/scx || scx-scheds

实时内核

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

调整进程优先级

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

Ananicy

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

警告 GameModeAnanicy CPP 都会调整进程的 nice 值。但是,不建议组合使用这两个工具。[1]

cgroups

请参阅 cgroups

LimitCPU

LimitCPU 是一个程序,用于限制特定进程的 CPU 使用率百分比。安装 limitcpuAUR 后,您可以使用 0 到 CPU 核心数量乘以 100 的比例来限制进程 PID 的 CPU 使用率。例如,对于八个 CPU 核心,百分比范围将是 0 到 800。用法

$ limitcpu -l 50 -p 5081

irqbalance

irqbalance 的目的是在多处理器系统上将硬件中断分布到各个处理器,以提高性能。它可以通过提供的 irqbalance.service 控制

警告 在某些情况下,irqbalance 可能会干扰电源管理,并导致视频游戏卡顿或帧率下降 [2]

关闭 CPU 漏洞缓解措施

警告 在未考虑其引入的漏洞的情况下,请勿应用此设置。除其他外,如果启用了此选项,您不得依赖虚拟机来隔离不受信任的程序。有关更多信息,请参阅 此处此处

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

mitigations=off

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

注意 使用第 10 代及更新的 Intel CPU,或 AMD Ryzen 1000 系列及更新的 CPU 时,禁用缓解措施带来的性能提升仅为 5%,而前几代 CPU 可达 25%。请参阅 2021 年初的总体评测Rocket Lake 测试Alder Lake 测试

针对您的 CPU 进行编译优化

根据您的 CPU,您可以通过使用针对您的原生 CPU 微架构编译的软件并加上 -march=native 标志来获得轻微的性能提升,但使用此标志编译的任何二进制文件在其他 CPU 微架构上都会很慢或损坏。如果您使用此选项并希望更换或升级 CPU,您需要重新编译二进制文件,或者选择一个使用与旧 CPU 相同微架构的新 CPU。您可以 默认为此选项应用 makepkg

如果您 编译自己的内核,您也可以在内核编译期间使用 CONFIG_X86_NATIVE_CPU 选项启用此选项。然而,内核的改进会较小,因为内核 禁止 在通用代码中使用扩展向量指令,这些指令是普通二进制文件大部分性能提升的原因,因此大部分性能提升将来自于 小得多的微优化

图形

Xorg配置

图形性能可能取决于 xorg.conf(5) 中的设置;请参阅 NVIDIAAMDGPUIntel 文章。不正确的设置可能会导致 Xorg 无法工作,因此请谨慎操作。

Mesa 配置

Mesa 驱动程序的性能可以通过 drirc 进行配置。adriconf (Advanced DRI Configurator) 是一个 GUI 工具,通过设置选项并将其写入标准的 drirc 文件来配置 Mesa 驱动程序。

硬件视频加速

硬件视频加速 使显卡能够解码/编码视频。

超频

与 CPU 类似,超频可以直接提高性能,但通常不建议这样做。有几个软件包,例如 rovclockAUR (ATI 显卡)、rocm-smi-lib (近期 AMD 显卡)、nvclockAUR (旧 NVIDIA - 最高 GeForce 9) 和 nvidia-utils (近期 NVIDIA 显卡)。

请参阅 AMDGPU#OverclockingNVIDIA/Tips and tricks#Enabling overclocking in nvidia-settings

启用 PCIe 可调整大小的 BAR

  • 在某些系统上,启用 PCIe 可调整大小的 BAR 可能会导致性能显著下降。请对您的系统进行基准测试,以确保它提高了性能。请注意,在较新的 Intel Arc 独立 GPU 上,resizable BAR 得到了 Intel 的官方推荐,并且几乎总是会提高性能。
  • 为此生效,必须禁用 兼容性支持模块 (CSM)

PCI 规范允许使用更大的 基址寄存器 (BAR) 来将 PCI 设备内存暴露给 PCI 控制器。这可以提高显卡的性能。能够访问全部视频内存可以提高性能,同时也能实现图形驱动程序的优化。resizable BAR、4GB 以上解码以及这些驱动程序优化的组合是 AMD 称之为 AMD Smart Access Memory 的技术,最初在 AMD 500 系列芯片组主板上可用,后来扩展到 AMD 400 系列以及 Intel 300 系列及更高版本,通过 UEFI 更新实现。此设置可能并非在所有主板上都可用,并且已知有时会在某些主板上导致启动问题。

如果 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 供应商都不支持的值是超频,并且存在类似的风险和缺点,请参阅 #Overclocking

RAM 上的根覆盖

本文或本章节已过时。

原因: liveroot 脚本似乎未维护,但此方法仍应有效。(请在 Talk:Improving performance#Section_5.2: liveroot has not been updated since 2016 中讨论)

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

zram 或 zswap 上的交换空间

使用 zswapzram 上的交换空间 可以实现类似的好处(以类似的成本)。两者在目的上通常相似,但操作上不同。

  • zswap 作为压缩的 RAM 缓存运行,既不需要(也不允许)广泛的用户空间配置。它与交换设备协同工作,充当其缓存。通常会进入交换空间的页面可以进入 zswap。
  • zram 是一个内核模块,可用于在 RAM 中创建压缩块设备。此压缩块设备可用作交换设备,无需其他交换设备进行备份。它提供了许多选项,包括使用备份设备来保存冷页面。

由于这两个选项都涉及 交换空间 子系统,影响交换空间的配置也会影响这些系统。例如,swappiness 决定了在内存压力高时内核应该优先删除文件缓存还是将页面移至交换空间。由于 zswap 拦截将页面移至交换空间的操作,而 zram 作为交换空间,因此该选项也将决定这两个机制的使用频率。

使用显卡的 RAM

在您拥有极少 RAM 和大量显存的极少数情况下,可以将后者用作交换空间。请参阅 Swap on video RAM

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

本文章或章节需要扩充。

原因: 应提及 systemd.service(5) 看门狗设置并进行交叉链接,另请参阅 Systemd#Notifying about failed services)。(请在 Talk:Improving performance 中讨论)

在传统的 GNU/Linux 系统上,尤其是在图形工作站上,当分配的内存过量使用时,整体系统的响应能力可能会退化到几乎无法使用的状态,然后才会触发内核中的内存不足 (OOM)-killer 或释放足够的内存(当系统无响应时不太可能快速发生,因为您几乎无法关闭任何占用大量内存的应用程序,这些应用程序可能会继续分配更多内存)。行为也取决于具体的设置和条件,恢复到正常的响应状态可能需要几秒钟到半个多小时不等,在会议演示等严重情况下等待可能很痛苦。

虽然内核以及用户空间在低内存条件下的行为在 内核Fedora 邮件列表中有讨论,但用户可以使用比硬重置系统或调整 vm.overcommit_* sysctl 参数更可行和有效的选项。

  • 使用 Magic SysRq key 手动触发内核 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/systemdsystemd-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
  • bustd — 非常轻量级的用户空间 OOM-killer,适用于较慢的机器。基于 PSI,需要 Linux 4.2+。
https://github.com/vrmiguel/bustd || bustdAUR

参见