1. 为什么“系统优化”是个伪命题,而策略才是真功夫
很多人一提到 Ubuntu 优化,脑子里蹦出来的第一反应就是“清理垃圾”“关闭特效”“换轻量桌面”,然后照着某些帖子敲一堆命令,重启之后发现——好像快了一点点,又好像什么都没变。我刚开始折腾 Ubuntu 那几年也是这个路子,后来才慢慢想明白一件事:优化不是一套万能脚本,而是一组根据硬件条件和使用场景做出的取舍策略。
这篇文章想聊的,就是这套“策略”层面的东西。它适合谁看?如果你手上有一台装了 Ubuntu 的机器——不管是老笔记本、公司发的开发本、还是自己攒的台式机——你希望它开机更快、响应更跟手、编译不卡顿、电池更耐用,那这篇内容就是写给你的。哪怕你只是刚装完系统的新手,只要你能打开终端、会复制粘贴命令,也能跟着一步步落地。
我先把核心观点摆出来:Ubuntu 的优化可以拆成五个层面——启动与内核、内存与交换、存储与文件系统、桌面与图形、电源与散热。这五层里,越靠底层,收益越大但风险也越高;越靠上层,感知越明显但天花板越低。一个合理的策略,是先摸清自己的瓶颈在哪一层,再决定动哪里,而不是无脑全上。
举个我自己的例子。我有一台 2016 年的老本子,4 核 i5、8G 内存、机械硬盘换成了 SATA 固态。刚装 Ubuntu 那会儿开机要一分半,我以为是内存不够,加了一堆 swap 调优,结果没啥用。后来用systemd-analyze blame一看,罪魁祸首是 NetworkManager-wait-online 和一个没用的打印服务,加起来占了 40 多秒。把这两个处理掉,开机直接进 25 秒。这件事让我彻底明白:优化的第一步永远是测量,不是动手。
所以下面我不会给你一个“一键优化脚本”,而是按层拆解,每一层告诉你:这一层在解决什么问题、什么情况下值得动、具体怎么操作、以及我踩过哪些坑。你可以把它当成一份决策地图,按需取用。
2. 第一层:启动与内核——把开机时间砍掉一半
2.1 先学会测量,别急着动手
在动任何启动项之前,你必须先知道时间花在哪了。Ubuntu 用的是 systemd,它自带了一套非常好用的分析工具,很多人却从来没用过。
打开终端,敲:
systemd-analyze你会看到类似这样的输出:
Startup finished in 3.512s (firmware) + 4.203s (loader) + 6.871s (kernel) + 22.145s (userspace) = 36.731s graphical.target reached after 22.011s in userspace这里要重点看两个数字:kernel 时间和userspace 时间。kernel 时间偏长(超过 8 秒),通常是硬件初始化或内核模块加载的问题;userspace 时间偏长(超过 15 秒),基本就是服务启动慢。
接着用这条命令看具体是哪些服务在拖后腿:
systemd-analyze blame | head -20它会按耗时从高到低列出所有服务。我实测下来,新手机器上最常见的几个“时间大户”是:
NetworkManager-wait-online.service:等网络就绪,经常占 10 到 30 秒apt-daily.service和apt-daily-upgrade.service:后台自动更新检查snapd.service:如果你装了不少 snap 应用,这个会明显拖慢plymouth-quit-wait.service:开机动画等待- 各种打印机、蓝牙、ModemManager 服务:没对应硬件却还在跑
注意:
blame列出的时间有重叠,不能简单相加,它只是告诉你“谁在占用启动窗口”。真正的关键路径要用systemd-analyze critical-chain看。
systemd-analyze critical-chain这条命令会画出一条依赖链,链上每一环都是串行等待的。优化关键路径上的服务,收益才最大。
2.2 该关的服务怎么关,关错了怎么救
找到目标之后,处理方式有三种,风险从低到高:
第一种,mask 掉(最彻底,推荐给确定不用的服务):
sudo systemctl mask NetworkManager-wait-online.servicemask 会把它链接到 /dev/null,任何东西都别想再拉起它。适合打印机、ModemManager 这种你压根没有硬件的服务。
第二种,disable 掉(保留手动启动能力):
sudo systemctl disable apt-daily.timer sudo systemctl disable apt-daily-upgrade.timer适合自动更新这类你偶尔还想手动跑一次的服务。
第三种,改配置(最温和):
比如 NetworkManager-wait-online,如果你确实需要网络就绪,但不想等那么久,可以改它的超时:
sudo mkdir -p /etc/systemd/system/NetworkManager-wait-online.service.d/ sudo tee /etc/systemd/system/NetworkManager-wait-online.service.d/override.conf <<EOF [Service] ExecStart= ExecStart=/usr/bin/nm-online -s -q --timeout=5 EOF这里ExecStart=先清空再重写是 systemd 的标准覆盖写法,很多人漏了第一行导致不生效,这是个高频坑。
关错了怎么办?别慌,Ubuntu 的恢复模式能救你。开机时按住 Shift(BIOS)或 Esc(UEFI)进 GRUB,选 Advanced options,进 recovery mode,然后选 root shell,执行:
systemctl unmask 服务名 systemctl enable 服务名我个人的经验是:每次只动一个服务,重启验证,再动下一个。一次性关十个,出了问题你根本不知道是哪个。
2.3 内核参数调优:谨慎但有效
内核参数通过 GRUB 传递,编辑/etc/default/grub里的GRUB_CMDLINE_LINUX_DEFAULT。几个我实测有效且相对安全的参数:
quiet splash改成quiet:去掉开机动画,能省 1 到 2 秒,代价是开机变丑mitigations=off:关闭 CPU 漏洞缓解,性能提升明显(尤其老 CPU),但有安全代价,只建议在完全隔离的内网机器或纯离线环境用nowatchdog:关掉硬件看门狗,省一点点transparent_hugepage=madvise:透明大页策略,对数据库类负载有影响,普通桌面可不动
改完必须执行:
sudo update-grub提示:改内核参数前,先在 GRUB 菜单里按
e临时编辑测试一次,确认能正常启动再写进配置文件。我见过太多人直接改文件,结果起不来只能进 live USB 救。
3. 第二层:内存与交换——别让 swap 拖垮你的响应
3.1 先搞清楚你的内存到底够不够
很多人一卡就怪内存,其实先要看数据。用free -h看总量和可用量,用vmstat 1看 swap 换入换出(si/so 两列)。如果 si/so 长期是 0,说明你根本没在换页,内存不是瓶颈,别瞎调。
真正需要关注 swap 的场景是:内存吃紧、系统开始频繁换页、桌面卡成幻灯片。这时候策略有两个方向——要么减少内存占用,要么优化 swap 行为。
3.2 swappiness 到底该设多少
vm.swappiness控制内核多积极地使用 swap,取值 0 到 100。默认值 Ubuntu 是 60。网上流传的说法是“设成 10 或 1 就对了”,但这是有前提的。
- 如果你有16G 以上内存 + 固态硬盘:设成 10 是合理的,让系统尽量留在物理内存里
- 如果你有8G 内存 + 机械硬盘:设成 60 甚至更高反而更好,因为机械盘随机读写慢,但顺序换页还能接受,硬扛内存不足会更卡
- 如果你跑的是数据库或虚拟机:通常建议设成 1 到 10,避免关键数据被换出
临时改:
sudo sysctl vm.swappiness=10永久改,写进/etc/sysctl.d/99-swap.conf:
vm.swappiness=10 vm.vfs_cache_pressure=50vfs_cache_pressure控制内核回收 inode/dentry 缓存的倾向,默认 100,设成 50 让内核更愿意保留缓存,对频繁访问大量小文件的场景(比如前端 node_modules)有感知。
3.3 zram:小内存机器的救命稻草
如果你内存只有 4G 或 8G,又不想加内存条,zram 是我最推荐的方案。它的原理是在内存里划一块区域,用压缩算法当 swap 用。压缩比通常能到 2:1 甚至 3:1,等于凭空多出一倍内存。
安装和启用:
sudo apt install zram-tools然后编辑/etc/default/zramswap:
ALGO=zstd PERCENT=50 PRIORITY=100ALGO=zstd是我实测压缩率和速度平衡最好的算法,PERCENT=50表示拿一半内存做 zram。改完重启,用swapon --show确认。
我拿一台 4G 内存的老本子做过对比:不开 zram,开三个浏览器标签加一个编辑器就开始换页卡顿;开了 zram 之后,同样的负载下 swap 换页几乎感觉不到,因为压缩解压都在内存里完成,比读写磁盘快几个数量级。
注意:zram 会占用 CPU 做压缩,如果你 CPU 本身就很弱(比如双核赛扬),压缩开销可能反而拖慢。这种情况建议 PERCENT 设小一点,比如 25。
4. 第三层:存储与文件系统——被严重低估的性能来源
4.1 先确认你的盘是不是瓶颈
存储这一层,很多人直接忽略,但它往往是老机器最大的瓶颈。先用lsblk -d -o NAME,ROTA,MODEL看你的盘是不是机械盘(ROTA=1 就是机械)。如果是机械盘,换固态是收益最高的一笔投资,没有之一,比任何软件优化都立竿见影。
如果已经是固态,那还有优化空间。用sudo fstrim -av手动跑一次 TRIM,看看有没有效果。Ubuntu 默认会周期性跑 fstrim.timer,但有些机器上没启用:
sudo systemctl enable fstrim.timer sudo systemctl start fstrim.timer4.2 挂载参数:noatime 和 discard 的取舍
编辑/etc/fstab,给根分区加上noatime:
UUID=xxxx / ext4 defaults,noatime,errors=remount-ro 0 1noatime的意思是每次读文件不更新访问时间。默认的relatime已经比atime好很多,但noatime更彻底,对大量小文件读写的场景(编译、git 操作)有可感知的提升。
至于discard挂载选项,我不建议直接加在 fstab 里。原因是它会在每次删除文件时同步触发 TRIM,可能造成卡顿。更好的做法是用周期性的 fstrim.timer,前面已经说了。
4.3 文件系统选择:ext4 还是 btrfs
这是个老生常谈的问题。我的结论很简单:
| 场景 | 推荐 | 理由 |
|---|---|---|
| 普通桌面、开发机 | ext4 | 成熟稳定,性能均衡,出问题好恢复 |
| 需要快照回滚 | btrfs | 内置快照,配合 timeshift 很香 |
| 老机械盘 | ext4 | btrfs 在机械盘上碎片化问题更明显 |
| 大容量数据盘 | xfs | 大文件吞吐好,但不好缩小 |
我自己的主力机用的是 ext4,因为稳定压倒一切。测试机用 btrfs 玩快照。别为了“新”而选 btrfs,除非你真的需要它的特性,这是我从一次 btrfs 崩溃恢复失败里学到的教训。
4.4 I/O 调度器:NVMe 和 SATA 不一样
Linux 有多种 I/O 调度器,不同盘适合不同的。查看当前:
cat /sys/block/nvme0n1/queue/scheduler- NVMe 固态:用
none(也叫 noop),因为 NVMe 本身队列很深,内核调度反而添乱 - SATA 固态:用
mq-deadline或kyber - 机械盘:用
bfq,对交互响应友好
临时改:
echo none | sudo tee /sys/block/nvme0n1/queue/scheduler永久改要写 udev 规则,在/etc/udev/rules.d/60-ioschedulers.rules:
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none" ACTION=="add|change", KERNEL=="sd[a-z]|mmcblk[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline" ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"这套规则我用了好几年,覆盖了绝大多数情况。
5. 第四层:桌面与图形——感知最强的优化战场
5.1 桌面环境的选择:别硬扛 GNOME
Ubuntu 默认的 GNOME 功能全、生态好,但资源占用确实不低。如果你机器内存小于 8G,或者 CPU 是低压双核,换桌面环境是感知最明显的优化。
几个主流选择:
- Xfce:轻量、稳定、可定制,内存占用约 300 到 400MB
- KDE Plasma:功能丰富,近年优化很好,内存占用约 500 到 700MB
- LXQt:极致轻量,内存占用约 200 到 300MB,但界面偏简陋
- MATE:GNOME 2 的精神续作,中庸之选
安装 Xfce 很简单:
sudo apt install xubuntu-desktop装完在登录界面右上角切换会话即可,不用卸载 GNOME,随时可以切回去。这是我最推荐的做法——保留选择权。
5.2 图形驱动:开源还是闭源
NVIDIA 显卡用户绕不开这个问题。我的经验是:
- 日常办公、看视频:开源 nouveau 够用,省心
- 游戏、CUDA、深度学习:必须装闭源驱动
装闭源驱动最稳的方式是用 Ubuntu 自带的工具:
ubuntu-drivers devices sudo ubuntu-drivers autoinstall它会自动选推荐版本。装完重启,用nvidia-smi验证。
注意:装 NVIDIA 驱动前,先关掉 Secure Boot,否则驱动签名验证会失败,进不了图形界面。这个坑我踩过不止一次,尤其是新装的机器。
AMD 显卡用户就幸福多了,开源 amdgpu 驱动质量很高,基本不用折腾。
5.3 动画和特效:该关就关
GNOME 的动画在弱机上很拖后腿。可以用 GNOME Tweaks 关掉,或者直接命令行:
gsettings set org.gnome.desktop.interface enable-animations false这一条命令,在低压 CPU 的机器上能明显感觉到窗口切换更跟手。
另外,如果你不用 Wayland 的某些特性,可以切回 X11。在登录界面点齿轮图标选 “Ubuntu on Xorg”。有些老显卡和输入法在 X11 下更稳定,这是实测结论。
5.4 字体渲染:小细节大体验
Ubuntu 默认字体渲染偏“糊”,尤其是高分屏。装 gnome-tweaks 后可以调:
sudo apt install gnome-tweaks在 Fonts 里把 Hinting 设成 Slight,Antialiasing 设成 Subpixel(LCD 屏)或 Grayscale(高分屏)。再配合安装fonts-noto-cjk和fonts-wqy-microhei,中文显示会舒服很多。这些不是性能优化,但直接影响你每天盯着屏幕的体验,我觉得值得单独提一句。
6. 第五层:电源与散热——笔记本用户的必修课
6.1 TLP:笔记本续航的标配
台式机可以跳过这节,笔记本用户强烈建议装 TLP:
sudo apt install tlp tlp-rdw sudo systemctl enable tlp sudo systemctl start tlpTLP 会自动根据电源状态(插电/电池)调整 CPU 频率、硬盘、USB 等设备的功耗策略。装完用sudo tlp-stat -s看状态,sudo tlp-stat -b看电池信息。
我实测下来,一台老 ThinkPad 装 TLP 后,电池续航从 3 小时出头提升到接近 5 小时,效果非常明显。
6.2 CPU 调频器:performance 还是 powersave
查看当前调频器:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor常见的有:
performance:一直跑最高频,性能最好但费电发热powersave:省电优先,但可能降频太狠导致卡顿schedutil:内核调度器驱动,动态调整,现代内核的推荐选择ondemand:老牌动态调频,响应稍慢
我一般用schedutil,兼顾响应和功耗。临时改:
echo schedutil | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor永久改可以写进 TLP 配置或 systemd 服务。
6.3 散热与降频:别让温度毁了性能
笔记本用久了,散热硅脂老化、风扇积灰,会导致 CPU 温度墙提前触发,性能断崖式下跌。用sensors看温度:
sudo apt install lm-sensors sudo sensors-detect sensors如果待机就 70 度以上,基本可以确定是散热问题,软件优化救不了,得清灰换硅脂。这是硬件层面的,但我想强调:很多人花大量时间调软件,却忽略了物理散热这个根本瓶颈。
软件层面能做的,是确保风扇策略正常。有些笔记本需要装thermald:
sudo apt install thermald sudo systemctl enable thermald它会根据温度主动调节,避免过热降频。
7. 常见问题与排查技巧实录
优化过程中遇到的问题,我整理成一张速查表,方便你对号入座:
| 现象 | 可能原因 | 排查命令 | 解决方向 |
|---|---|---|---|
| 开机特别慢 | 某服务卡住 | systemd-analyze blame | mask/disable 对应服务 |
| 系统越用越卡 | 内存泄漏或 swap 频繁 | free -h、vmstat 1 | 查进程、调 swappiness、上 zram |
| 磁盘读写慢 | 机械盘或调度器不当 | lsblk -d -o NAME,ROTA | 换固态、调 I/O 调度器 |
| 图形界面卡顿 | 驱动问题或动画过多 | glxinfo | grep renderer | 装正确驱动、关动画 |
| 笔记本发热严重 | 散热老化或调频不当 | sensors | 清灰、装 TLP、调 governor |
| 改完配置起不来 | 配置错误 | 进 recovery mode | 撤销改动、逐项排查 |
几个我踩过的具体坑,单独说一下:
坑一:mask 了不该 mask 的服务。有次我把systemd-logind给 mask 了,结果登录界面直接进不去。教训是:动服务前先查它是干什么的,用systemctl cat 服务名看它的描述和依赖。
坑二:swappiness 设成 0。网上有人说设 0 最好,结果我设了之后,内存一满系统直接 OOM 杀进程,比换页还惨。swappiness=0 不等于禁用 swap,它只是让内核在内存快满时才用 swap,反而容易触发 OOM。设 1 到 10 是安全区间。
坑三:fstab 写错导致进不了系统。改 fstab 一定要用sudo mount -a先测试,没报错再重启。我见过太多人直接改完重启,结果卡在 emergency mode。
坑四:盲目跟风“一键优化脚本”。网上很多脚本会一次性改几十项,你根本不知道它改了什么。出了问题无从排查。我的原则是:每一处改动都要能说清楚为什么,说不清就不改。
8. 一套可复现的完整优化流程
把前面五层串起来,我给一套我常用的流程,你可以照着走一遍:
- 测量阶段:
systemd-analyze、free -h、lsblk、sensors,把基线数据记下来 - 启动优化:处理
blame里排名靠前且确认无用的服务,每次一个,重启验证 - 内存优化:内存小于 8G 上 zram,大于 8G 调 swappiness 到 10
- 存储优化:确认固态、启用 fstrim.timer、加 noatime、按盘型设 I/O 调度器
- 桌面优化:弱机换 Xfce、关动画、装正确显卡驱动、调字体
- 电源优化:笔记本装 TLP 和 thermald,调 governor 到 schedutil
- 复测阶段:重新跑一遍测量命令,对比基线,确认收益
这套流程的核心逻辑是先测后调、逐项验证、保留退路。我一般会花一个下午做完,然后观察一周,确认稳定后再固化到配置里。
最后分享一个我个人的小习惯:每次做重大改动前,用timeshift建一个快照。Ubuntu 上装 timeshift 很简单:
sudo apt install timeshift配置好之后,出问题一键回滚,比任何手动恢复都快。这个习惯救过我好几次,尤其是折腾显卡驱动和内核参数的时候。
优化这件事,说到底是个不断迭代的过程。硬件在变、软件在变、你的使用场景也在变,没有一劳永逸的方案。我现在的做法是每半年重新测一次基线,看看有没有新的瓶颈出现。这套策略框架,你可以直接用,也可以按自己的情况调整——关键是理解每一层在解决什么问题,而不是记住一堆命令。