服务器监控不是装个面板看CPU,核心是“指标采集告警收敛故障定位”三层链路,先把这层逻辑打通,再谈工具。
服务器监控指标有哪些:先把该盯的东西列全
很多新手拿到一台服务器,第一件事就是装个宝塔看CPU和内存占用,觉得数字没飘红就等于健康,这个思路误区很大,业内专家指出,CPU和内存只是资源表象,真正决定服务能不能撑住的是连带关系磁盘满了日志写不进去、TCP连接数爆了导致队列堆积、慢查询把连接池拖垮,这些事故发生时CPU和内存往往都是正常的。
四层指标逐级拆解
- 硬件层:CPU使用率、内存使用率、磁盘空间与inode、磁盘读写延迟(iowait)、网络带宽与丢包率,单看某一项不够,要组合看。
- 系统层:负载均衡(load average)、进程数、上下文切换、TCP连接状态(尤其TIME_WAIT和CLOSE_WAIT数量)。
- 应用层:接口响应时间、QPS/TPS、错误率、JVM/Node/PHP进程的GC或内存占用。
- 业务层:订单有没有积压、队列消费有没有延迟、用户登录接口失败率,这层最容易被忽略,但业务方感知最强的恰恰是它。
举个例子,一台跑Nginx的服务器,前端页面白屏,你登上去看CPU和内存都正常,磁盘也还有20%余量,很容易误判为“服务器没问题”,但如果盯一下TCP连接数,会发现大量CLOSE_WAIT堆积,因为上游PHP-FPM处理完请求后没有正常关闭连接,连接被占满导致新请求全部卡住,这就是组合指标的重要性。
Linux系统监控工具推荐:从小命令到大平台
针对单台服务器,Linux自带的命令行工具足够应付日常排障,真正需要上平台的场景是“你手里有十台以上的机器,没法天天登录着看”。
本机指令三板斧
- top / htop:看即时负载,按P键按CPU排序,按M键按内存排序,注意观察进程状态,
R是运行中,D是不可中断睡眠(通常伴随IO阻塞)。 - iostat -x 1:重点看%util和await值。%util超过80%时,磁盘基本处于饱和状态。
- vmstat 1:看r(运行队列)、b(阻塞进程)、si和so(交换分区换入换出),si/so数值持续非零,说明物理内存已经不够用了,开始用swap硬抗。
集中监控平台怎么选
行业共识是,开源领域主推两条路线:Prometheus + Grafana,以及老牌坚实的 Zabbix,选型别追新,先看你的环境长什么样。
Prometheus和Zabbix哪个好用
这俩在社区里吵了很久,其实没有谁碾压谁,只有匹配不匹配,用一张表说清楚:
| 维度 | Prometheus | Zabbix |
|---|---|---|
| 数据模型 | 基于时间序列的指标存储,维度用标签(label)区分 | 基于key-value的传统模型,用模板管理 |
| 采集方式 | 主动拉取(Pull),客户端暴露端口即可 | 主动推送和被动拉取都支持,Agent需要安装 |
| 告警规则 | 通过PromQL写表达式,语法灵活但需要学习期 | 触发器表达式相对直观,模板多 |
| 适用规模 | 云原生、K8s、容器化环境是强项 | 传统机房、网络设备、服务器硬件类监控很稳 |
| 上手曲线 | 组件多,需要理解数据流 | 一套agent走天下,文档多,老运维习惯它 |
大多数新项目现在更偏爱Prometheus,因为它的生态和云原生天然适配,但如果你维护的是传统物理机、网络交换机、NAS存储这类设备,Zabbix的模板库能找到现成方案,减少自己折腾的功夫。
服务器监控工具价格:开源免费不等于不要钱
这里把账算清楚,Prometheus和Zabbix都是开源软件,授权费用为零,但你需要为此支付:
- 一台专用监控机:自建环境建议至少2核4G内存,云服务器目前的月成本在几十元到一百多元区间(地域不同价格差异明显,比如国内一线城市可用区比二线城市可用区同配置贵约20%)。
- 存储开销:监控指标的时序数据增长很快,默认保留15天也需要几十GB磁盘,建议单独挂一块数据盘。
- 维护时间:监控平台本身也是要升级、调优、处理故障的,这部分时间成本容易被新人低估。
如果不想自建,商业SaaS监控平台按月按节点数收费,一个节点的月费大概在几十元以内,适合只有三五台机器的小团队,买现成的报警通道和告警聚合,不用自己配短信和企微机器人。
服务器监控告警设置方法:让报警电话在深夜绝不乱响
很多团队的监控告警是失控的要么什么都报警,凌晨两三点被“磁盘使用率超过80%”的短信轰炸,真正出事时反而习惯性忽略;要么规则太安静,服务挂了半小时都没人知道。告警设计的核心不是多多益善,而是分优先级、去噪、可执行。
分三级告警梯队
- P0级(立即打电话):服务完全不可用、机器宕机重启、业务核心接口错误率达到阈值、数据盘写满,这类告警必须实时触达,配套电话或短信。
- P1级(工作时间内响应):CPU持续高负载超过10分钟、内存剩余低于20%、日志中出现大量ERROR堆栈,推到企业微信或钉钉群即可。
- P2级(观察即可):CPU瞬时飙高然后回落、单次请求超时、转发队列偶尔堆积,归入日报汇总,每周复盘一次,防止升级成长期隐患。
具体规则配置示例(以Prometheus为例)
比如要设置“CPU使用率超过90%持续5分钟”触发告警,PromQL可以写成:
avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) < 0.1
表示空闲占比低于10%时触发,这里建议不要用单次瞬时值做判定,搭配for: 5m参数让规则持续一段时间才进入Firing状态,能滤掉大部分瞬时抖动。
收敛噪音的实操技巧
- 同IP多实例合并:一台机器上挂了多个Java应用,只需要按实例维度发一条告警,不用每个进程都发。
- 静默期设置:凌晨3点到6点的P2级告警不推送,合并到早上统一出报告。
- 告警依赖关系:如果根因是数据库连不上,那么所有依赖数据库的接口告警应该自动抑制,只报数据库本身那条,这在Prometheus中用
inhibit_rules实现。
服务器内部健康检查:日志和探活比监控面板更灵敏
资源监控面板回答的是“机器活着吗”,但业务核心关心的是“服务能用吗”。主动探活和日志异常检测才是最后一公里。
接口探活三步法
- 第一步:写一个Shell或Python脚本,用
curl -s -o /dev/null -w "%{http_code}"定期请求业务核心接口(比如/healthz或/api/ping)。 - 第二步:判断HTTP状态码是否为200,同时校验返回体里新增的“version”字段是否等于预期值,为什么要校验字段?因为很多网关对未登录请求统一返回200空壳,状态码是通的,但业务模块已经挂了。
- 第三步:探活失败连续3次才告警,避免单次网络抖动触发误报。
日志监控的成熟方案
不必自己写正则硬啃日志,成熟路径是Filebeat采集 → Kafka缓冲 → Logstash过滤 → ES存储 → 在Kibana里设置告警阈值,中小团队嫌链路重,可以用简化替代方案:grep -c "ERROR" app.log,配合cron任务每分钟运行一次,超过阈值就调用告警脚本,有很多公司的核心业务系统就是这么跑的,简单、直接、不依赖外部组件。
别忘了监控机自己
给监控机设一道“自监控”很有必要,否则监控面板还没恢复,下一颗雷已经在深层埋好了,常见的坑是监控机磁盘被时序数据写满,Grafana先挂,所有图表失效,解决方式是用systemd timer持续检查监控机磁盘用量,超过90%就自动清理15天前的old data。
从零搭一套最小可用监控栈的七步走
适合还没上监控平台、刚接手服务器清单的团队参考,全程走Prometheus路线:
- 在监控机上下载并解压Prometheus二进制包,
wget后校验md5。 - 修改
prometheus.yml文件,在scrape_configs里添加目标节点,形式为- targets: ['192.168.1.10:9100']。 - 在被监控服务器上安装
node_exporter并用nohup或systemd启动,监听9100端口。 - 回到监控机执行
./promtool check config prometheus.yml做语法自检,然后重启服务。 - 浏览器访问
http://监控机IP:9090/targets,确认所有Target的State为UP。 - 安装Grafana并配置Prometheus数据源,导入ID为
8919的Node Exporter面板模板。 - 在Grafana的Alerting模块里写一条测试规则,验证企微机器人的Webhook收不收得到。
生产环境部署的进阶建议
整套链路都跑通后,可以参考这两条准则把它做得更抗造:
- 监控数据与业务数据物理隔离:别把时序数据库和业务数据库部署在同一台机上,磁盘争抢会导致监控指标本身不准确。
- 保留基础出网通道:如果监控机在云上,确保它的弹性IP不受防火墙变更连带影响,否则一改安全组,监控流量被切断后你就瞎了。
服务器监控常见问题解答
服务器监控系统可以监控哪些内容?
常规能覆盖CPU、内存、磁盘、网络、进程、端口、日志关键词、业务接口响应时间等,是否支持深度链路追踪(trace)取决于你选的工具和探针集成度,Prometheus配合SkyWalking或Jaeger可以做应用层调用链监控,Zabbix则侧重基础设施。先盘点服务器上跑的核心应用,再倒推监控项,比通用全量采集更实用。
已经有云平台自带监控告警,还需要自己搭一套吗?
云平台监控的定位是“基础设施兜底”,它能看到宿主机状态和虚拟机的宏观指标,但看不到进程内线程池的忙碌度、JVM垃圾回收的停顿耗时、或者某个Python脚本是否卡在等待下游响应。多一层自建应用监控,花的是时间成本,省的是出大故障后的抢救成本。
监控数据到底要保留多久?
取决于你的合规要求和排障窗口,常规做法是原始指标保留7到15天,聚合后的周级趋势数据保留半年,用于容量规划,存储成本高的场景可以只保留报警时的快照数据,原始时序数据直接丢弃。核心原则是:想回复旧问题,数据留够;想观察长趋势,只留聚合值。
监控这件事,前期把指标选准、捣鼓好第一批告警规则,之后日常维护的精力非常低,但反过来,如果不把采集、告警、日志探活做成闭环,那么工具安装得再多也无非是在手机上多装几个红点通知而已。真正能扛事的监控,是在故障到来前先用规则替你排了一轮雷。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/793811.html


