← 返回列表

精简 systemd 服务以节省内存

运维2026-08-30 · 约 5 分钟

手上几台 1G 内存的小机器,跑着 Nginx 和一个代理进程,可用内存总在 500M 上下徘徊。花半小时把用不上的系统服务关掉,省出了 60 多 M,还顺带减少了攻击面。

先看谁在吃内存

for s in $(systemctl list-units --type=service --state=running \
           --no-legend | awk "{print \$1}"); do
  printf "%-30s %s\n" "$s" "$(systemctl show -p MemoryCurrent $s | cut -d= -f2)"
done

这样能直接按服务看实际占用,比 ps aux 按进程看更清楚 —— 特别是那些 fork 出多个子进程的服务。

这台机器上关掉的

合计约 84MB,实际释放后 free 里多了 60MB 左右(有一部分是共享库,不完全线性)。

怎么关才不会翻车

systemctl stop    <服务>
systemctl disable <服务>
systemctl mask    <服务>

三步缺一不可。disable 只是取消开机自启,但被其它服务依赖拉起时还会启动;mask 是把它彻底变成不可启动状态,这才是真正的关掉。

哪些绝对不能动

云主机上有两个特别容易误伤的:

另外 acpid 在云主机上也建议留着,处理电源事件(虽然实际用到的次数很少)。

顺手调两个 sysctl

vm.swappiness = 10
vm.vfs_cache_pressure = 50

小内存机器上把 swappiness 从默认 60 降到 10,能明显减少无谓的换出。代价是内存压力大时更容易触发 OOM,所以还要看具体负载。

真正对跨境链路帮助最大的是 BBR:

net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

开了之后同样的线路,下载吞吐大概提升 20%~40%,因链路质量而异。

结果

内存从 319MiB 降到约 255MiB,服务数从 23 个降到 16 个。改动都做了文件备份,随时能回滚。