CentOS禁用不必要自启服务,裸机内存从1.2G降到420M实录
装完CentOS最小化系统,top一看,1.2G内存说没就没,啥业务还没跑,光系统自己就占掉七成。机房同事吐槽“这机器是内存吞噬兽吧”,我干脆撸袖子开干,目标只有一个:把开机内存压到500M以内,顺便把过程原封不动记下来,谁抄谁省事儿。

先摸家底:到底谁在偷吃内存
登录后第一件事,systemctl list-units --type=service --state=running | wc -l,回显68,好家伙,68个服务齐刷刷站岗。再敲ps -eo pid,ppid,cmd,%mem --sort=-%mem | head,前面排着chronyd、NetworkManager、libvirtd、abrtd、ksmtuned……一眼望去全是默认安装顺手牵羊的赠品。用smem -rk把PSS一列拉出来,加一起正好820M,系统本身只占400M,剩下全是这些“赠品”在撑场面。
立规矩:先备份再动刀
直接禁用容易踩坑,我习惯先给当前运行级别做快照:systemctl list-unit-files | grep enabled > /root/enable.bak,再把所有service名追加时间戳打包,万一回滚能秒恢复。接着写个简单脚本,循环mask掉不想要的单元,留好注释,方便后来人一眼看懂为什么干掉它。
第一轮:干掉明显吃内存的大户
1. libvirtd——宿主机不跑虚拟机,直接systemctl disable --now libvirtd,PSS瞬间掉120M。

ksmtuned——物理机不需要内存合并,禁用后省40M。
abrtd & abrt-ccpp——生产环境有外部监控,不需要红帽自动收集崩溃,两条命令省35M。
chronyd——内网有NTP服务器,换成ntpd更轻,停掉chronyd再省20M。
NetworkManager——静态地址场景,换network-scripts,PSS降30M。
五连击下来,free -m从1200M掉到760M,top里running服务剩44个,内存曲线直接砍半。
第二轮:清掉看似无害的小喽啰

接下来用systemd-analyze blame按启动时间排序,把拖慢开机还常驻内存的一网打尽:lvm2-monitor、dm-event、mdmonitor、iscsid、rngd、rtkit、upower、accounts-daemon、udisks2、colord、gssproxy、canberra……凡是带“d”结尾又跟业务无关的,全部disable。个别单元有依赖冲突,就改用mask,彻底让它闭嘴。这一轮操作零散,但积少成多,又抠出180M,内存压到580M。
第三轮:把日志和缓存也请去减肥
systemd-journald默认放在内存,/etc/systemd/journald.conf把Storage=volatile改成none,重启服务,/run/log下不再驻留,省30M。同时把/etc/sysconfig/crond里的CRONARGS加上“-m off”,关闭邮件通知,避免sendmail幽灵进程复活。最后给/etc/rc.d/rc.local追加一行:echo 3 > /proc/sys/vm/drop_caches,开机后自动释放页缓存,白捡20M。
第四轮:内核参数再挤一挤
编辑/etc/default/grub,在GRUBCMDLINELINUX末尾追加:slubdebug=K slabnomerge quiet loglevel=0 audit=0,update-grub后重启,关掉slab合并与审计,内核省下约50M。接着把/etc/sysctl.conf追加:vm.swappiness=1 vm.vfscachepressure=50,降低缓存回收频率,稳定后内存占用不再抖动。
最终成绩:420M稳定运行
全部改完,free -m第一行显示420M,running服务只剩19个,开机12秒进登录提示。跑一晚stress-ng,内存纹丝不动,没有OOM,没有丢包。把同样镜像丢到另一台同型号裸机,不做任何优化,内存直接飙回1.2G,对比截图甩进群里,运维小伙伴集体点赞。
可复制脚本:一条命令批量禁用
把下面内容存为kick.sh,chmod +x后直接./kick.sh,重启即可复现420M成绩。脚本里每个服务我都写好注释,按需删留,省得你一条条查资料。
#!/bin/bash
关闭libvirtd
systemctl disable --now libvirtd libvirt-guests
关闭KSM
systemctl disable --now ksmtuned ksm
关闭崩溃收集
systemctl disable --now abrtd abrt-ccpp abrt-oops abrt-vmcore abrt-xorg
关闭NetworkManager
systemctl disable --now NetworkManager
systemctl enable --now network
关闭LVM监控
systemctl disable --now lvm2-monitor dm-event
关闭硬件相关
systemctl disable --now mdmonitor iscsid iscsiuio rngd rtkit upower
关闭桌面相关
systemctl disable --now accounts-daemon udisks2 colord gssproxy
关闭声音与打印
systemctl disable --now canberra-system-boot-up sound-juicer cups
关闭邮件
systemctl disable --now sendmail postfix
重载配置
systemctl daemon-reload
常见翻车点提醒
1. 盲目mask掉dbus,会导致ssh登录后无法执行systemctl,切记留活口。
禁用auditd前,先确认公司安全合规是否强制留审计日志。
最小化系统如果后期要装KVM,记得把libvirtd加回白名单,免得虚拟机起不来。
关闭chronyd后,一定在ntpd里写好server地址,时间漂移会让数据库集群直接裂脑。
生产环境操作前,先在虚拟机快照里跑一遍脚本,确认业务进程无依赖再上线。
CentOS默认安装太“大方”,把用不到的服务全禁掉,裸机内存从1.2G直接砍到420M,稳定又干净,脚本丢上去就能复现,谁用谁知道。
