本项目不是单纯追求 systemd-analyze 输出中的某一个启动数字,而是针对桌面 Linux 用户真正感知到的两段启动过程进行分析和优化:
从内核开始执行,到图形登录界面可以显示和响应;
从用户会话启动,到桌面、任务栏、文件能力、输入法等核心组件全部可用。
优化必须同时满足以下要求:
能解释时间消耗发生在哪条依赖链上;
不通过关闭图形登录、网络、DNS 或桌面核心能力换取分数;
不把必要初始化简单延后,造成登录后首次使用明显卡顿;
可以在优化前预览计划,在异常时恢复;
能在 openKylin 之外的 systemd 桌面发行版上安全迁移;
测量、优化、复测、对比和出图均可重复执行并保留原始证据。
项目最终形成以下闭环:
flowchart LR
A["采集 baseline"] --> B["分析 blame 与 critical-chain"]
B --> C["识别关键路径、后台争用和无效服务"]
C --> D["dry-run 检查优化计划"]
D --> E["应用白名单优化"]
E --> F["重启并采集 optimized"]
F --> G["健康检查与量化对比"]
G --> H["多轮中位数、汇总和出图"]
G -->|"功能异常"| I["按 manifest 还原"]
openKylin 启动性能分析与优化
项目优化方案完整思路与实现解析
1. 项目要解决的问题
本项目不是单纯追求
systemd-analyze输出中的某一个启动数字,而是针对桌面 Linux 用户真正感知到的两段启动过程进行分析和优化:优化必须同时满足以下要求:
项目最终形成以下闭环:
flowchart LR A["采集 baseline"] --> B["分析 blame 与 critical-chain"] B --> C["识别关键路径、后台争用和无效服务"] C --> D["dry-run 检查优化计划"] D --> E["应用白名单优化"] E --> F["重启并采集 optimized"] F --> G["健康检查与量化对比"] G --> H["多轮中位数、汇总和出图"] G -->|"功能异常"| I["按 manifest 还原"]核心脚本对应关系如下:
scripts/measure-boot.shscripts/auto-optimize.shscripts/compare-boot.shscripts/generate-test-assets.pyscripts/generate-result-cards.py2. 统一计时模型
项目统一使用内核 monotonic clock 的 0 点作为
t0,即内核开始执行的时刻。BIOS、UEFI、固件和 GRUB 菜单等待不计入结果。t0到 systemd PID 1 启动systemd-analyze的 kernel 时间systemd-analyze的 userspace 时间t0到graphical.target或 greeter 实际显示t0到 UKUI/GNOME 用户会话出现t0到桌面核心组件全部出现desktop ready - session start这样可以区分三个经常被混淆的概念:
graphical.target到达不一定代表 greeter 已经真实显示;measure-boot.sh因此同时保存 systemd 指标和 journal 中的实际桌面事件,避免只依赖单一口径。3. 优化前的瓶颈分析
项目先使用以下证据定位问题,再决定是否优化某个单元:
分析得到的主要问题分为四类。
3.1 冗余服务进入图形启动关键路径
openKylin 基线环境的关键链中,
dnsmasq.service被挂在multi-user.target之前,并要求网络目标就绪:graphical.target └─multi-user.target └─dnsmasq.service └─network.target └─NetworkManager.service └─dbus.service
该测试环境实际使用
systemd-resolved提供 DNS 解析,/etc/resolv.conf并不指向dnsmasq。因此dnsmasq对该客户端 VM 是冗余的,却把 NetworkManager 拉起过程带入graphical.target关键路径。对应优化不是让网络更晚可用,而是移除一个不参与实际 DNS 解析的冗余依赖,使网络初始化与图形登录可以并行推进。这属于“无效等待消除 + 关键路径解耦”。
3.2 等待网络完全在线阻塞桌面登录
部分基线轮次中还存在以下链路:
graphical.target └─network-online.target └─NetworkManager-wait-online.service └─NetworkManager.service
普通桌面登录通常只要求 NetworkManager 正常启动,不需要等待所有网络接口完成联网。
NetworkManager-wait-online.service在无线网络不可用、DHCP 较慢或虚拟网卡状态不稳定时可能产生较长等待,因此安全档会在确认桌面不依赖network-online.target后裁剪该等待单元。3.3 后台维护任务与桌面加载竞争资源
apt-daily*、kylin-source-update*、motd-news、dpkg-db-backup和e2scrub_all等 timer 不一定处在graphical.target的直接关键路径上,但可能在开机后集中触发,与 UKUI/GNOME 桌面组件竞争磁盘 I/O 和 CPU。这类任务主要影响“用户会话启动到桌面可用”阶段。优化方式是 mask 对应 timer,使其不在启动后自动触发。软件更新和维护能力本身没有被删除,但自动定时触发会保持关闭,直到执行还原;需要更新时应使用系统 GUI 更新器或人工运行相应维护命令。
3.4 当前硬件不存在但仍启动的服务
虚拟机通常没有指纹设备、真实硬件传感器或 CPU frequency 接口,但相关服务仍可能被默认启用。它们无法提供实际能力,只会产生探测、模块加载或超时等待。
项目通过
/dev、lsusb和/sys探测硬件,只在确认设备不存在时处理相应服务,避免把虚拟机策略直接套用到真实笔记本。4. 分层优化方案
所有候选项都在
scripts/auto-optimize.sh中以固定白名单维护,不会扫描系统后自行猜测和关闭未知服务。apt-daily.timer、apt-daily-upgrade.timer、kylin-source-update-*、timermanager.timer、motd-news.timer、dpkg-db-backup.timer、e2scrub_all.timerdnsmasq.serviceNetworkManager-wait-online.servicesamba-ad-dc.servicenvmf-autoconnect.service、nvmefc-boot-connections.servicebiometric-authentication.servicelm-sensors.serviceloadcpufreq.service、cpufrequtils.service/sys/devices/system/cpu/cpu0/cpufreq不存在bluetooth.service、ukui-bluetooth.service--aggressive且未探测到蓝牙时主实验只使用默认安全档,不使用
--aggressive。以下关键能力不在优化白名单中:5. 优化器的实现机制
5.1 参数与执行模式
auto-optimize.sh支持以下模式:--dry-run--aggressive--revertround_<N>/manifest.txt并逐项 unmask--help除
--dry-run外,应用和还原都要求 root 权限。脚本首先通过systemd-detect-virt获取虚拟化类型,再执行以下硬件探测:has_biometric:检查/dev、lsusb和/sys/class/fingerprint;has_cpufreq:检查 CPU 的 cpufreq sysfs 目录;has_bluetooth:检查/sys/class/bluetooth;has_sensors:检查 hwmon 设备名称是否属于真实温度或电压传感器。5.2 计划构建与跨发行版过滤
脚本使用
PLAN数组保存“单元名 + 原因”。Tier 1 和 Tier 2 先进入候选计划,Tier 3 只有在硬件探测不通过时才加入。执行每一项前,脚本调用
systemctl list-unit-files检查单元是否存在。不存在的 openKylin 特有单元会显示:这一机制使相同脚本可以在 Ubuntu 等发行版上运行,而不会因为缺少
kylin-source-update-*等单元而失败或创建无效配置。5.3 应用、审计和状态记录
对于存在且通过人工确认的单元,脚本执行以下操作:
enabled和active状态;optimizations/round_<N>/manifest.txt;optimizations/round_<N>/pre-state.txt;systemctl mask阻止其再次由依赖或 timer 自动启动;systemctl daemon-reload;systemd-analyze blame,用于审计和问题定位。脚本只使用 stop、mask 和 unmask,不删除 unit 文件,也不直接修改发行版提供的 systemd 配置文件。
5.4 还原机制
执行以下命令时:
脚本查找最新的
optimizations/round_<N>/manifest.txt,对其中每个单元执行systemctl unmask,然后执行daemon-reload。pre-state.txt保留优化前状态,供人工复核。还原后应重启并重新运行健康检查,确认服务由原有依赖关系正常拉起。6. 测量脚本的实现机制
measure-boot.sh是只读脚本,每次执行都会创建独立目录:脚本首先采集完整原始证据:
summary.txt:systemd 启动总览;blame.txt:各服务自身启动耗时;critical-chain.txt:默认启动目标关键依赖链;critical-chain-graphical.txt:图形目标关键依赖链;enabled-units.txt:当前启用的 unit 快照;boot-plot.svg:完整 systemd 启动时序图。随后解析
systemd-analyze输出,并通过journalctl -b -o short-monotonic获取本次启动中各事件的首次出现时间。6.1 UKUI 与 GNOME 自动适配
脚本运行时检查
gnome-shell:gnome-session、gnome-shell、Nautilus/DING 和 ibus/fcitx5 判断桌面可用;ukui-session、ukui-panel、Peony 和 fcitx5 判断桌面可用。greeter 检测同时兼容日志中的
greeter、lightdm和gdm标记;显示管理器健康检查兼容 LightDM、GDM/GDM3 和 SDDM。KDE、Xfce、Deepin 等其他桌面需要根据实际进程扩展 profile。6.2 桌面可用时间计算
脚本对每个桌面核心组件查找本次启动日志中的首次出现时间,并取最大值作为
DESKTOP_READY_MONO_S。这是因为只有最晚出现的核心组件也已经启动,才能认为桌面达到最小可用状态。随后计算:
最终将所有指标写入机器可读的
metrics.env,并将时间线与健康检查写入report.txt。6.3 功能健康检查
每轮测量都检查以下能力:
任何 optimized 轮次出现
[FAIL]时,都不能直接作为有效优化结果。应先执行还原、定位原因并重新测试。7. 对比、汇总和可视化实现
compare-boot.sh读取两个结果目录中的metrics.env,对每个指标计算:对于启动耗时指标,结果为负数表示优化后更快。该脚本适合查看单轮差异,但正式结论使用多轮中位数。
generate-test-assets.py不依赖第三方 Python 库,主要完成以下工作:test-results/**/metrics.env;raw_runs.csv;summary.md;generate-result-cards.py为每轮测试生成一张 SVG 卡片,并为 openKylin、Ubuntu 分别生成环境汇总卡片。卡片同时展示核心指标、时间线、阶段拆解和健康检查,便于在报告或答辩中直接使用。8. 为什么使用多轮中位数
虚拟机启动时间会受到宿主机 CPU 调度、磁盘缓存、后台任务和虚拟设备初始化影响。单轮数据可能出现明显长尾,因此项目采用以下规则:
这种方法可以降低偶发抖动对结论的影响,同时保留稳定性分析所需的原始数据。
9. 安全边界与适用限制
以下场景不得直接应用默认计划:
network-online.target完成;推荐执行流程:
10. 优化收益与实现之间的对应关系
本方案的核心不是“关闭尽可能多的服务”,而是只处理经过依赖分析确认的冗余等待、当前环境不适用的能力和与桌面加载竞争的后台任务,同时使用功能健康检查证明优化没有突破桌面系统的可用性边界。
迁移测试与量化分析材料
本项目在 openKylin 虚拟机和 Ubuntu Desktop 虚拟机上完成了优化方案验证,用来证明:
新增材料说明
docs/虚拟机测试执行清单.mddocs/迁移测试与量化分析.mdtest-results/openkylin/environment.txt、每个 run 的report.txt、component-health.txt、metrics.envtest-results/ubuntu/environment.txt、auto-optimize-dry-run.txt、每轮component-health.txttest-results/summary/summary.mdtest-results/summary/raw_runs.csvfigures/boot-analysis/critical_path_openkylin.svg、boot_sequence_openkylin.svg、test_results_summary.svgfigures/test-cards/*_run*_card.svg和openkylin_summary_card.svg、ubuntu_summary_card.svgscripts/generate-test-assets.pytest-results/**/metrics.env,刷新汇总表和核心分析图summary.md和figures/boot-analysis/scripts/generate-result-cards.pyfigures/test-cards/关键结论速览
openKylin VM 三轮中位数显示:
Ubuntu Desktop VM 迁移测试显示:性能基本持平,但优化器能安全运行,openKylin 特有项会自动跳过,优化后桌面、网络、DNS、输入法、声音等健康检查全部正常。这部分主要证明方案的迁移复用能力和安全边界。
如何刷新图表
如果重新跑了 VM 测试,把新的
metrics.env、report.txt、component-health.txt等结果放入test-results/<环境>/<阶段_runN>/后,运行:刷新汇总表和核心分析图:
刷新每轮测试卡片: