
服务启动过多会显著拖慢Linux系统启动速度,因systemd并行拉起enabled服务导致fork开销、I/O与CPU竞争加剧,尤其在低配设备上启动时间可从3秒延至15秒以上。
Linux 系统启动时,systemd 会按依赖关系并行拉起所有 enabled 的服务。服务越多,初始化阶段的 fork 开销、磁盘 I/O(读取 unit 文件、日志目录、配置)、CPU 调度竞争就越明显。尤其在机械硬盘或低配 VPS 上,启动时间可能从 3 秒拖到 15 秒以上。
实操建议:
systemctl list-unit-files --state=enabled 查看当前启用的服务,重点关注非必要项(如 bluetooth.service、avahi-daemon.service、ModemManager.service)
systemctl cat 看描述,systemctl status 看是否正在运行且被其他服务依赖sudo systemctl disable --now ,--now 同时停止运行中实例,避免残留进程很多服务(比如 dockerd、mongod、postgresql)启动后常驻后台,即使空闲也会占用几十 MB 内存;而像 rsyslog 或 systemd-journald 这类日志服务,在高日志量场景下 CPU 占用可突增至 20%+。
关键点:
systemd 默认不回收服务的内存,除非显式配置 MemoryLimit= 或使用 Scope 隔离(较复杂,一般不用)NetworkManager-wait-online.service)虽不占资源,但会阻塞其他服务启动,属于“隐性性能瓶颈”systemd-analyze blame 可排序各服务启动耗时,用 systemd-analyze critical-chain 查看关键路径上的长尾服务多个服务默认监听相同端口(如 sshd 和 dropbear 都想占 22),或同时写入同一日志文件(如多个应用直写 /var/log/app.log),会导致启动失败或运行时异常。
典型现象包括:
Failed to start XYZ service: Address already in useUnit XYZ.service entered failed state,但 journalctl -u XYZ 显示 “Permission denied” 或 “Device or resource busy”排查优先级:先 ss -tulpn | grep : 看端口占用,再 lsof +D /var/log 检查日志目录锁,最后检查 /etc/systemd/system/ 中是否有冲突的 ExecStart 覆盖
systemd 是单进程管理器,它要为每个服务维护状态、定时器、cgroup、socket 激活规则等元数据。当启用服务超过 200 个(常见于桌面发行版或容器宿主机),systemd 的内存占用可达 80–120 MB,且 systemctl list-units 响应明显变慢。
这不是 bug,而是设计使然——每个 .service 文件解析后都会生成一个 Unit 对象,长期驻留内存。所以删掉不用的 .service 文件(不只是 disable)能减少基础开销:
/etc/systemd/system/,卸载却不清理,这类文件必须手动 rm
/usr/lib/systemd/system/ 下的原始 unit 一般不要动,改用 systemctl mask 彻底屏蔽(创建指向 /dev/null 的符号链接)sshd、systemd-journald、chronyd、networking(或 systemd-networkd)等核心服务真正影响性能的往往不是“某个服务重”,而是“一堆服务一起醒”。别只盯着 top 里排第一的进程,systemd-analyze plot > boot.svg 导出的启动时序图,常能一眼看出哪几个服务在抢资源。