相同配置的服务器分别安装 ubuntu 26.04 和 centos 7.9 , cpu使用率分别是 67% 和 2.5%, 怎么回事?
核心结论
不是硬件差异,是 Ubuntu 26.04 默认自带的后台服务/守护进程在跑,CentOS7.9 minimal 默认几乎没有自动维护任务,Ubuntu 26.04 这个版本本身就有几个已知bug会导致空闲机器CPU持续高占用:unattended-upgrades、packagekitd、snapd、fwupd 是最高发元凶。
CentOS7 minimal 安装完:只保留最基础系统服务,自动更新默认关闭,没有 packagekit、snap、fwupd。空闲时CPU自然2%左右。Ubuntu 26.04 Server 默认:自动安全更新、snapd、fwupd固件更新、packagekitd包管理后台、motd系统信息采集 默认全部启用,会周期性甚至持续占用CPU。
第一步:先确认指标(最关键)
登录 Ubuntu 机器执行:
top
看第一行 %Cpu(s):区分 us 用户态 / sy 内核态 / wa IO等待。再按 P 按CPU排序,看是谁在吃CPU。
一键列出CPU占用TOP进程:
ps -eo pid,user,%cpu,cmd --sort=-%cpu | head -10
通过top后的结果 如下 :
320251 _mta-sts 20 0 214652 128544 76732 R 58.5 7.2 0:01.76 mta-sts-daemon
直接定位:mta-sts-daemon(postfix-mta-sts-resolver)
进程:
mta-sts-daemon,用户_mta-sts,CPU 58.5%,这就是你Ubuntu机器67%高占用的元凶!这是Postfix邮件MTA-STS策略解析守护进程,Python异步程序,用来给Postfix做SMTP TLS安全策略查询,自动后台拉取、缓存全网域名MTA-STS策略。CentOS7.9 minimal 默认不装 postfix-mta-sts-resolver,所以没有这个进程,空闲CPU只有2.5%。
为什么它会吃满CPU
这个程序有两个典型高CPU场景:
- proactive_policy_fetching 预拉取:后台并发批量爬取大量域名的MTA-STS HTTPS策略文件,并发开太高,疯狂做DNS+HTTP请求,事件循环卡死、CPU打满;
- 缓存/循环bug:sqlite缓存、uvloop事件循环异常,空转死循环,持续占用CPU。
它是邮件发送侧安全增强组件:服务器不对外发邮件,完全不需要这个服务。
第一步:临时停止,验证CPU下降
# 查看systemd服务名systemctl list-unit-files | grep mta-sts# 临时停止sudo systemctl stop mta-sts-daemon
停完立刻看top,CPU应该掉到2~5%,和CentOS对齐。
第二步:永久禁用(服务器不发邮件推荐)
sudo systemctl disable --now mta-sts-daemonsudo systemctl mask mta-sts-daemon
如果你确实需要Postfix发邮件,但不需要MTA-STS,可以:
- 注释Postfix配置
/etc/postfix/main.cf里smtp_tls_policy_maps指向mta-sts-daemon那一行- reload postfix:
systemctl reload postfix
如果你必须保留MTA-STS,改配置降CPU
配置文件默认 /etc/mta-sts-daemon.yml重点调这几个参数,降低并发:
proactive_policy_fetching:enabled: trueconcurrency_limit: 5 # 默认100,改成很小,比如5cache:type: internal # 优先用内存缓存,不要sqlite,减少锁竞争
改完重启:
sudo systemctl restart mta-sts-daemon
还可以加上启动参数 --disable-uvloop 规避uvloop的高CPUbug。
额外排查:看日志确认是不是大量域名轮询拉取
# 看日志journalctl -u mta-sts-daemon -f
日志里会大量出现 fetching policy for domain xxx,就是后台在疯狂轮询拉取策略。
补充
你这个Ubuntu镜像应该是预装了postfix+mta-sts-resolver的版本,而CentOS7 minimal是干净最小化安装,没有邮件组件,这就是两台机器CPU差异的根本原因。
检查清单
- 停掉 mta-sts-daemon,确认CPU回落
- 判断业务:不需要发邮件 → 直接mask禁用
- 需要发邮件但不需要MTA-STS:注释postfix smtp_tls_policy_maps
- 必须MTA-STS:降低 proactive_policy_fetching 并发
你可以执行 systemctl status mta-sts-daemon 把输出贴给我,我帮你确认unit状态。
关闭了
mta-sts-daemon
后,cpu直接降到 2%左右





















