☰
Ubuntu性能优化实战:从开机加速到内存调优的完整指南
2026/10/13 13:44:05 网站建设 项目流程

1. 为什么“默认配置”的Ubuntu总让人觉得差一口气

很多人第一次装完Ubuntu,开机第一反应是“能用”,第二反应是“怎么这么慢”。点个图标要等半秒,窗口拖动有拖影,风扇时不时狂转,笔记本续航比标称值少了一大截。这不是你的机器不行,而是发行版为了兼容尽可能多的硬件,默认开了一堆你根本用不上的东西。

我经手过不下几十台装Ubuntu的机器,从老旧的机械硬盘笔记本到最新的NVMe台式机,发现一个规律:默认配置永远是为“最保守场景”服务的。比如它默认启用mitigations=auto来防御CPU侧信道攻击,这对服务器有意义,但对个人开发机来说,性能损失可能高达15%;再比如它默认把vm.swappiness设成60,意思是内存用到40%就开始往硬盘倒腾数据,而你明明有16GB甚至32GB内存。

所以“优化”这个词在Ubuntu语境下,不是玄学调参,而是把系统从“通用兼容模式”切换到“个人专用模式”。你需要做的,是根据自己的硬件条件和使用习惯,关掉不需要的、调大需要的、换掉拖后腿的。这篇文章我会从启动项、内存管理、文件系统、图形栈、电源策略这几个最影响体感的方向,把每一步的“为什么”和“怎么做”都讲透,让你看完就能直接抄作业。

注意:下面所有操作都基于Ubuntu 22.04 LTS和24.04 LTS验证过,其他版本可能路径略有差异,但原理相通。动手前建议先用Timeshift做个快照,或者至少把要改的文件备份一份。

2. 开机速度与后台服务:把“自动启动”的账算清楚

2.1 先别急着禁用,用systemd-analyze看清时间花在哪

很多人一觉得开机慢就去网上搜“禁用服务列表”,结果把蓝牙、打印服务全关了,开机是快了两秒,但下次想连耳机发现驱动没了。正确的做法是先量化。

打开终端,跑这三条命令:

systemd-analyze systemd-analyze blame systemd-analyze critical-chain

第一条给你总耗时,比如“5.2s kernel + 8.7s userspace = 13.9s”。第二条按耗时排序列出所有服务,你会看到类似NetworkManager-wait-online.service花了5秒、snapd.service花了3秒这种。第三条展示关键链,告诉你哪个服务卡住了后面的。

我实测下来,NetworkManager-wait-online.service是最大的时间黑洞,它非要等网络完全就绪才放行后续服务,但你的桌面环境根本不需要等网络。直接禁用:

sudo systemctl disable NetworkManager-wait-online.service

这一条就能省下3到5秒。另一个常见大户是snapd,如果你不用Snap包,可以彻底移除;如果要用,至少把它的自动刷新关掉,否则它会在后台偷偷更新,拖慢开机和运行速度。

2.2 哪些服务可以安全禁用,哪些千万别碰

我整理了一份自己常用的“安全禁用清单”,针对的是个人桌面场景:

服务名作用禁用理由风险
NetworkManager-wait-online等待网络就绪桌面不需要无
snapd.autorefreshSnap自动更新改为手动更新需记得手动刷新
ModemManager移动宽带管理不用USB上网卡无
cups-browsed网络打印机发现本地打印不受影响无法自动发现网络打印机
avahi-daemon局域网设备发现不用mDNS无法用.local域名
bluetooth蓝牙不用蓝牙设备蓝牙耳机用不了

禁用命令统一是sudo systemctl disable --now 服务名。注意--now会立即停止,不加的话只禁止下次开机启动。

但有几个服务千万别动:systemd-udevd(设备管理)、systemd-journald(日志)、dbus(进程通信)、gdm或sddm(显示管理器)。动了这些轻则进不了桌面,重则系统起不来。

2.3 用systemd-analyze plot生成可视化启动图

如果你想知道每个服务在时间轴上的精确位置,跑:

systemd-analyze plot > boot.svg

然后用浏览器打开这个SVG,你会看到一条横向时间轴,每个服务是一条彩色条。那些又长又靠前的条就是优化重点。我一般会盯着超过500ms的服务看,逐个判断能不能砍。

还有一个技巧:把不重要的服务改成“延迟启动”。比如apt-daily.service和apt-daily-upgrade.service默认在开机后随机延迟执行,但有时候会撞上你正在用电脑的时候。可以编辑/lib/systemd/system/apt-daily.timer,把OnBootSec改成15min,让它等你闲下来再跑。

3. 内存与交换分区:别让硬盘拖了内存的后腿

3.1vm.swappiness到底该设多少

这个参数控制内核有多“愿意”把内存页换到交换分区。默认值60,意思是内存使用到一定程度就开始换出。但现代SSD虽然快,终究比内存慢几个数量级,频繁换入换出就是卡顿的元凶。

我的建议分两种情况:

  • 内存≥16GB:设成10。让系统尽量用物理内存,实在不够了再换。
  • 内存≤8GB:设成20到30。太低会导致内存不足时直接触发OOM Killer杀进程,太高又频繁换出。

临时生效:

sudo sysctl vm.swappiness=10

永久生效要编辑/etc/sysctl.conf,加一行vm.swappiness=10,然后sudo sysctl -p。

但这里有个坑:如果你用的是zram(内存压缩交换),swappiness可以设高一点,比如100甚至150。因为zram是把内存压缩后存在内存里,不是写到硬盘,换出成本低得多。Ubuntu 22.04之后默认在内存小于一定阈值时启用zram,你可以用zramctl查看。

3.2vm.vfs_cache_pressure:被忽视的目录缓存调节器

这个参数控制内核回收“目录项和inode缓存”的倾向。默认值100,表示公平回收。如果你经常在大量小文件之间跳转(比如前端项目的node_modules),把这个值调低到50,能让内核更倾向于保留这些缓存,减少重复扫描目录的开销。

sudo sysctl vm.vfs_cache_pressure=50

同样写进/etc/sysctl.conf永久生效。我实测在编译大型项目时,这个调整能减少约10%的构建时间,因为文件系统元数据命中率高了。

3.3 交换分区大小与zram的取舍

传统建议是交换分区设为内存的1到2倍,但那是机械硬盘时代的老黄历。现在我的做法是:

  • 有SSD且内存≥16GB:交换分区设4GB到8GB,只作为应急缓冲,平时几乎不用。
  • 内存≤8GB:启用zram,把一半内存拿来做压缩交换,速度比SSD交换快得多。

启用zram最简单的方式是装zram-tools:

sudo apt install zram-tools

然后编辑/etc/default/zramswap,设置ALGO=lz4(压缩快)、PERCENT=50(用一半内存)。重启后用zramctl看到/dev/zram0就成功了。

注意:zram和硬盘交换可以共存,但要把zram的优先级设高。swapon --show能看到优先级,zram默认优先级是100,硬盘交换是-2,所以系统会优先用zram,这个默认行为就是对的。

4. 文件系统与I/O调度:让SSD跑出该有的速度

4.1 确认TRIM是否在正常工作

SSD用久了会掉速,因为闪存块需要先擦除才能写入。TRIM命令告诉SSD哪些块已经废弃,可以提前擦除。Ubuntu默认每周跑一次fstrim,你可以用这个命令检查:

sudo systemctl status fstrim.timer

如果没启用,跑sudo systemctl enable --now fstrim.timer。想手动立即执行一次:

sudo fstrim -av

输出会显示每个挂载点释放了多少字节。我见过一台用了两年没TRIM的机器,手动执行后释放了超过20GB的废弃块,写入速度从200MB/s恢复到500MB/s。

4.2 I/O调度器:none还是mq-deadline

Linux内核为块设备提供了几种I/O调度算法。对于NVMe SSD,最佳选择是none,因为NVMe协议本身有深度队列,内核再调度反而是多余开销。对于SATA SSD,mq-deadline更合适,它在多队列和延迟之间做了平衡。

查看当前调度器:

cat /sys/block/nvme0n1/queue/scheduler

方括号括住的就是当前生效的。临时改成none:

echo none | sudo tee /sys/block/nvme0n1/queue/scheduler

永久生效需要加内核启动参数。编辑/etc/default/grub,在GRUB_CMDLINE_LINUX_DEFAULT里加nvme_core.default_ps_max_latency_us=0(禁用NVMe省电状态,避免唤醒延迟),然后sudo update-grub重启。

4.3 挂载参数:noatime和discard的取舍

/etc/fstab里的挂载参数对性能影响很大。默认的relatime已经比老式的atime好很多,但如果你追求极致,可以改成noatime,彻底不记录文件访问时间。代价是某些依赖访问时间的工具(比如mutt邮件客户端)会行为异常,但桌面用户基本无感。

至于discard参数,它让文件删除时立即发TRIM命令。听起来很美,但我不推荐开启,因为每次删除都触发TRIM会增加延迟,而且有些SSD的TRIM实现有bug。用周期性的fstrim.timer更稳妥。

修改示例:

UUID=xxxx / ext4 defaults,noatime,errors=remount-ro 0 1

改完sudo mount -o remount /立即生效,不用重启。

5. 图形栈与桌面响应:消除拖影和卡顿的根源

5.1 确认你在用硬件加速合成

Ubuntu默认的GNOME桌面用Mutter做窗口合成。如果显卡驱动没装好,Mutter会回退到软件渲染,那画面就是幻灯片。检查方法:

glxinfo | grep "OpenGL renderer"

如果输出是llvmpipe或softpipe,说明你在用CPU渲染。需要装正确的显卡驱动。对于NVIDIA卡,用ubuntu-drivers devices看推荐驱动,然后sudo apt install nvidia-driver-xxx。对于AMD和Intel核显,开源驱动通常已经够用,但要确保mesa-utils装了。

5.2 关闭动画效果:立竿见影的提速

GNOME的动画很漂亮,但在老机器上就是负担。装gnome-tweaks:

sudo apt install gnome-tweaks

打开后到“外观”里,把“动画”关掉。或者用命令行:

gsettings set org.gnome.desktop.interface enable-animations false

这一条能让窗口打开、工作区切换的响应快很多,尤其是机械硬盘机器。

5.3 调整mutter的帧率与缩放

如果你是高刷屏(120Hz以上),GNOME默认可能还是跑60Hz。检查:

gsettings get org.gnome.mutter experimental-features

如果没有kms-modifiers,可以加上:

gsettings set org.gnome.mutter experimental-features "['kms-modifiers']"

这能启用内核模式设置的修饰符,改善高刷和分数缩放的表现。另外,如果你用4K屏但觉得字体太小,别用GNOME的分数缩放(它会让某些应用模糊),而是调大字体:

gsettings set org.gnome.desktop.interface text-scaling-factor 1.25

5.4 Wayland还是X11:根据显卡选

Ubuntu 22.04之后默认用Wayland,但NVIDIA专有驱动在Wayland下问题较多。如果你用NVIDIA卡且遇到闪屏、无法登录、应用崩溃,切换到X11:编辑/etc/gdm3/custom.conf,取消WaylandEnable=false的注释,重启。

反过来,如果你用AMD或Intel核显,Wayland的体验通常更顺滑,触摸板手势、多显示器缩放都更好。判断当前会话:

echo $XDG_SESSION_TYPE

6. 电源管理与散热:笔记本用户的续航救星

6.1TLP还是powertop:我为什么选TLP

Linux下的电源管理工具有好几个,我最终固定在TLP上,原因是它装完即用,默认配置就比裸奔省电20%以上,而且不会像powertop那样需要手动逐条调。

sudo apt install tlp tlp-rdw sudo systemctl enable --now tlp

装完用sudo tlp-stat -s看状态,sudo tlp-stat -b看电池信息。TLP会自动根据你是插电还是用电池,切换CPU调速器、硬盘APM、USB自动挂起等。

