Margrop
Articles388
Tags773
Categories7

Categories

1password 2K 3.6 Flash 30s timeout 4-bit 量化 6-DoF SLAM AC ACL ACL 切换 ACP AI AI Agent AI Coding Assistant AI Tech AI tutor AI 安全 AI 日记 AI编程助手 AI辅助 AI辅助编程 AP API ARC-AGI-3 ASR Agent Agent Harness Agent 入侵 Agent 检索 Agent 沙箱 Agent 系统 Agent 路由 AgentPlan Agentic AI Agentic tools Ai2 Alertmanager AllenAI Android 17 Antigravity AppDaemon AppWorld Aqara Attention Baseten Blog CC-Switch CI/CD CLI Tools CLI 工具 CLI工具 CPU 推理 CSRF Cache Hit Rate Caddy Categories 404 Claude Code Claude Sonnet ClawLoader Cloudflare Code Interpreter Codex Coding Plan Coding Plan Dashboard ComfyUI Computer Use Context Compression Cookie 认证 Cosmos-H-Dreams Cost Optimization Cron D1 DFIR Date DeepSeek V4 Flash Diagrams.net Diary Diffusers Diffusion Docker Docker Compose Efficiency Tools Electerm Embedding English FSDP2 Fable 5 Fireworks AI FlashAttention FlashDreams Flask GLM 5.2 GLM-5.2 GPT-4.1 GPT-5.6 GPT-Live GPT-Red GPU 加速 GPU 性能分析 Gateway Gemini Gemini 3.5 Flash Gemini API Gemini CLI Gemini Omni Flash Gemma 4 12B GitHub GitHub Actions GitHub PR Google Google AI Grabette Gripette HA HADashboard Hailuo Hermes HermesAgent Hexo HomeAssistant Hugging Face Hugo IBM Research IP IPv4 Inference Providers Isaac Lab Java KV cache Kimi Code Kimi K3 Kubernetes LFM2.5 LLM Router LVM‑Thin LeRobot Linux Liquid AI Live Translate LoRA MCP MacOS Managed Agents Markdown Memory 上限 Microsoft 365 Copilot MiniMax Model Routing MuJoCo Warp Multi-Agent MySQL NAS NVIDIA NeMo Automodel Nemotron 3 Embed NewAPI Newton Nginx Node-RED Node.js Nunchaku OOM OlmoEarth On-device AI Open Source Open Viking OpenAI OpenAI 兼容 OpenClaw OpenCode OpenResty OpenWrt PII 检测 PPPoE Physical AI Pollen Robotics Portainer PostgreSQL ProcessOn Prometheus Prompt Injection Proxmox VE PyTorch Qwen3-VL RPC RTEB Real-Time Inference Red Teaming Responses API Restart SIGTERM SNAP SOCKS5 SOCKS5 代理 SPED SSL SVDQuant Scientific Computing Self-Forcing Distillation Session Shell Skill 管理 Subagent Surgical Robotics Synology NAS TTS TimeMachine TutorMoments UML Uptime Kuma VPN VPS VoiceEQ WARP Web WebRTC WebSocket Windows Workers World Foundation Model activate ad adb adblock agent aligenie aliyun alpine annotation aop authy autofs backup baidupan bash bg-review bitwarden boot brew browser budget control caddy2 cc-switch-cli cdn centos cert certbot charles chat chrome classloader client clone closures cloudflare cmd command commit conn_id container cron 排错 crontab cross_sync ctyun ddsm demo dependency deploy developer devtools disconnect topic dll dns docker domain download draw drawio dsm dump dylib easytier edge environment hooks exception exit code 1 export fail2ban feign firewall-cmd flow fork free tier frp frpc frps fuckgfw full-duplex function fuzzy match gateway gcc gfw git github golang gperftools gridea grub gvt-g hacs havcs heap hello hexo hibernate hidpi hoisting homeassistant hosts html htmlparser https huggingface_hub iKuai iMessage idea image img img2kvm immortalwrt import index install intel io ios ip iptables iptv ipv6 iso java javascript jetbrains jni jnilib jpa js json jsonb jupter jupyterlab jvm k8s keepalive keepalive ping timeout kernel key kid kms kodi koolproxy koolproxyr kvm lan lastpass launchctl learning lede letsencrypt linux live low-code lvm lxc m3u8 mac macos mariadb markdown maven md5 mdadm memory 上限 microcode mirror modem modules monitor mount mstsc mysql n2n n5105 nas network newapi nfs no close frame node node-red nodejs nohup notepad++ npm nssm ntp one-api 容器 oop openfeign openssl openviking os otp ovz p14 packet capture pat pdf pem perf ping pip plugin png powerbutton print pro productive struggle proxy pve pvekclean python qcow2 qemu qemu-guest-agent rar reboot reflog remote remote desktop renew repo resize retina root route router rule rules runtime safari sata scaffolding scheduled triggers scipy-notebook scoping scp self-play server serverless inference silent test simulated student skill_manage slmgr so socks source spk spring springboot springfox ssh ssl stash string supernode support svg svn swagger sync synology systemctl systemd tap tap-windows tapwindows telecom template terminal tls tmux token totp tvbox txt ubuntu udisk ui undertow uninstall unlocker upgrade url v2ray vLLM vhd viking_search vim vlmcsd vm vmdk web websocket wechat windows with worker wow xiaoya xml yum zip 上下文压缩 个人品牌 中国电信 临时关权限 临时提权 云电脑 交换机 人才争夺 人机协作 代理 企业 AI 优化 体检 供应链 值班 健康检查 光猫 公众号 公网IP 内存 内存优化 内容发布 内网 内网IP 内网渗透 写作 分布式推理 分布式训练 升级 协作 协作习惯 协议层 协议转换 单平台型异常 博客 博客同步 博客改名 博客运维 卫星影像 反向代理 反诉 变更审计 可靠性 后台 Review 启动 告警 告警优化 周一 周一傍晚 周一焦虑 周三傍晚 周五 周六 周四傍晚 周四晚 周报 周日 周末 回滚 地球观测 地理空间推理 复盘评测 夏令时 多 agent 工具链 多协议并发 多智能体 多模态 多节点 多节点管理 多通道并发 大厂人才战 大模型评测 天猫精灵 天翼云 失败模式 字体大小 安全 安全事件 安全意识 安装 定时任务 实时语音 客户端 SDK 容器 容器网络 导入 小米 工作感悟 工具审计 工具白名单 工具调用 工具调用拦截 工程团队 工程实践 工程笔记 常用软件 并发窗口 广告屏蔽 序列号 应用市场 开放 API 开权重 开源模型 开源项目 异常 异步任务 异步委派 微信 微信公众号 微信限流 心智成长 心跳 心跳检查 性能优化 感悟 成本控制 打工 打工人 打工人日记 扩散模型 技术 抓包 按 provider 优先级 排查 排障思路 推理加速 描述文件 提示词敏感性 故障 故障恢复 故障排查 效率 效率工具 教育数据开源 教育评测 数据 文本编码器 旁路由 无服务器 日志排查 日记 时区 时段权限 显卡虚拟化 智能体集成 智能家居 智能音箱 服务器 服务管理 本地安装 机器人仿真 机器人数据采集 权限管理 架构 框架级切片 梯子 模块 模型推理 模型路由 残存访问 治理层 流式推理 流程 流程图 浏览器 漫游 激活 火山引擎 火绒 灾难恢复 焦虑 独立仓库 玄学 生活 电信 画图 监控 监控系统 监管 直播源 直觉 磁盘 磁盘故障 稀疏样本 稀疏注意力 立体声 端口 端口冲突 端口扫描 管理 续期 网关 网络 网络风暴 群晖 群晖 NAS 脚本 脚本优化 腾讯 自动化 自动化反思 自动化运维 自动恢复 自动攻击 自动重启 自动重连 自托管 LLM 网关 苹果 虚拟机 视频生成 认证 证书 评测基准 评测方法学 诉讼 语雀 语音 AI 质量检查 超时 跨平台 路由 路由器 软件管家 软路由 运维 运维日常 运维监控 进程生命周期 连接保活 连接问题 通信机制 通知 邮件漏发 部署 配置 钉钉 钉钉断开 镜像 镜像源 长上下文 长连接 门窗传感器 问题排查 防火墙 阿里云 阿里源 集客 需求变更 飞书

Hitokoto

Archive

Prometheus 抓取间隔设置与告警延迟优化:如何平衡资源消耗与监控实时性

Prometheus 抓取间隔设置与告警延迟优化:如何平衡资源消耗与监控实时性

前言

监控系统是运维工作的眼睛。如果监控不给力,就像在黑暗里走路——你不知道哪里会踩坑,什么时候会掉队。

Prometheus 是目前最流行的开源监控方案之一,很多公司都在用。但在实际使用中,有一个问题经常被忽视:抓取间隔(scrape_interval)应该设置多少合适?

抓取间隔太短,Prometheus 压力太大,资源消耗严重。
抓取间隔太长,告警延迟太高,问题发现不及时。

本文将详细讨论 Prometheus 抓取间隔的设置原则,以及如何根据不同场景优化告警延迟。

问题背景

典型的监控架构

在一个典型的微服务架构中,监控系统通常是这样的:

1
2
3
4
[应用服务] --> [Prometheus 抓取] --> [时序数据库] --> [Grafana 可视化]
|
v
[AlertManager] --> [告警通知]

Prometheus 定期从各个目标服务抓取指标,存入自己的时序数据库。然后根据配置好的告警规则,检测是否需要触发告警。

这里有几个关键参数:

  1. scrape_interval:抓取间隔,默认 15 秒
  2. evaluation_interval:告警规则评估间隔,默认 15 秒
  3. scrape_timeout:抓取超时时间,默认 10 秒

监控的”不可能三角”

在监控系统中,存在一个”不可能三角”:

1
2
3
4
5
6
      实时性
/\
/ \
/ \
/______\
成本低 准确率高
  • 实时性高 + 准确率高 = 资源消耗大
  • 实时性高 + 资源消耗少 = 准确率低
  • 资源消耗少 + 准确率高 = 实时性低

没有完美的方案,只有适合的权衡。

抓取间隔的设置原则

默认值 15s 够用吗?

对于大多数场景,15 秒的抓取间隔是够用的。

15 秒意味着每分钟有 4 个数据点,对于大部分指标来说已经足够观察趋势了。而且 15 秒的间隔对被监控服务的影响也比较小。

但有些场景,15 秒可能不够:

  1. 快速变化的核心指标:比如 QPS、延迟分布,需要更细的粒度
  2. 需要快速发现问题的业务:比如支付链路、订单系统
  3. 对延迟敏感的场景:比如实时大屏、SLA 监控

抓取间隔设置参考

根据实际经验,给出以下参考:

场景 建议间隔 说明
普通业务服务 15s 默认够用
核心业务/关键路径 5s-10s 更快的发现问题
基础设施/系统指标 30s-60s 变化慢,不需要太频繁
测试/开发环境 60s+ 降低资源消耗
高频交易/实时系统 1s-5s 几乎实时监控

分层监控策略

更好的做法是采用分层监控策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
第一层:基础设施监控(间隔 60s)
- CPU、内存、磁盘、网络
- 变化慢,不需要频繁抓取

第二层:服务健康监控(间隔 15s)
- 服务存活、请求成功率
- 常规告警使用这个层

第三层:业务指标监控(间隔 5s-15s)
- QPS、延迟、错误率
- 关键业务使用这个层

第四层:核心链路监控(间隔 1s-5s)
- 支付、订单等核心链路
- 最高优先级,最短间隔

这种分层策略的好处是:资源消耗与业务重要性匹配,既保证了关键业务的监控质量,又不会给系统带来过大压力。

告警延迟的优化

告警延迟是怎么产生的?

告警从发生到收到通知,延迟主要来自以下几个环节:

1
2
问题发生 --> 等待抓取 --> Prometheus 评估 --> Alertmanager 发送 --> 收到通知
(max scrape_interval) (evaluation_interval)

假设配置是 scrape_interval=15s,evaluation_interval=15s:

  • 最坏情况下,延迟可能是 15s + 15s = 30s
  • 平均延迟大概是 15s + 15s / 2 = 22.5s

如果改成 scrape_interval=5s,evaluation_interval=5s:

  • 最坏情况下,延迟变成 5s + 5s = 10s
  • 平均延迟变成 5s + 5s / 2 = 7.5s

所以,想降低告警延迟,最直接的办法就是缩短抓取间隔和评估间隔

评估间隔的调整

evaluation_interval 控制 Prometheus 多久评估一次告警规则。

1
2
3
4
# prometheus.yml
global:
scrape_interval: 15s # 抓取间隔
evaluation_interval: 15s # 告警规则评估间隔

注意:evaluation_interval 应该跟 scrape_interval 保持一致,或者略大于 scrape_interval。如果你抓取间隔是 5s,评估间隔是 60s,那告警延迟至少是 60s,这就失去实时性了。

告警规则本身的优化

除了调整抓取间隔,告警规则本身的写法也会影响延迟。

不好的写法:

1
2
3
4
5
6
- alert: HighErrorRate
expr: |
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m])) > 0.05
for: 0m

这个规则使用了 5 分钟的 rate 查询,天然就有 5 分钟的”预热”时间,告警会滞后至少 5 分钟。

优化的写法:

1
2
3
4
5
6
- alert: HighErrorRate
expr: |
sum(rate(http_requests_total{status=~"5.."}[1m]))
/
sum(rate(http_requests_total[1m])) > 0.05
for: 1m

[5m] 改成 [1m],预热时间从 5 分钟降到 1 分钟。

使用 recording rules 减少计算延迟

对于复杂的告警规则,可以使用 recording rules 预计算:

1
2
3
4
5
6
7
8
9
10
11
# 预先计算好错误率
- record: job:http_error_rate:1m
expr: |
sum(rate(http_requests_total{status=~"5.."}[1m]))
/
sum(rate(http_requests_total[1m]))

# 告警规则使用预计算结果
- alert: HighErrorRate
expr: job:http_error_rate:1m > 0.05
for: 1m

这样做的好处是:

  1. 告警评估时不需要再计算复杂的 rate 表达式
  2. 减少了 Prometheus 的计算压力
  3. 可以使用更短的 rate 窗口(如 30s),进一步降低延迟

资源消耗的权衡

抓取间隔与资源消耗

抓取间隔越短,Prometheus 需要处理的指标数据越多,资源消耗越大。

具体影响:

抓取间隔 指标数量(假设 100 个目标) 存储增长 CPU 消耗
15s ~500,000 个时序 基准 基准
5s ~1,500,000 个时序 3x ~2.5x
1s ~7,500,000 个时序 15x ~10x

可以看到,1s 抓取的资源消耗是 15s 的 10 倍以上,需要谨慎使用。

合理的采样策略

对于不需要高频监控的指标,可以使用合理的采样策略:

1
2
3
4
5
6
7
8
9
10
11
# 对于 CPU、内存等缓慢变化的指标,抓取间隔可以设长一些
- job_name: 'node'
scrape_interval: 60s
static_configs:
- targets: ['localhost:9100']

# 对于 QPS、延迟等需要细粒度的指标,抓取间隔设短一些
- job_name: 'api'
scrape_interval: 5s
static_configs:
- targets: ['localhost:8080']

标签基数控制

抓取间隔只是资源消耗的一个方面。标签基数(label cardinality)也会严重影响 Prometheus 的性能和存储。

1
2
3
4
5
6
7
8
9
10
# 不好的写法:标签值太多
- job_name: 'request'
metrics_path: /metrics
static_configs:
- targets: ['localhost:8080']
labels:
service: api
method: GET
path: /users/{user_id} # user_id 有几百万个值
status: 200
1
2
3
4
5
6
7
# 好的写法:避免高基数的标签
- job_name: 'request'
metrics_path: /metrics
static_configs:
- targets: ['localhost:8080']
labels:
service: api

高基数的标签(如 user_id、request_id)会导致时序数量爆炸,严重影响 Prometheus 性能。

实际配置示例

生产环境推荐配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# prometheus.yml

global:
# 默认抓取间隔:15s
scrape_interval: 15s
evaluation_interval: 15s

# 存储配置:保留 30 天
retention: 30d

scrape_configs:
# 基础设施监控:间隔 60s
- job_name: 'node'
scrape_interval: 60s
static_configs:
- targets: ['node-exporter:9100']
relabel_configs:
- source_labels: [__address__]
target_label: instance

# 服务健康监控:间隔 15s
- job_name: 'service'
scrape_interval: 15s
static_configs:
- targets: ['service-monitor:8080']
metric_relabel_configs:
# 移除高基数标签
- source_labels: [user_id]
action: labeldrop

# 核心业务监控:间隔 5s
- job_name: 'core-business'
scrape_interval: 5s
static_configs:
- targets: ['core-api:8080']
alertmanager_config:
- alert_relabel_configs:
- target_label: severity
replacement: critical

