嘿,朋友,我懂你的痛苦。手里那台老笔记本,曾经也是意气风发,如今打开一个浏览器标签页都要思考人生,风扇还吵得像直升机起飞。Fedora Silverblue 是个好系统,immutable(不可变)架构让它稳固、安全、还原方便,但它的默认配置往往是给“现代硬件”准备的。当你在老旧硬件上运行它时,那种“力不从心”的感觉主要来自两方面:I/O 瓶颈(磁盘读写慢) 和 CPU 调度/散热策略不当(发热降频)。
别急,今天咱们不聊虚的,就聊聊怎么通过精细调整磁盘缓存策略和内核参数,让这台老机器重获新生。我们会深入底层,用代码和具体的命令,一步步拆解问题。
理解 Silverblue 的特殊性:为什么优化方法不同?
在开始之前,你得明白一点:Silverblue 是基于 RPM ostree 的不可变操作系统。这意味着 /usr 是只读的,你不能随便 apt-get install 或者手动修改 /etc 下的核心系统文件。很多传统的 Linux 优化教程(比如修改 /etc/sysctl.conf)在 Silverblue 上可能需要特殊处理,或者直接使用 rpm-ostree 来注入配置。
但是!内核参数(sysctl)和 systemd 服务文件,我们可以通过 rpm-ostree 来覆盖,或者使用 systemd 的用户级服务。对于磁盘缓存和 I/O 调度,我们主要通过 blk-mq 参数和 tuned _profile 来调整。
核心目标:减少磁盘读写次数(因为老硬盘慢),优化 CPU 频率调度(因为老 CPU 散热差),让系统更“轻快”。
第一步:诊断现状——你的瓶颈在哪里?
在盲目优化之前,先看看问题出在哪儿。运行以下命令,收集信息:
# 查看磁盘 I/O 统计,注意 await 和 r_await/w_await
iostat -xz 1 5
# 查看系统负载,特别是 iowait
top
# 查看当前 CPU 频率和温度
sensors
# 查看当前内核参数中的 vm 相关设置
sysctl vm.swappiness
sysctl vm.vfs_cache_pressure
sysctl vm.dirty_ratio
sysctl vm.dirty_background_ratio
# 查看当前磁盘调度器
cat /sys/block/sda/queue/scheduler
如果 iostat 显示 await 很高(比如超过 100ms),说明磁盘是瓶颈。如果 top 显示 wa (iowait) 很高,也确认了这点。如果温度经常飙到 90°C+,CPU 降频,那发热和调度是问题。
第二步:磁盘 I/O 优化——让老硬盘少干活
老旧硬盘(尤其是机械硬盘 HDD)最怕随机读写。我们的目标是:减少不必要的磁盘写入,优化读取缓存。
2.1 调整内存页回收和缓存压力
Linux 内核会将文件缓存存放在 RAM 中(page cache)。对于老系统,RAM 可能不大(比如 4GB 或 8GB),我们需要仔细平衡内存使用。
vm.swappiness:控制内核将进程内存交换到交换空间(swap)的倾向。默认值是 60。对于老电脑,如果 RAM 较小,提高这个值可能导致更多交换,加剧磁盘 I/O。但反之,如果 RAM 足够(比如 8GB+),适当降低可以让文件缓存更多。- 建议:对于 4GB RAM,设为 10-20;对于 8GB RAM,设为 10 左右。避免设为 0(可能导致 OOM killer 直接杀进程)。
vm.vfs_cache_pressure:控制内核回收 dentry 和 inode 缓存的倾向。默认 100。降低它可以减少目录和文件元数据的磁盘查找次数。- 建议:设为 50。
vm.dirty_ratio和vm.dirty_background_ratio:控制内核将脏页(已修改但未写入磁盘的数据)刷盘的策略。老硬盘写入慢,如果一次写入太多数据,会导致系统卡顿(因为内核在等待磁盘)。- 建议:降低这两个值,让内核更频繁地小批量刷盘,避免突发写入。
如何在 Silverblue 上应用这些?
创建一个 /etc/sysctl.d/99-performance.conf 文件。由于 Silverblue 的 /etc 是只读的,我们需要通过 rpm-ostree 来注入这个文件。
# 1. 准备配置内容
cat <<EOF | sudo tee /tmp/99-performance.conf
# Fedora Silverblue 性能优化 - 磁盘与内存
vm.swappiness=10
vm.vfs_cache_pressure=50
vm.dirty_ratio=10
vm.dirty_background_ratio=5
vm.overcommit_memory=2
EOF
# 2. 使用 rpm-ostree 安装这个配置文件
# 注意:rpm-ostree 通常用于安装包,对于 sysctl 文件,我们可以创建一个简单的包或者使用 --install 选项?
# 实际上,更简单的方法是创建一个 local override。
# 方法 A:使用 rpm-ostree 的 --install 安装一个包含 sysctl 文件的最小化 rpm(复杂)
# 方法 B:直接使用 systemctl 重载 sysctl,但需要写入 /etc/sysctl.d,这在 Silverblue 上需要特殊处理。
# 更实用的 Silverblue 方法:
# 创建一个 systemd 服务来在启动时应用这些参数,或者使用 rpm-ostree 的 --sysusers 和 --files 等?
# 不,最简单且推荐的方式是:创建一个 /usr/etc/sysctl.d/ 的 override?不对。
# 正确做法:在 Silverblue 中,/etc/sysctl.d/ 是可写的吗?
# 检查:
ls -la /etc/sysctl.d/
# 如果 /etc/sysctl.d/ 存在且可写,直接创建文件。
# 如果不可写,我们需要使用 rpm-ostree 来覆盖。
# 创建一个临时目录,编写配置文件,然后打包?太复杂。
# 实际上,/etc/sysctl.d/ 在 Silverblue 中通常是可写的,因为它是用户覆盖区域。
# 让我们假设它是可写的,如果不是,我们会给出替代方案。
替代方案(如果 /etc/sysctl.d 不可写):使用 systemd 的 sysctl 服务单元。
创建一个服务单元文件,通过 rpm-ostree 的 --install 安装一个包含该单元的小包,或者使用 systemctl 的 edit --full 来创建用户级覆盖?不,系统级服务需要 root。
最稳妥的 Silverblue 方式:创建一个 rpm-ostree 的 layer。
# 1. 创建一个目录结构
mkdir -p /tmp/silverblue-tuning/etc/sysctl.d
# 2. 写入配置文件
cat <<EOF > /tmp/silverblue-tuning/etc/sysctl.d/99-performance.conf
vm.swappiness=10
vm.vfs_cache_pressure=50
vm.dirty_ratio=10
vm.dirty_background_ratio=5
EOF
# 3. 创建一个最小化的 spec 文件来构建 rpm(这需要 mock 或 rpmbuild,比较复杂)
# 对于大多数用户,更简单的做法是:
# 使用 rpm-ostree 的 --custom-sysroot 或者直接使用 systemctl 重载?
# 实际上,Fedora Silverblue 的用户手册建议:对于 sysctl,可以直接写入 /etc/sysctl.d/,如果权限允许。
# 让我们检查权限:
sudo touch /etc/sysctl.d/test && echo "可写" || echo "不可写"
# 如果不可写,我们可以使用:
# sudo rpm-ostree override install --replace-files <path-to-rpm>
# 但这需要构建 rpm。
# 对于初学者,我建议先尝试直接写入,如果失败,再考虑其他方法。
假设我们可以写入 /etc/sysctl.d/,应用配置:
sudo sysctl --system
2.2 调整 I/O 调度器
机械硬盘(HDD)通常使用 deadline 或 bfq 调度器,而固态硬盘(SSD)使用 none 或 mq-deadline。老硬盘可能还在用 cfq,这很糟糕。
检查并更改调度器:
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 临时更改(重启后失效)
echo "deadline" | sudo tee /sys/block/sda/queue/scheduler
# 永久更改:创建 udev 规则
# 同样,在 Silverblue 中,我们需要确保这个规则被持久化。
# 创建 /etc/udev/rules.d/99-io-scheduler.rules
cat <<EOF | sudo tee /etc/udev/rules.d/99-io-scheduler.rules
# 为 SATA 磁盘设置 deadline 调度器
ACTION=="add|change", ATTRS{vendor}=="ATA", ATTRS{model}=="ST1000DM003-1SB102", ATTR{queue/scheduler}="deadline"
# 或者更通用的规则,针对所有磁盘
# ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="deadline"
EOF
# 重新加载 udev 规则
sudo udevadm control --reload-rules
sudo udevadm trigger
注意:deadline 对老 HDD 通常比 bfq 响应更快,因为 bfq 虽然公平,但开销较大。如果系统是固态硬盘,使用 none 或 mq-deadline。
2.3 禁用不必要的磁盘写入
老硬盘的写入寿命和速度都有限。我们可以减少一些日志和统计的写入。
- 禁用
atime更新:Linux 默认每次读取文件都会更新访问时间和修改时间(atime)。这会产生大量不必要的写入。改为relatime或noatime。- 方法:在
/etc/fstab中为根分区和 home 分区添加relatime或noatime。 - Silverblue 注意:
/etc/fstab通常是可写的。修改后,重新挂载文件系统。
- 方法:在
# 查看当前挂载选项
findmnt -no OPTIONS /
# 编辑 /etc/fstab,添加 relatime 或 noatime
# 例如,将 root 分区的选项从 defaults 改为 defaults,relatime
# 然后重新挂载(需要重启或卸载重新挂载,对于根分区只能重启)
# 重启后,验证
findmnt -no OPTIONS /
- 减少
sysctl的audit写入:如果不需要审计,可以禁用审计服务。
sudo systemctl disable auditd
sudo systemctl stop auditd
第三步:CPU 频率调度与发热管理
老硬件的散热系统往往老化,CPU 容易过热降频。我们需要让 CPU 在性能模式和节能模式之间智能切换。
3.1 调整 CPU 频率调速器
Linux 提供几种 CPU 频率调速器:
performance:始终运行在最高频率,发热大,耗电高。powersave:始终运行在最低频率,性能差,省电。ondemand:根据负载动态调整,反应较慢。conservative:类似 ondemand,但调整更渐进。schedutil:基于调度器负载的动态调整,通常是最优选择。
对于老硬件,推荐使用 schedutil 或 conservative。
# 查看当前调速器
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 查看所有可用的调速器
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
# 临时更改为 schedutil
echo "schedutil" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
# 永久更改:使用 tuned 配置文件
# 在 Silverblue 中,我们可以创建一个自定义的 tuned 配置文件
创建自定义 tuned 配置文件:
# 复制一个现有的配置文件作为模板
sudo cp -r /usr/lib/tuned/conservative /etc/tuned/my-old-hw-tuning
# 编辑配置文件
sudo vim /etc/tuned/my-old-hw-tuning/tuned.conf
# 内容如下:
[main]
summary=Custom tuning for old hardware
include=conservative
[cpu]
# 设置 governor 为 schedutil
governor=schedutil
# 设置最大频率(如果知道的话,可以限制最大频率以降低发热)
# max_freq=2400000 # 单位 kHz,需要查看实际最大频率
[vm]
vm.swappiness=10
然后激活这个配置:
sudo tuned-adm profile my-old-hw-tuning
检查是否生效:
tuned-adm active
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
3.2 热管理工具
如果散热问题严重,可以考虑安装 thermald 或 fancontrol。
thermald:动态热管理守护进程,可以监控温度并调整 CPU 频率和风扇。sudo rpm-ostree install thermald sudo systemctl enable --now thermaldfancontrol:用于控制风扇速度,需要配置pwmconfig。
第四步:系统服务与后台进程优化
老硬件的资源有限,减少后台进程可以显著提升响应速度。
4.1 禁用不必要的服务
使用 systemd 禁用一些不常用的服务。
# 查看当前运行的服务
systemctl list-units --type=service --state=running
# 禁用一些常见但不必要的服务(请根据自己情况选择)
sudo systemctl disable --now systemd-logind # 注意:禁用 logind 可能导致无法正常登出,谨慎!
# 更好的做法是禁用一些自动启动的服务:
sudo systemctl disable --now colord # 色彩管理
sudo systemctl disable --now cups # 打印服务
sudo systemctl disable --now smartd # 硬盘 SMART 监控(如果不需要)
sudo systemctl disable --now NetworkManager-dispatcher # 网络调度
Silverblue 提示:这些服务是通过 rpm-ostree 安装的,禁用不会影响系统文件,只是不自动启动。
4.2 使用 preload 优化应用加载
preload 是一个守护进程,它会学习用户常用的应用程序,并预先将它们加载到内存中。对于老硬盘,这可以显著减少应用启动时间。
sudo rpm-ostree install preload
sudo systemctl enable --now preload
第五步:图形界面优化(GNOME Shell)
Fedora Silverblue 默认使用 GNOME Shell。GNOME 对图形性能有一定要求,老硬件可能带不动。
5.1 启用硬件加速
确保你的显卡驱动正确安装,并且硬件加速已启用。
# 检查 OpenGL 渲染信息
glxinfo | grep "OpenGL renderer"
如果是 NVIDIA 显卡,需要安装专有驱动。对于 Intel 或 AMD 集成显卡,通常默认驱动已经不错。
5.2 减少 GNOME 特效
# 使用 gnome-tweaks 禁用动画
# 或者通过命令行
gsettings set org.gnome.desktop.interface enable-animations false
gsettings set org.gnome.shell.extensions.dash-to-dock unhide-on-hover false
5.3 考虑使用更轻量的桌面环境
如果 GNOME Shell 仍然太卡,可以考虑在 Silverblue 中切换桌面环境,或者使用轻量级 Shell 扩展。
# 安装 XFCE 桌面环境(作为覆盖层)
sudo rpm-ostree install xfce4-session xfce4-panel xfce4-settings
# 重启后,在登录界面选择 XFCE 会话
第六步:监控与调优
优化不是一劳永逸的。我们需要持续监控系统状态。
# 使用 gnome-system-monitor 或 htop 监控系统资源
# 使用 powertop 进行电源优化建议
sudo rpm-ostree install powertop
sudo powertop --auto-tune
# 注意:powertop --auto-tune 会执行一系列优化,但可能在 Silverblue 中部分失效,因为 /sys 是动态的。
# 可以将 powertop 的命令添加到 systemd 服务中,以便每次启动时自动应用。
创建 powertop 启动服务:
sudo systemctl edit --force --full powertop.service
编辑内容:
[Unit]
Description=Powertop auto-tune
After=multi-user.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/powertop --auto-tune
[Install]
WantedBy=multi-user.target
然后启用:
sudo systemctl enable powertop.service
总结与注意事项
通过以上步骤,我们从磁盘 I/O、CPU 频率调度、系统服务、图形界面等多个层面,对 Fedora Silverblue 在老旧硬件上的性能进行了优化。
关键点回顾:
- 磁盘缓存:调整
vm.swappiness、vfs_cache_pressure、dirty_ratio等参数,减少不必要的磁盘写入,优化缓存使用。 - I/O 调度:为机械硬盘设置
deadline调度器,为固态硬盘设置none。 - CPU 调度:使用
schedutil调速器,结合tuned配置文件,平衡性能与发热。 - 服务精简:禁用不必要的后台服务,安装
preload优化应用启动。 - 图形优化:禁用 GNOME 动画,考虑轻量级桌面环境。
重要提醒:
- Silverblue 的特殊性:所有