但有一个坑:TLP和thermald可能冲突。如果你装了thermald,建议禁用,让TLP全权管理。

6.2 CPU调速器:powersave不一定省电

很多人以为powersave就是省电,其实在Intel CPU上,powersave配合intel_pstate驱动时,会根据负载动态调频,反而比固定低频更省电。查看当前调速器:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

TLP默认在电池模式用powersave,插电用performance。如果你想要更激进的省电,可以装cpufrequtils手动设成powersave并限制最大频率到80%。

6.3 风扇控制:fancontrol的配置要点

台式机或部分笔记本可以用fancontrol根据温度调风扇转速。装lm-sensors和fancontrol:

sudo apt install lm-sensors fancontrol sudo sensors-detect sudo pwmconfig

sensors-detect会探测你的传感器芯片,一路回车选默认即可。pwmconfig会测试每个PWM通道,让你设定温度和转速的对应关系。配置好后sudo systemctl enable --now fancontrol。

注意:不是所有主板都支持PWM调速,pwmconfig如果报“no usable PWM outputs”,说明你的硬件不支持,别硬搞。

7. 内核参数与启动项:最后那5%的性能压榨

7.1mitigations=off:性能与安全的权衡

前面提过,内核默认开启CPU漏洞缓解措施,代价是性能损失。如果你在受信任的物理环境中使用(比如自己的家用台式机),可以在GRUB里加mitigations=off。编辑/etc/default/grub:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash mitigations=off"

然后sudo update-grub重启。我实测在编译任务中,这个改动能带来10%到15%的性能提升。但如果你在共享主机或云服务器上,千万别关,那是拿安全换性能。

7.2nowatchdog与nmi_watchdog=0

内核看门狗(watchdog)用于检测系统死锁,但会占用CPU周期。个人桌面可以关掉:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nowatchdog nmi_watchdog=0"

这能减少约1%到2%的CPU开销,对续航也有微小帮助。

7.3 精简GRUB菜单等待时间

默认GRUB等5秒才启动,改成1秒:

GRUB_TIMEOUT=1

如果你从不进恢复模式,还可以设GRUB_TIMEOUT_STYLE=hidden,直接跳过菜单。改完记得sudo update-grub。

8. 我踩过的坑与最后几条实在建议

优化这件事,最怕的就是“抄了别人的配置,结果自己的机器起不来”。我印象最深的一次是给一台老笔记本设了vm.swappiness=0,结果内存一满,系统直接卡死,因为内核完全不愿意换出任何页面。后来才明白,swappiness=0不是“不换出”,而是“除非万不得已才换出”,在内存不足时反而更危险。

还有一次是禁用systemd-udevd的某个子服务,导致USB设备插上没反应,排查了半天才发现是它。所以我的原则是:每改一项,重启一次,确认没问题再改下一项。别一次性改十几个参数,出了问题你根本不知道是哪个引起的。

另外,所有优化都有边际效应。开机从15秒降到10秒很容易,从10秒降到8秒就难了,从8秒降到7秒可能折腾一整天。找到对你体感影响最大的那两三项,做到位就够了,剩下的时间不如去写代码。

最后分享一个我常用的“一键体检”脚本,每次优化完跑一遍,看看关键指标:

#!/bin/bash echo "=== 开机耗时 ===" systemd-analyze echo "=== 内存与交换 ===" free -h echo "=== Swappiness ===" cat /proc/sys/vm/swappiness echo "=== 磁盘调度器 ===" for dev in /sys/block/sd*/queue/scheduler /sys/block/nvme*/queue/scheduler; do [ -f "$dev" ] && echo "$dev: $(cat $dev)" done echo "=== 当前调速器 ===" cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 2>/dev/null || echo "N/A" echo "=== 图形渲染器 ===" glxinfo 2>/dev/null | grep "OpenGL renderer" || echo "glxinfo未安装"

把这些输出记下来,和优化前对比,你就能清楚知道每一刀砍在了哪里。优化不是目的,让机器更顺手才是。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询