Arch Linux 桌面系统优化

posts/arch-linux-desktop-system-optimize

我那台 2019 年的小米笔记本 Pro(i7-8550U / Intel UHD 620 / MX250)在运行复杂场景任务下流畅度已经力不从心,部分场景下还会出现 OOM。在不换硬件的前提下,故尝试通过系统优化来改善使用体验。

本篇文章由我全新的 Macbook Air 编写,老笔记本盒盖后关闭 sddm 已经纯当 Linux 服务器了,不过本篇记录仍有参考价值。

内核优化

更换 Zen 内核

原有内核调度可能不是那么激进,所以我从 Linux 切换到了 Linux-zen。

Zen 内核是一个面向桌面用户的内核分支,针对低延迟和响应性进行了优化,非常适合日常使用。

sudo pacman -S linux-zen linux-zen-headers

linux-zen-headers 是编译内核模块所必需的,如果你需要使用 DKMS 或手动编译驱动(如 NVIDIA 驱动),请务必安装。

使用后发现感觉每次 pacman 软件安装速度好像都快了好多?

保留备用内核

安装后建议保留一个稳定的备用内核,以防 Zen 内核出现问题时无法启动:

# 方案一:保留默认内核(推荐)
# 安装时默认的 linux 内核可以保留

# 方案二:安装 LTS 长期支持内核
sudo pacman -S linux-lts linux-lts-headers

安装后更新引导加载器配置(以 GRUB 为例):

sudo grub-mkconfig -o /boot/grub/grub.cfg

重启后在 GRUB 菜单中选择需要的内核启动。

内存优化

调整内核参数

创建或编辑 /etc/sysctl.d/99-memory.conf:

vm.swappiness = 30
vm.vfs_cache_pressure = 50
vm.watermark_scale_factor = 130
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5

应用配置:

sudo sysctl --system

启用 ZRAM 压缩内存

ZRAM 将部分内存用作压缩交换空间,可以在内存不足时提供比磁盘 swap 更好的性能。

sudo pacman -S zram-generator

创建配置文件 /etc/systemd/zram-generator.conf:

[zram0]
zram-size = ram * 0.5
compression-algorithm = lz4

启用并启动服务:

sudo systemctl daemon-reload
sudo systemctl start systemd-zram-setup@zram0

验证 ZRAM 是否生效:

zramctl
swapon --show

SSD 优化

启用 TRIM

TRIM 命令让 SSD 能够回收无效数据块,维持长期性能。但是 Arch Linux 默认不开启,所以我们需要手动启用。

# 检查 SSD 是否支持 TRIM
sudo hdparm -I /dev/sda | grep TRIM
# 或
lsblk --discard

启用每周一次的 TRIM:

sudo systemctl enable fstrim.timer
sudo systemctl start fstrim.timer

验证状态:

systemctl status fstrim.timer

I/O 调度器优化

对于 SSD,建议使用 none(多队列)或 mq-deadline 调度器:

# 查看当前调度器
cat /sys/block/sda/queue/scheduler

# 临时更改
echo none | sudo tee /sys/block/sda/queue/scheduler

永久配置,创建 /etc/udev/rules.d/60-ioscheduler.rules:

# SSD 使用 none 调度器
ACTION=="add|change", KERNEL=="sd[a-z]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"

# 机械硬盘使用 bfq 调度器
ACTION=="add|change", KERNEL=="sd[a-z]*", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"

Systemd 优化

Systemd 是现代 Linux 系统的初始化系统,合理配置可以显著改善启动速度和系统性能。

分析启动时间

Systemd 自带了分析工具 systemd-analyze:

systemd-analyze

示例输出:

Startup finished in 4.271s (firmware) + 2.101s (loader) + 1.935s (kernel) + 8.578s (userspace) = 16.887s
graphical.target reached after 8.577s in userspace.

输出分为四个阶段:

  • firmware: UEFI/BIOS 启动时间
  • loader: 引导加载器(GRUB/systemd-boot)时间
  • kernel: 内核启动时间
  • userspace: 用户空间初始化时间

找出启动慢的服务

systemd-analyze blame

示例输出:

3.275s NetworkManager-wait-online.service
2.447s systemd-modules-load.service
 954ms systemd-timesyncd.service
 747ms boot.mount
 738ms dev-nvme1n1p2.device
 701ms NetworkManager.service
 645ms man-db.service
 514ms systemd-rfkill.service
 364ms plymouth-start.service
 279ms systemd-udev-trigger.service
 266ms caddy.service
 238ms upower.service
 215ms [email protected]

分析关键启动链

systemd-analyze critical-chain

示例输出:

graphical.target @8.577s
└─multi-user.target @8.577s
  └─caddy.service @8.310s +266ms
    └─network-online.target @8.307s
      └─NetworkManager-wait-online.service @5.031s +3.275s
        └─NetworkManager.service @4.316s +701ms
          └─basic.target @4.314s
            └─dbus-broker.service @4.246s +44ms
              └─dbus.socket @4.239s +54us
                └─sysinit.target @4.238s
                  └─ufw.service @4.040s +197ms
                    └─systemd-sysctl.service @4.001s +32ms
                      └─systemd-modules-load.service @742ms +2.447s
                        └─systemd-journald.socket @725ms +43us
                          └─-.mount @700ms
                            └─-.slice @700ms

@ 表示服务启动时间点,+ 表示服务初始化耗时。上例中 NetworkManager-wait-online.service 是主要瓶颈。

生成启动图表

systemd-analyze plot > boot-chart.svg

用浏览器打开 boot-chart.svg 可以直观看到每个服务的启动时间线。

禁用不必要的服务

根据 blame 和 critical-chain 的结果,可以禁用不需要的服务:

# 等待网络连接(桌面环境通常不需要)
sudo systemctl disable NetworkManager-wait-online.service
sudo systemctl mask NetworkManager-wait-online.service

# 蓝牙服务(如果不使用蓝牙)
sudo systemctl disable bluetooth.service

# 打印服务(如果不使用打印机)
sudo systemctl disable cups.service

# ModemManager(如果不使用移动宽带)
sudo systemctl disable ModemManager.service

使用 Socket 激活优化服务启动

某些服务(如 Docker)可以使用 socket 激活来延迟启动:

# 以 Docker 为例:禁用服务但启用 socket
sudo systemctl disable docker.service
sudo systemctl enable docker.socket

# 这样 Docker 会在第一次有连接请求时才启动

优化日志配置

编辑 /etc/systemd/journald.conf:

[Journal]
Storage=volatile
SystemMaxUse=100M
RuntimeMaxUse=100M
Compress=yes

重启服务:

sudo systemctl restart systemd-journald

减少控制台日志输出

编辑 /etc/default/grub:

GRUB_CMDLINE_LINUX_DEFAULT="quiet loglevel=3 rd.systemd.show_status=auto"

更新 GRUB:

sudo grub-mkconfig -o /boot/grub/grub.cfg

总结

以上就是我对那台老小米笔记本做的全部优化了。换完 Zen 内核之后日常使用确实流畅了一些,ZRAM 也在内存吃紧的时候帮了不少忙。至于启动速度,禁用掉 NetworkManager-wait-online.service 之后直接从原来的 8 秒多降到了 5 秒左右,提升还是挺明显的。

当然,这些优化都是建立在我的使用场景上的,你可能需要根据自己的实际情况来调整。建议每次修改后观察一下系统稳定性,有问题及时回滚。

参考链接