1. 从一台“半夜挂掉”的 ECS 说起
凌晨两点十七分,手机在床头柜上震了三下。我闭着眼摸到手机,屏幕亮得刺眼——监控群里运维同事甩了一张截图,一台跑了两年多的 ECS 实例 CPU 打满,业务接口 502,客户在群里已经开始刷屏。等我爬起来连上机器,top一看,一个日志切割脚本因为磁盘写满卡死,连带把整个应用拖垮了。从报警到定位,前后花了四十分钟,而这四十分钟里,业务是实打实停着的。
这种事干运维的谁没遇到过几次。问题不在于我们不会排查,而在于人不可能 24 小时盯着几十上百台机器。CPU、内存、磁盘、网络、进程、日志、端口、证书有效期……每一项都可能成为压垮骆驼的最后一根稻草,而人肉巡检的覆盖率和及时性,永远追不上故障发生的速度。
这就是我今天想聊的STAROps 主机智能巡检——给 ECS 请一个 24 小时在线的 AI 医生。它做的事情很朴素:把原本靠人定时登录、敲命令、看指标、翻日志的巡检工作,交给一套自动化的智能系统去跑,让机器自己发现异常、自己给出判断、自己把问题推到该看到的人面前。SysOM 是这套体系里负责系统可观测性的底层能力,AI 则是那个把海量指标翻译成“人话结论”的大脑。
这篇文章适合谁看?如果你手里管着几台到几百台 ECS,如果你被半夜告警折磨过,如果你想知道一套主机智能巡检到底该怎么搭、怎么用、坑在哪,那接下来的内容应该对你有用。我会从整体设计思路讲到具体实操,把参数、命令、判断逻辑都摊开说,尽量让你看完能直接抄作业。
2. 主机智能巡检到底在解决什么问题
2.1 传统巡检的三道坎:覆盖、时效、经验
先说清楚为什么需要“智能”巡检。传统主机巡检无非两种做法:一是人定时登录,敲一串命令看结果;二是写一堆脚本,定时跑完把结果发邮件。这两种方式我都用过,也都踩过坑。
第一道坎是覆盖率。一台机器要看的指标少说几十项,磁盘分区可能十几个,进程几百个,日志文件上千个。人肉巡检只能抽查,脚本巡检虽然能全量跑,但脚本本身写不全——你没想到的指标,它就不会报。
第二道坎是时效性。定时脚本通常半小时或一小时跑一次,故障发生在两次巡检之间,就只能等下一次。更麻烦的是,脚本跑出来的是一堆原始数字,CPU 85%、内存 92%、磁盘 78%,到底算不算问题?要不要处理?还得人来判断。
第三道坎是经验依赖。同样一个“磁盘使用率 90%”,老运维知道要看是哪个分区、增长趋势如何、有没有大文件在写;新手可能直接就慌了。巡检的价值不在于采集数据,而在于把数据翻译成结论,而这一步高度依赖人的经验。
2.2 智能巡检的定位:不是替代人,是把人从重复劳动里捞出来
STAROps 主机智能巡检的定位,我理解得很清楚:它不指望完全替代运维工程师,而是把“定时看指标、初步判断、分级告警”这些重复性、规则性强的工作自动化掉,把人的精力留给真正需要判断力的复杂故障。
具体来说,它要干三件事:
- 全量采集:把 ECS 上该看的指标都收上来,CPU、内存、磁盘、网络、进程、端口、系统负载、文件句柄、inode、日志关键字,一个不落。
- 智能判断:不是简单比阈值,而是结合基线、趋势、关联性做判断。比如磁盘 90% 但三天涨了 1%,和磁盘 90% 但一小时涨了 20%,严重程度完全不同。
- 分级触达:P0 级问题直接电话+短信,P1 级推群消息,P2 级进日报。让该被吵醒的人被吵醒,不该被吵醒的人睡个好觉。
2.3 为什么是 ECS + SysOM + AI 这个组合
有人会问,市面上监控工具那么多,为什么还要专门做主机智能巡检?我的体会是,通用监控工具擅长的是“指标采集+阈值告警”,但主机层面的很多问题,光看指标是看不出来的。
举个例子,一台机器 CPU 不高、内存不高、磁盘不满,但业务就是慢。通用监控一片绿,问题在哪?这时候就得看系统层面的东西:上下文切换次数、软中断分布、TCP 重传率、磁盘 IO await、进程 D 状态数量。这些指标 SysOM 这类系统可观测性工具采集得更细,而 AI 的价值在于把这些细粒度指标和业务表现关联起来,给出“可能是磁盘 IO 瓶颈导致”这样的结论。
ECS 是载体,SysOM 是眼睛,AI 是大脑,三者缺一不可。这也是为什么这套方案值得单独拿出来讲。
3. 核心架构拆解:数据怎么流、判断怎么做
3.1 采集层:Agent 轻量化是底线
巡检系统的第一道关是采集。我的原则很明确:Agent 必须轻。主机上跑的采集程序,CPU 占用超过 1%、内存超过 100MB,我就会重新考虑。原因很简单,巡检是为了保障业务,不能因为巡检本身把业务拖慢。
STAROps 的采集层通常采用 Agent 模式,部署在每台 ECS 上,负责采集以下几类数据:
| 数据类别 | 具体指标 | 采集频率 | 采集方式 |
|---|---|---|---|
| 基础资源 | CPU、内存、磁盘、网络 | 10s | 系统调用 |
| 系统状态 | 负载、进程数、句柄、inode | 30s | /proc 读取 |
| 进程明细 | Top N 进程资源占用 | 60s | ps/top 解析 |
| 端口服务 | 监听端口、连接数 | 60s | netstat/ss |
| 日志 | 错误关键字、异常堆栈 | 实时 | 文件 tail |
| 业务 | 自定义指标 | 按需 | 埋点上报 |
采集频率的设计有讲究。基础资源 10 秒一次,是为了抓住瞬时尖峰;进程和端口 60 秒一次,是因为这些变化相对慢,采太密浪费资源;日志实时采集,是因为错误往往转瞬即逝。
提示:Agent 的资源限制一定要在部署时就设好,用 cgroup 把 CPU 和内存卡死。我见过太多因为采集 Agent 自己跑飞导致主机负载飙升的案例,这个坑一定要提前堵上。
3.2 传输层:别让数据在传输上丢链子
采集上来的数据要传到分析端,这一步的稳定性直接决定巡检的可靠性。常见的坑有两个:一是网络抖动导致数据丢失,二是数据量太大把带宽打满。
我的做法是本地缓冲 + 批量上报。Agent 在本地维护一个环形缓冲区,网络断了就先存本地,恢复后补传;上报时按批次打包,避免高频小包把网络打满。同时给上报通道设置独立的限速,保证不会因为巡检数据影响业务流量。
3.3 分析层:规则引擎 + AI 模型双轨并行
分析层是整套系统的核心。我的设计思路是规则引擎兜底,AI 模型增强,两者不是替代关系,而是互补。
规则引擎负责处理那些确定性强的判断:磁盘超过 90% 告警、内存超过 95% 告警、端口不通告警、证书 7 天内到期告警。这些规则简单直接,响应快,不会误判。
AI 模型负责处理那些需要综合判断的场景:
- 趋势预测:基于历史数据预测磁盘何时写满、内存何时耗尽。
- 异常检测:识别偏离历史基线的指标,比如某台机器平时 CPU 20%,突然持续 60%,即使没到阈值也值得关注。
- 根因关联:把多个异常指标关联起来,推断可能的根因。比如 CPU 高 + 磁盘 await 高 + 进程 D 状态多,大概率是 IO 瓶颈。
- 日志聚类:把海量日志里的异常模式聚类,避免同类问题重复告警。
3.4 触达层:分级告警是门艺术
告警触达最忌讳的就是“狼来了”。如果什么鸡毛蒜皮都打电话,运维很快就会对告警麻木,真正的大故障反而被忽略。
我一般把告警分成三级:
- P0(紧急):业务不可用、核心指标严重超标、磁盘即将写满。触达方式:电话 + 短信 + 群消息。
- P1(重要):指标异常但业务未受影响、趋势恶化。触达方式:群消息 + 工单。
- P2(提示):轻微异常、需要关注但不紧急。触达方式:日报汇总。
分级的关键在于动态调整。同一台机器,白天 CPU 80% 可能正常,凌晨 80% 就值得警惕。所以分级规则要结合时间、业务属性、历史基线来定,不能一刀切。
4. 实操落地:从零搭一套主机智能巡检
4.1 环境准备与 Agent 部署
假设你手里有一批 ECS,操作系统以 CentOS 7/8 和 Ubuntu 20.04/22.04 为主。第一步是部署采集 Agent。
部署前先做两件事:一是确认每台机器的系统版本和内核版本,二是规划好 Agent 的安装路径和资源限制。我习惯把 Agent 装在/opt/starops-agent/下,用 systemd 管理,资源限制写在 unit 文件里。
# /etc/systemd/system/starops-agent.service [Unit] Description=STAROps Host Inspection Agent After=network.target [Service] Type=simple ExecStart=/opt/starops-agent/bin/agent --config /opt/starops-agent/conf/agent.yaml Restart=always RestartSec=5 CPUQuota=50% MemoryLimit=128M LimitNOFILE=65536 [Install] WantedBy=multi-user.targetCPUQuota=50%表示最多用半个核,MemoryLimit=128M把内存卡死。这两个参数是我踩过坑之后加的——早期版本没限制,Agent 在日志量大的机器上内存涨到 1G 多,把业务挤得没脾气。
Agent 配置文件里,采集项要按需开启。不是所有机器都需要采集全部指标,比如纯静态资源服务器就没必要采集进程明细。
# agent.yaml collectors: system: enabled: true interval: 10s process: enabled: true interval: 60s top_n: 20 port: enabled: true interval: 60s log: enabled: true paths: - /var/log/app/*.log keywords: - ERROR - Exception - OutOfMemory report: endpoint: https://starops.example.com/api/v1/report batch_size: 100 buffer_size: 10000 timeout: 10s4.2 巡检项配置:哪些指标必须看
巡检项配置是整套系统的灵魂。配少了漏报,配多了误报。我整理了一份经过实战检验的核心巡检项清单,按优先级排列:
第一优先级(必须配):
- CPU 使用率、负载(1/5/15 分钟)
- 内存使用率、Swap 使用率
- 磁盘使用率(每个分区)、inode 使用率
- 磁盘 IO await、util
- 网络进出流量、TCP 重传率
- 关键进程存活状态
- 关键端口监听状态
第二优先级(建议配):
- 进程数、文件句柄数
- 上下文切换次数
- 软中断分布
- 连接数(ESTABLISHED/TIME_WAIT)
- 日志错误关键字计数
第三优先级(按需配):
- 证书有效期
- 定时任务执行状态
- 自定义业务指标
配置阈值时,我强烈建议先观察一周再定阈值。新机器上线,先只采集不告警,跑一周拿到基线数据,再根据实际分布定阈值。上来就拍脑袋定 80%,大概率要么天天误报,要么真出问题不报。
4.3 AI 模型训练与调优
AI 模型这块,很多人以为要自己从零训练,其实没必要。主机巡检场景下,基于统计的异常检测 + 轻量机器学习就够用了,关键是特征工程和阈值调优。
我常用的做法是:
- 数据预处理:把采集到的时序数据按机器、按指标分组,做缺失值填充和异常值剔除。
- 基线建模:对每个指标,用过去 7 天的数据算出均值、标准差、分位数,形成动态基线。
- 异常判定:当前值偏离基线超过 3 个标准差,或者连续 N 个点呈单调趋势,就标记为异常。
- 关联分析:把同一时间窗口内的多个异常指标关联起来,用简单的规则或聚类算法推断根因。
这套方法不需要 GPU,普通服务器就能跑,效果在实战中足够用。真正需要大模型的地方是日志分析和自然语言结论生成——把一堆指标异常翻译成“这台机器磁盘 IO 压力大,建议检查是否有大文件写入”这样人话,这才是 AI 的价值所在。
4.4 告警规则与分级策略配置
告警规则配置我建议用 YAML 管理,方便版本控制和复用。下面是一个示例:
rules: - name: disk_usage_critical expr: disk.usage > 90 level: P0 duration: 5m message: "磁盘使用率超过90%,分区:{{.partition}},当前值:{{.value}}%" - name: disk_usage_trend expr: disk.usage.predict_24h > 95 level: P1 duration: 10m message: "磁盘预计24小时内写满,请提前处理" - name: cpu_high expr: cpu.usage > 85 level: P1 duration: 10m message: "CPU使用率持续偏高,当前值:{{.value}}%" - name: process_down expr: process.alive == 0 level: P0 duration: 1m message: "关键进程 {{.process}} 已退出"duration参数很关键,它表示“持续多久才告警”。CPU 瞬时冲到 90% 很常见,持续 10 分钟才值得告警。这个参数设太短会误报,设太长会漏报,需要根据业务特点调。
5. 实战案例:三次真实故障的巡检复盘
5.1 案例一:磁盘写满引发的连锁反应
回到开头那个凌晨的故障。事后复盘,其实巡检系统早就给出了信号,只是当时规则没配好。
故障前 6 小时,磁盘使用率从 75% 涨到 82%,巡检系统按 P2 级别记了日报,没人看。故障前 1 小时,涨到 91%,触发 P1 告警推群,但凌晨没人看群。故障发生时,磁盘 100%,应用写日志失败,进程卡死。
复盘后的改进:
- 增加趋势预测告警,磁盘按当前增速预计 12 小时内写满就升 P1,6 小时内写满升 P0。
- 增加日志文件增长监控,单个日志文件超过 1G 就告警。
- P1 告警在夜间自动升级为电话触达。
改进后同类问题再没发生过。这个案例告诉我,巡检的价值不在于发现已经发生的问题,而在于预测即将发生的问题。
5.2 案例二:内存泄漏的渐进式发现
第二台机器的问题更隐蔽。内存使用率从 40% 缓慢涨到 70%,花了整整两周。通用监控的阈值是 90%,一直没告警。但巡检系统的 AI 模型发现了异常——内存增长呈明显单调趋势,偏离历史基线。
系统给出结论:“内存使用率持续单调增长,疑似内存泄漏,建议检查应用内存分配。”运维介入后,定位到是一个缓存模块没有设置过期时间,导致内存只增不减。
这个案例说明,AI 异常检测能抓住那些“没到阈值但趋势不对”的问题,这是纯阈值告警做不到的。
5.3 案例三:端口不通的快速定位
第三个案例是端口问题。巡检系统发现某台机器 8080 端口监听状态异常,1 分钟内触发 P0 告警。运维登录一看,应用进程还在,但端口没监听——原来是应用启动时端口被占用,自动切换到了备用端口,但负载均衡配置没更新。
从告警到定位,5 分钟。如果没有巡检,这个问题可能要等用户反馈才发现。
6. 常见问题与排查技巧实录
6.1 Agent 采集不到数据怎么办
这是最常见的问题。排查思路按顺序来:
- 看 Agent 进程是否存活:
systemctl status starops-agent - 看 Agent 日志:
journalctl -u starops-agent -n 100 - 看采集配置是否生效:检查配置文件路径和权限
- 看上报通道是否通:
curl -v https://starops.example.com/api/v1/health - 看资源限制是否卡死:
systemctl show starops-agent | grep -i limit
我遇到最多的是配置文件权限问题。Agent 以非 root 用户运行,读不了/proc下某些文件,导致采集为空。解决办法是给 Agent 用户加必要的权限,或者用 capabilities 授权。
6.2 告警风暴怎么破
告警风暴的根源通常是关联性问题被拆成多个独立告警。比如一台机器磁盘满了,会同时触发磁盘告警、日志写入失败告警、应用异常告警、端口不通告警,一下子四条。
破解办法是告警聚合:同一台机器、同一时间窗口内的多个告警,合并成一条,标注根因。STAROps 里可以通过配置聚合规则实现:
aggregation: - name: host_level_aggregation group_by: [host_id] window: 5m max_alerts: 1 strategy: root_cause_firstroot_cause_first表示优先展示根因告警,其他作为关联信息附在后面。这样运维看到的是一条“磁盘写满导致应用异常”的告警,而不是四条孤立告警。
6.3 误报太多如何调优
误报是巡检系统最大的敌人。调优的核心是让阈值动起来。
静态阈值的问题在于,它不考虑业务周期。电商机器大促期间 CPU 80% 是正常的,平时 80% 就是异常。解决办法是引入动态基线:用过去 7 天同时段的数据算出基线,当前值偏离基线超过一定比例才告警。
另外,告警抑制也很重要。同一台机器同一指标,5 分钟内只告警一次;维护窗口内的机器,自动屏蔽告警。
6.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决办法 |
|---|---|---|---|
| Agent 无数据 | 进程挂了/配置错/权限不足 | 看进程、日志、配置 | 重启/修配置/加权限 |
| 告警延迟大 | 采集频率低/上报阻塞 | 看采集间隔、上报队列 | 调频率/加缓冲 |
| 误报频繁 | 阈值静态/基线不准 | 看历史数据分布 | 改动态基线 |
| 漏报严重 | 巡检项缺失/阈值过高 | 对照清单检查 | 补巡检项/降阈值 |
| 告警风暴 | 关联告警未聚合 | 看告警时间分布 | 配聚合规则 |
| 资源占用高 | Agent 未限流 | 看 Agent 资源占用 | 加 cgroup 限制 |
7. 我踩过的坑和几条实在建议
7.1 别一上来就追求全自动
我见过太多团队,一上来就想搞全自动巡检、自动修复。结果规则没调好,自动修复把正常服务给重启了。我的建议是分三步走:先只采集不告警,跑一周看数据;再开告警但只推群不打电话,跑两周调规则;最后才开分级触达和自动修复。每一步都要有回滚方案。
7.2 巡检项宁少勿滥
巡检项不是越多越好。每多一项,就多一份误报风险和维护成本。我的原则是:每一项巡检项都要能回答“发现异常后我该做什么”。如果答不上来,这项就不该配。比如“CPU 温度”这种指标,发现了异常你也没法处理,那就别配。
7.3 告警一定要有“下一步”
好的告警不只是告诉你“出问题了”,还要告诉你“该怎么办”。STAROps 的告警消息里,我要求必须包含三部分:现象描述、可能原因、建议操作。比如“磁盘使用率 92%,可能原因:日志文件增长过快,建议操作:检查 /var/log/app 目录下大文件”。这样即使是新手值班,也能快速处理。
7.4 定期复盘告警质量
我每个月会做一次告警复盘,统计这个月的告警里,有多少是真问题、多少是误报、多少是漏报。误报率超过 20% 就要调规则,漏报一次就要补巡检项。这个习惯坚持下来,巡检系统的准确率会越来越高。
7.5 别忘了巡检系统本身
巡检系统自己也是要巡检的。Agent 是否存活、上报是否正常、分析任务是否按时跑、告警通道是否通畅,这些都要有监控。我一般会用一个独立的轻量监控来盯巡检系统本身,避免“医生自己病了没人知道”。
8. 后续可以怎么扩展
这套主机智能巡检跑稳之后,能扩展的方向不少。往深了做,可以把巡检数据接到容量规划里,根据历史增长趋势预测什么时候该扩容;往宽了做,可以把巡检范围从 ECS 扩展到容器、数据库、中间件,形成统一的基础设施巡检体系。
我个人比较看好的一个方向是巡检结论的知识沉淀。每次故障处理完,把根因、处理过程、验证结果结构化存下来,下次遇到类似异常,AI 可以直接推荐历史处理方案。这相当于给团队建了一个不断生长的运维知识库,新人上手会快很多。
最后分享一个小技巧:巡检规则一定要用代码管理,别在界面上点。用 Git 管 YAML 配置文件,每次改规则都走 PR 评审,这样规则变更可追溯、可回滚,团队协作也顺畅。我吃过界面点规则的亏,改错了想回滚都找不到历史版本,只能凭记忆重配,那叫一个酸爽。