性能优化

来自 Arch Linux 中文维基
(重定向自Improving performance

本文将介绍与性能有关的系统诊断知识和具体步骤,通过减少资源消耗等方式优化系统性能。游戏相关的特别优化请参阅 游戏#性能优化

基础[编辑 | 编辑源代码]

了解你的系统[编辑 | 编辑源代码]

性能优化的最佳方法是找到瓶颈或拖慢整体速度的子系统。查看系统细节可以帮助确定问题。

  • 如果在同时运行多个大型程序时卡顿(如 LibreOffice、Firefox 等),请检查内存容量是否充足。使用以下命令,并检查“available”一列的数值:
    $ free -h
  • 如果电脑开机很慢,并且(仅在)第一次打开应用时加载很慢,可能是因为硬盘速度过慢。可以用hdparm命令测试硬盘速度:
    # hdparm -t /dev/sdX
注意: hdparm 只代表了硬盘的读取速度,并没有进行有效的评分。空闲时读取速度只要高于 40MB/s 就可以满足大多数系统。
  • 如果内存足够而 CPU 占用率居高不下,可以尝试停止进程或禁用 守护服务。有多种方法可以监测 CPU 负荷,例如 htoppstree 或其他 系统监视器
    $ htop
  • 如果使用直接渲染(GPU 渲染)的应用运行卡顿(比如使用 GPU 的视频播放器、游戏甚至窗口管理器),改善 GPU 的性能应当有所帮助。首先需要检查直接渲染是否已经开启。可以使用 mesa-utils 中的 glxinfo 命令:
    $ glxinfo | grep "direct rendering"
    ,如果开启了,则会返回direct rendering: Yes
  • 使用 桌面环境时,禁用桌面特效或许可以减少 GPU 使用。如果当前的桌面环境不符合硬件或个人需求,可以使用一个更轻量的桌面环境或 自己打造桌面环境
  • 使用专门优化过的 内核 可以提高性能,比如可以选择 linux-zen,本文中的一些配置也可以优化默认内核的性能。

基准测试[编辑 | 编辑源代码]

为定量评估优化成果,可使用基准测试

存储设备[编辑 | 编辑源代码]

多硬件路径[编辑 | 编辑源代码]

内部硬件路径意指储存设备是如何连接到主板的。例如 TCP/IP 经由 NIC、即插即用设备可以使用 PCIe/PCI、火线、RAID 卡 、USB 等。通过将储存设备均分到这些接口可以最大化主板的性能,比如将六个硬盘接连到 USB 要比三个连接到 USB、三个连接到火线要慢。原因是主板上的接口点类似管道,而管道同一时间的最大流量是有上限的。幸运的是主板通常会有多个管道。

此外,假设电脑前面有两个 USB 插口,后面有四个 USB 插口,那么前面插两个、后面插两个应当要比前面插一个、后面插三个更快。这是因为前面的插口可能是多个根 Hub 设备,也就是说它可以在同一时间发送更多的数据。

使用下面的命令查看机器上是否有多个路径:

USB设备树
$ lsusb -tv
PCI设备树
$ lspci -tv

分区[编辑 | 编辑源代码]

确保您已经对齐分区

多硬盘[编辑 | 编辑源代码]

如果有多个硬盘,将其设置为软件 RAID 可以提升速度。

在分离的硬盘上创建 交换空间 也有所帮助,尤其是使用交换空间十分频繁时。

选择并调整文件系统[编辑 | 编辑源代码]

为系统选择合适的文件系统十分重要,因为不同文件系统有各自的优势。文件系统 文中对主流文件系统作了简短的总结,也可以在 分类:文件系统 中阅读其他相关文章。

挂载选项[编辑 | 编辑源代码]

一些*atime 选项可以降低strictatime造成的性能损失。其他选项和文件系统相关,请参考所使用文件系统的相关段落。

更改内核选项[编辑 | 编辑源代码]

有些选项会影响块设备的性能,更多信息请参考 sysctl#虚拟内存

I/O 调度[编辑 | 编辑源代码]

背景信息[编辑 | 编辑源代码]

I/O调度器是用于决定块I/O操作提交到存储设备顺序的一个内核组件,这里有必要简单的说一下两种主要驱动器的规格,因为I/O调度器的目标是优化这些不同驱动器的处理请求的方式:

  • 机械硬盘(HDD)的工作原理是旋转磁盘以物理方式将扇区靠近磁头,基于这个原因,机械硬盘的随机读取延迟相当的高,一般在3到12毫秒。而顺序访问则可提供更高的吞吐量,典型的机械硬盘的I/O操作吞吐量约为每秒200次即200IOPS
  • 固态硬盘(SSD)没有机械硬盘那样的移动部件,因此它的随机访问速度和顺序访问速度是一样快的,通常不到0.1毫秒,并且可以处理多个并发的请求。典型的固态硬盘的I/O吞吐量超过了10,000IOPS,远超出了常见工作负载下所需的吞吐量

当多个进程向不同的存储部件发出了I/O请求,每秒就会产生数千的I/O请求,而一般的机械硬盘每秒只能处理大约200个I/O请求,这就是I/O调度发挥其作用的时候。

调度算法[编辑 | 编辑源代码]

提高吞读量的一种方法是将访问队列进行物理上的线性化,即通过对等待请求按照逻辑地址进行排序,并且将地址上最近的一些请求组合在一起,举个例子,当三个程序发出请求,分别为1,2,3,其中1号要操作的位置在磁盘中间,而2号操作的位置在磁盘头部,3号操作的位置位于磁盘尾部,出于提高吞读的需求,我们会希望磁头能够转完一圈的时候将这三个I/O操作全部完成,也就是按照2,1,3的顺序来执行I/O操作,这很像现实生活中的电梯,因此,这个调度算法也被称为电梯调度算法(elevator)。

但是电梯调度算法存在着一个问题,它并不适用于一个正在进行顺序读写的进程,常见的情况是:一个进程读取了一块数据并且就要读取下一块,上一个操作完成到下一个操作发起的时间相对于已经转到物理位置时进行读写所需时间来讲是很长的(进行操作仅需几微秒,而上一个操作完成到下一个往往需要几十微秒,这个调度算法推出的时候5400转的机械硬盘依旧是主流,而5400转的硬盘转一圈需要11.11毫秒)。 这个例子暴露出了电梯调度算法并不知道进程即将读取下一块数据. 预测调度算法(anticipatory I/O scheduler)解决了这个问题:它在处理另一个请求之前,先暂停几毫秒(并不是停下磁碟),等待另一个与上个操作在物理位置上相近的操作。

以上两个调度算法都是试图提高总吞吐量的算法, 但他们忽视了I/O调度中的另一个问题,就是请求的延迟问题. 举个例子:当大多数进程在磁碟头发起请求,而少量的进程在磁碟另外一端,需要转一圈才可以访问(反转是不现实的,将一片正在高速旋转的磁碟突然停下然后反转这对磁碟的强度提出了极高的需求),这时,预测算法就会在一系列对于磁碟头的操作的请求中,等待数多个“几毫秒”,而这时磁盘尾端操作的请求早已等候许久,甚至可能已经因为I/O操作无法完成而无法进行下一步操作。我们将这样的情况称之为饥饿. 为了增加I/O操作的公平性 ,截止日期算法( deadline algorithm)应运而生 。它也有一个按照地址排序的队列,与电梯算法类似, 当一个进程在队列中等待了太久它们就会被移入到一个名为 "expired"(意指到期) 的队列中按照谁到期时间更久谁越靠前进行排序。调度器会检查这个队列,并从中处理请求,处理完成后,才会回到电梯队列中。这种调度方式牺牲了整体吞吐量以此交换了操作延迟,这也是I/O调度算法所需解决的问题,即吞吐量与延迟的平衡。

完全公平队列算法( Completely Fair Queuing (CFQ) )试图从不同的角度来平衡吞吐量与延迟,它将时间划分成时间片,然后根据进程优先级来划分配这个时间片与允许的请求数。 它支持 cgroup 以此允许为特定的进程保留一些时间片和请求数。 这在云存储中特别适用: 一些云存储服务的付费用户总是期望可以得到更多的IOPS。 此外它也会在同步I/O结束的时候闲置下来,等待其他附近位置的操作, 以此,它取代了预测调度算法(anticipatory scheduler)并且带来了一些增强的功能. 预测调度算法(anticipatory scheduler)和电梯调度算法(elevator schedulers)都在现在的 Linux 内核中被下面更为先进的算法所替代。

预算公平算法( Budget Fair Queuing (BFQ) )是一种基于 CFQ 代码增加一些功能改进而来。它并不为磁盘分配固定的时间片,而是根据使用启发式的算法为进程分配“预算”(Budget). 它相对与其他算法来说比较复杂, 这种算法也许更适合本来吞吐量就偏低的机械硬盘和低速SSD,它每次操作的开销都更高,特别是当CPU速度较慢时,这个调度算法甚至可能降低设备的响应速度. 它在个人系统上的目标是优化交互式任务的体验, 此时的存储设备与空闲的时候响应性能相当。它默认的配置被用来提供最低延迟,而不是最大吞吐量

Kyber 是一种新推出的调度器。受到网络路由器的主动队列管理结束启发,使用“token”用作限制请求的一种调度机制。这个机制有两个“令牌”(token)一个称为队列令牌(queuing token),用来防止请求进入“饥饿”状态,另一个称为“调度令牌”(dispatch token),被用作限制在指定设备上操作的优先级。 最后再定义一个目标读取延迟,并调整调度器来达到这个目标。 这个算法的实现相对简单,并且被认为是用于高速的设备(例如固态硬盘)。

内核的 I/O 调度器[编辑 | 编辑源代码]

除去一些早期调度算法已经被移除, 官方的Linux kernel支持多种调度器,主要分为一下两类:

  • 内核默认支持多队列调度器(multi-queue schedulers. 多队列块I/O排队机制( Multi-Queue Block I/O Queuing Mechanism (blk-mq) )将I/O查询映射到多个队列, 任务分布于多个线程之间,同样也分布在多个CPU核心之间。 以下几种调度器在这个框架中可用:
    • None, 不应用任何调度算法.
    • mq-deadline, deadline(截止日期调度算法)的多线程版本。
    • Kyber
    • BFQ
  • 单队列调度器 (single-queue schedulers) 是旧版本所拥有的调度器:
    • NOOP 是最简单的调度器,它将所有的I/O请求放入一个先进先出队列(FIFO)并以此实现请求合并。 在这个算法中,请求的位置的扇区号不会被用于排序。 因此,如果在另一层(例如设备级), 或者无论怎样的调度算法都不会带来性能问题( 例如SSD),那么就可以使用这个算法。
    • Deadline
    • CFQ
注意: 单队列调度器(single-queue schedulers)自从Linux 5.0起被移除.

更改 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 使用的调度器更改为 bfq

# echo bfq > /sys/block/sda/queue/scheduler

不论硬盘为何种类型,更改 I/O 调度器的操作都可以被自动化并持久化。例如,下列展示的 udev 规则将 NVMe 硬盘的调度器设为 none,SSD/eMMC 硬盘设为 bfq,机械硬盘设为 bfq

/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调度器都有自己的tunables,如延迟时间、过期时间和FIFO参数。tunables有助于根据特定的设备和工作负载来调整算法。通常情况下,这是为了实现更高的吞吐量或更低的延迟。tunables及相关描述可以在内核文档中找到。

要查看设备(例如sdb)可用的tunables,执行:

$ ls /sys/block/sdb/queue/iosched
fifo_batch  front_merges  read_expire  write_expire  writes_starved

上例中sdb使用deadline调度算法。

要牺牲延迟而改善deadline算法的吞吐量,可用以下命令提高fifo_batch的值:

# echo 32 > /sys/block/sdb/queue/iosched/fifo_batch

电源管理配置与写入缓存[编辑 | 编辑源代码]

使用机械硬盘(HDD)时你可能会想要降低或是完全关闭省电功能,并确认写入缓存是否已经启用。

可以参考 电源管理配置Hdparm#写入缓存

完成后,你可以配置 udev 规则 以使更改在启动时应用。

提示:GNOME 允许你在磁盘应用中配置部分这些参数,不需要编辑 udev 规则。
注意: 你的硬盘可能不支持部分功能。这种情况下,Hdparm 会向你发出提醒。你可以直接忽视掉这些不支持的配置选项。

减少磁盘读写[编辑 | 编辑源代码]

避免对慢速存储设备的不必要访问不仅可以提升性能,还能延长设备寿命(不过,在现代硬件上往往可以忽略这些操作对设备寿命的影响)。

注意: 一个具有10倍写入放大因子、10000 write/erase cycle的普通32GB SSD,若每天写入10GB数据,仍有8年的预期寿命。对于具有更新的主控,因而写入放大更少的SSD和容量更大的SSD,预期寿命将更长。此外,在考虑是否需要限制磁盘写入量前,参见该实验

显示磁盘写信息[编辑 | 编辑源代码]

iotop可以显示程序写入磁盘的频率,并可将进程按写入量排序。详见iotop(8)

重定位文件到 tmpfs[编辑 | 编辑源代码]

可将某些文件(如浏览器profile)重定位到一个tmpfs上。这将让文件存储在内存中,在降低磁盘写入量的同时提升应用响应速度。

在tmpfs与磁盘间同步浏览器profile,参见Profile-sync-daemon。有些浏览器可能需要额外操作(如Firefox on RAM)。

同步任何指定的文件夹,见Anything-sync-daemon

在tmpfs中编译程序以减少编译用时,见Makepkg#减少编译时间

文件系统[编辑 | 编辑源代码]

可参阅特定文件系统的维基页面,检查是否有适用的性能优化指南。如:Ext4#提升性能XFS#性能

交换空间[编辑 | 编辑源代码]

Swap#性能优化

Writeback interval 和缓冲区大小[编辑 | 编辑源代码]

详见 Sysctl#虚拟内存

关闭Core dump[编辑 | 编辑源代码]

详见Core dump#Disabling automatic core dumps

使用 ionice 调度储存 I/O[编辑 | 编辑源代码]

许多后台任务(如备份),并不需要低I/O延迟或高I/O带宽。而对于桌面系统,要获得流畅的UI响应,前台进程的I/O就必须足够快。因此,若在其它任务需要时减少后台任务的存储带宽资源,将对提升性能大有裨益。Linux的CFQ I/O调度器支持为不同的进程设定不同的优先级,可以使用CFQ调度器达成这一点。

后台进程的I/O优先级可被降低到"Idle":

# ionice -c 3 command

详见:一个ionice的简短介绍ionice(1)

CPU[编辑 | 编辑源代码]

超频[编辑 | 编辑源代码]

超频通过提升 CPU 的时钟频率提升电脑性能,超频能力取决于 CPU 和主板的型号。通常使用 BIOS 进行超频。超频也会带来风险和不便,这里既不推荐超频也不反对超频。

很多 Intel 芯片不会在 acpi_cpufreq 或其他软件中报告真正的时钟频率,这会导致过多的 dmesg 消息。通过卸载并将 acpi_cpufreq 模块加入黑名单可以避免此问题。使用 i7z 中的 i7z 可以读取真实的时钟速度。对于正确的 CPU 超频方式而言,推荐使用 压力测试

自动调整频率[编辑 | 编辑源代码]

CPU 调频

调整默认CPU调度器(CFS)[编辑 | 编辑源代码]

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

这篇文章的某些内容需要扩充。

原因: Add CFS, the previous default scheduler, to the list. (在 [[1]] 中讨论)

其他CPU调度器[编辑 | 编辑源代码]

  • MuQSS — Multiple Queue Skiplist Scheduler. Available with the -ck patch set developed by Con Kolivas.
Unofficial user repositories/Repo-ck || linux-ckAUR
  • PDS — Priority and Deadline based Skiplist multiple queue scheduler focused on desktop responsiveness.
https://cchalpha.blogspot.com/ || linux-pdsAUR
  • BMQ — The BMQ "BitMap Queue" scheduler was created based on existing PDS development experience and inspired by the scheduler found in Zircon by Google, the kernel on which their Fuchsia OS initiative runs. Available with a set of patches from CachyOS.
https://cchalpha.blogspot.com/ || linux-cachyos-bmqAUR
  • Project C — Cross-project for refactoring BMQ into Project C, with re-creation of PDS based on the Project C code base. So it is a merge of the two projects, with a subsequent update of the PDS as Project C. Recommended as a more recent development.
https://cchalpha.blogspot.com/ || linux-prjcAUR
  • TT — The goal of the Task Type (TT) scheduler is to detect tasks types based on their behaviours and control the schedulling based on their types.
https://github.com/hamadmarri/TT-CPU-Scheduler || linux-ttAUR
  • BORE — The BORE scheduler focuses on sacrificing some fairness for lower latency in scheduling interactive tasks, it is built on top of CFS and is only adjusted for vruntime code updates, so the overall changes are quite small compared to other unofficial CPU schedulers.
https://github.com/firelzrd/bore-scheduler || linux-cachyos-boreAUR

实时内核[编辑 | 编辑源代码]

有些应用(如在全高清(1080p)分辨率下运行电视卡)可能在实时内核下表现更好。

调整进程优先级[编辑 | 编辑源代码]

nice(1)renice(1)

Ananicy[编辑 | 编辑源代码]

Ananicy是一个用于自动调节可执行程序nice值的守护进程。nice值表示了在为特定可执行程序分配CPU资源时的优先级。Ananicy在AUR中可用:ananicy-gitAUR

cgroups[编辑 | 编辑源代码]

cgroups

Cpulimit[编辑 | 编辑源代码]

Cpulimit是一个用于限制特定进程使用CPU资源多少的程序。安装cpulimitAUR后,可以通过一个进程的PID来限制其CPU利用“百分比”。CPU利用“百分比”可取0到(总CPU核心数*100)间的任意值。例如,一个8核CPU的CPU利用“百分比”可取0到800间的值。

例如,要限制PID为5081的进程的CPU利用“百分比”为50,执行:

$ cpulimit -l 50 -p 5081

irqbalance[编辑 | 编辑源代码]

irqbalance通过在多处理器系统上将硬件中断分散到每个处理器上以提升性能。可通过irqbalance.service服务控制irqbalance的运行。

关闭CPU漏洞缓解措施[编辑 | 编辑源代码]

警告: 不要在充分考虑导致的漏洞前应用这些设置。更多信息见:[2][3]

关闭CPU漏洞缓解措施可能提升性能。 要完全关闭CPU漏洞缓解措施,使用如下内核参数:

mitigations=off

该内核参数改变的所有设置的详细解释可在kernel.org|这里找到。 可以使用spectre-meltdown-checkerAUR 或者 util-linux 提供的 lscpu(1) 进行漏洞检测

注意: 当使用10代之后的Intel CPU或Ryzen 1000系列之后的AMD CPU时, 关闭CPU漏洞缓解措施带来的性能提升小于5%(而不是之前产品的多达25%)。详见the general review from early 2021the test on Rocket Lakethe test on Alder Lake

显卡[编辑 | 编辑源代码]

Xorg 配置[编辑 | 编辑源代码]

显卡性能由/etc/X11/xorg.conf的配置决定,见 NVIDIAAMDGPUIntel 文章。配置不当可能导致 Xorg 停止工作,请慎重操作。

Mesa 配置[编辑 | 编辑源代码]

Mesa驱动的性能可通过drirc配置。此外,也可通过GUI工具进行配置:

  • adriconf (Advanced DRI Configurator) — 通过GUI进行配置并向标准drirc文件写入配置项的工具。
https://gitlab.freedesktop.org/mesa/adriconf/ || adriconf
  • DRIconf — 用于Direct Rendering Infrastructure的配置小程序。支持在应用/屏幕/设备层面上调整OpenGL的性能和视觉效果设置。
https://dri.freedesktop.org/wiki/DriConf/ || driconfAUR

硬件视频加速[编辑 | 编辑源代码]

硬件视频加速可利用显卡解码/编码视频。

超频[编辑 | 编辑源代码]

与 CPU 一样,超频可以直接提高性能,但通常不建议使用。AUR中的超频工具有rovclockAUR (ATI 显卡)、rocm-smi-lib (较新的 AMD 显卡) 、nvclockAUR (到 Geforce 9系的旧 NVIDIA 显卡),以及适用于新 NVIDIA 显卡的nvidia-utils

AMDGPU#OverclockingNVIDIA/Tips and tricks#Enabling overclocking

启用 PCI Resizable BAR[编辑 | 编辑源代码]

注意:
  • 在某些系统上启用 PCI Resizable BAR 会造成性能严重下降。配置完成后务必对系统进行测试以确保性能获得了提升。
  • 启用前 Compatibility Support Module (CSM) 必须关闭。

PCI 标准允许使用更大的 基地址寄存器(BAR) 以向 PCI 控制器暴露 PCI 设备的内存。这一操作可以提高显卡的性能。允许访问显卡的所有显存可以提高性能,同时也允许显卡驱动对其进行针对性的优化。AMD将 resizable BAR、above 4G decoding 和显示驱动一系列针对性的优化统称为 AMD 显存智取技术,最初出现在搭载 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

内存、虚拟内存与内存溢出处理[编辑 | 编辑源代码]

频率和时序[编辑 | 编辑源代码]

内存可在不同的频率和时序上运行,可通过BIOS进行设置。两者都会影响内存性能。选择BIOS中系列预设值中最高的一个通常会带来相比默认值的性能提升。将内存频率提高到不被主板和内存厂商支持的数值被称作超频,由此带来的风险与不便和#超频中的相似。

在RAM overlay上配置根文件系统[编辑 | 编辑源代码]

如果系统在写入速率较慢的设备(如USB、机械硬盘)上运行且对根文件系统的写入量较小,可在真实的根文件系统上挂载一层RAM overlay。这将保持 真实的根文件系统为只读状态,所有的写入操作都在RAM中进行。由此可带来显著的性能提升,但根文件系统的写入量将受到限制。

zram 或 zswap[编辑 | 编辑源代码]

#在RAM overlay上配置根文件系统相似的好处(当然也有相似的不便)也可通过zswapzram达成。两者的目的相同但实现方法不同:zswap依靠一块压缩的内存缓存来工作,不需要(也不允许)过多的用户空间配置;而zram内核模块可用于在内存中创建一个压缩的块设备。zswap需与swap设备配合工作,而zram则不需要。

使用显存[编辑 | 编辑源代码]

在很少见的情况下,内存很小而显存过剩,那么可以将显存设为交换文件。见 Swap on video RAM.

在低内存情况下改善系统反应速度[编辑 | 编辑源代码]

在传统的GNU/Linux系统,尤其是图形工作站上,当内存被过量分配(overcommitted)时,系统反应速度可能会在触发内核的OOM-killer前迅速降低到无法使用的程度,除非足量的内存得到释放。具体的过程会因特定的设置和系统所处的情况不同,导致系统回到正常状态的时间从数秒到超过半个小时不等。

在低内存状态下,内核的表现及用户空间程序的情况可能在未来得到改善(详见内核Fedora的邮件列表)。此外,相比硬重启和调整vm.overcommit_* sysctl参数,用户还可以使用更可行和有效的选择:

  • 使用Magic SysRq keyAlt+SysRq+f)手动触发内核OOM-killer。
  • 使用用户空间的OOM守护进程来自动或交互性地处理低内存问题。
警告: 触发OOM killer将强行停止某些正在运行的应用,可能导致未保存的工作丢失。是耐心等待并希望应用程序最终会释放掉占用的内存,还是迅速使系统脱离未响应状态取决于用户自身。

相比SysRq,OOM守护进程可能更受到欢迎,因为不能手动设定内核的OOM-killer结束相关进程的优先级。

以下是一些OOM守护进程:

  • systemd-oomdsystemd-oomd.servicesystemd提供,可使用cgroups-v2及PSI(pressure stall information)监控进程并在内核OOM发生前采取行动。
https://github.com/systemd/systemd, systemd-oomd(8) || systemd
  • earlyoom — 用C语言实现的简单的用户空间OOM-killer。
https://github.com/rfjakob/earlyoom || earlyoom
  • oomd — 基于PSI的OOM-killer实现,需要4.20+版本的内核。配置文件为JSON格式且较复杂。已被确认应用于Facebook的生产环境。
https://github.com/facebookincubator/oomd || oomdAUR
  • nohang — 用Python实现的复杂OOM handler,具有可选的PSI支持,比earlyoom的可配置性强。
https://github.com/hakavlad/nohang || nohang-gitAUR
  • low-memory-monitor — 由GNOME开发,力图为用户空间应用程序提供更多的指示低内存状态的交流方式。基于PSI,需要5.2+版本的内核。
https://gitlab.freedesktop.org/hadess/low-memory-monitor/ || low-memory-monitor-gitAUR
  • uresourced — 一个为图形界面用户会话提供基于cgroup的资源保护的微型守护进程。
https://gitlab.freedesktop.org/benzea/uresourced || uresourcedAUR

网络[编辑 | 编辑源代码]

看门狗[编辑 | 编辑源代码]

根据Wikipedia:Watchdog timer:

看门狗计时器是一种检测并从计算机故障中恢复的电子计时器。在正常情况下,计算机定期重置看门狗计时器。如果计算机未能重置计时器,计时便会一直持续直到产生超时信号。产生超时信号后将执行修正操作,一般包括使系统回到安全状态并恢复正常的系统运作。

或由于系统的关键角色(如服务器)或由于断电重置(如在嵌入式设备上常发生的),许多用户需要看门狗以在某些情况下保持系统的良好运作。然而,普通用户(如使用普通台式机或笔记本)并不需要看门狗。

要关闭看门狗计时器(包含硬件及软件实现),在启动参数中加入nowatchdog


nowatchdog 启动参数可能不适用于 Intel TCO 硬件看门狗 [4]。在这种情况下,可以使用 modprobe.blacklist=iTCO_wdt 内核参数禁用 TCO 的内核模块。

如果使用的是AMD Ryzen CPU,检查日志中的sp5100-tco相关输出。sp5100-tcoAMD 700芯片组系列中的硬件看门狗。要关闭它,编辑:

/etc/modprobe.d/disable-sp5100-watchdog.conf
blacklist sp5100_tco

或者使用modprobe.blacklist=sp5100_tco 内核参数。


要检查新配置是否成功应用,执行 cat /proc/sys/kernel/watchdogwdctl

因为加载的模块更少,上述两种关闭看门狗的方式都能提升系统的启动和关机速度。此外,关闭看门狗计时器还能提升性能并降低电量消耗

另见[5][6][7],和[8]

参阅[编辑 | 编辑源代码]