告警规则优化示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# rules/service.yml

# 预计算 recording rules
groups:
- name: service_recording_rules
interval: 5s
rules:
# 1 分钟窗口的请求率
- record: service:request_rate:1m
expr: |
sum(rate(http_requests_total[1m])) by (job, service)

# 1 分钟窗口的错误率
- record: service:error_rate:1m
expr: |
sum(rate(http_requests_total{status=~"5.."}[1m])) by (job, service)
/
sum(rate(http_requests_total[1m])) by (job, service)

# 1 分钟窗口的延迟 P99
- record: service:latency_p99:1m
expr: |
histogram_quantile(0.99,
sum(rate(http_request_duration_seconds_bucket[1m])) by (job, service, le)
)

# 告警规则
- name: service_alerts
interval: 5s
rules:
# 错误率告警:阈值 1%,持续 1 分钟
- alert: ServiceHighErrorRate
expr: service:error_rate:1m > 0.01
for: 1m
labels:
severity: critical
annotations:
summary: "服务 {{ $labels.service }} 错误率过高"
description: "错误率 {{ $value | humanizePercentage }} 超过 1%,持续 1 分钟"

# 延迟告警:P99 超过 500ms,持续 2 分钟
- alert: ServiceHighLatency
expr: service:latency_p99:1m > 0.5
for: 2m
labels:
severity: warning
annotations:
summary: "服务 {{ $labels.service }} 延迟过高"
description: "P99 延迟 {{ $value }}s 超过 500ms,持续 2 分钟"

常见问题与解决方案

Q:抓取间隔设多少合适?

A:根据业务场景决定。普通业务 15s 够用,核心业务 5s-10s,基础设施 30s-60s。关键是分层策略,不同类型的指标用不同的间隔。

Q:告警延迟太高怎么办?

A:首先检查 scrape_interval 和 evaluation_interval 是否匹配。然后检查告警规则中的 rate 窗口是否太大,可以改用 recording rules 预计算。最后考虑将核心业务的抓取间隔设短。

Q:Prometheus 资源消耗过高怎么办?

A:优先检查标签基数是否过高(特别是 user_id、request_id 这类高基数标签)。然后考虑分层监控,将非关键指标的抓取间隔设长。最后考虑横向扩展,部署多个 Prometheus 实例分流。

Q:如何平衡监控质量与资源消耗?

A:采用分层监控策略,核心业务用短间隔,非核心业务用长间隔。使用 recording rules 预计算复杂指标,减少实时计算压力。定期审查指标和告警规则,删除无用的监控项。

Q:抓取间隔设到 1s 会不会影响被监控服务?

A:1s 的抓取频率确实会给被监控服务带来一定压力,但对于大多数 HTTP 服务来说,每秒一个请求基本可以忽略。关键是控制指标数量,避免暴露太多细粒度的指标。

Q:如何监控 Prometheus 自身的健康状态?

A:使用 Prometheus 监控 Prometheus(联邦集群),或者使用开源的 prometheus-operator。关注 scrape 成功率、查询延迟、存储使用率等指标。

监控最佳实践总结

  1. 分层监控:不同重要程度的指标使用不同的抓取间隔
  2. 合理采样:缓慢变化的指标用长间隔,快速变化的指标用短间隔
  3. 预计算优化:使用 recording rules 减少实时计算
  4. 标签基数控制:避免高基数标签导致的性能问题
  5. 定期审查:定期检查监控项的有效性,删除无用的指标
  6. 资源预留:Prometheus 的资源消耗跟指标数量正相关,提前规划好资源

写在最后

监控系统的配置没有标准答案,需要根据实际业务场景进行调整。

核心思路是:

  • 分层:不同重要程度的指标使用不同策略
  • 平衡:实时性、资源消耗、准确率之间找平衡
  • 优化:持续优化告警规则,减少不必要的延迟

如果你也在为监控配置困扰,希望这篇文章能给你一些参考。如果有问题或建议,欢迎交流。


作者:小六,一个在上海努力搬砖的运维工程师

本文阅读量 --
Author:Margrop
Link:https://blog.margrop.com/post/2026-05-10-prometheus-scrape-interval-analysis-and-alert-optimization/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可