SRE 云原生运维 可靠性工程 Linux Kubernetes
聚焦站点可靠性工程(SRE)与云原生运维实践,记录 Linux 系统运维、监控告警、容器编排、CI/CD 与自动化运维的深度技术指南。

承诺 99.9% 赔了 0.7 元:SLA 条款拆解与内部设计的 6 个工程决策

概述 你公司用了某云厂商的服务,SLA 白纸黑字写着 99.95% 月度可用性。某天凌晨服务挂了 30 分钟,你跑去找云厂商索赔,拿回来的赔偿大概是这么算的:故障时间占月度总分钟数的比例,乘以你当月的服务费。假设你月付 1000 块,30 分钟除以 43200 分钟再乘 1000,赔你 0.7 元。 没看错,七毛钱。你线上炸了半小时,客服电话被打爆,用户退款申请堆了一屏,云厂商赔你七毛。 这不是段子,这是 2025 年某 CSDN 技术博客拆解云厂商 SLA 时用的真实计算逻辑。当然,实际云厂商的赔偿用的是阶梯制(后面会讲),但核心问题不变:SLA 的数字看着唬人,赔偿条款却藏着大量排除项和窄化定义,到了真出事的时候,赔的那点钱远远覆盖不了你的业务损失。 这篇文章不聊怎么"读懂"SLA——那种文章网上一搜一大把。我要聊的是:作为 SRE,你怎么设计自己服务的 SLA,怎么避免云厂商 SLA 的坑,怎么把一个合同条款变成可执行的工程约束。 SLA、SLO、SLI:别再混为一谈 很多团队把这三个词当同义词用。开会时"我们的 SLA 是 99.9%",实际上说的是 SLO。这三个东西的区别不是文字游戏,搞混了会出真问题。 先上一张对比表,后面逐个展开: 维度 SLI(指标) SLO(目标) SLA(协议) 是什么 对服务质量的量化测量值 基于 SLI 设定的内部目标值 对外承诺的合同条款 面向谁 工程团队 工程团队 + 产品 客户 / 业务方 违约后果 无 冻结发布、投入稳定性修复 赔偿、合同违约 严格程度 客观事实,无严格/宽松之分 必须严于 SLA 比 SLO 宽松,留缓冲 典型例子 P99 延迟 = 120ms P99 延迟 < 200ms,成功率 > 99....

September 15, 2026 · 9 分钟 · 1914 字 · 徐保金

封板 14 天还是炸了 P0:从人工变更冻结到动态窗口的 5 个工程决策

概述 某年双十一前 14 天,某电商平台启动了全量封板——所有非紧急变更一律冻结,CI/CD 流水线闸门关闭,只留一个安全补丁通道。运维团队松了口气,觉得这回稳了。 结果大促当天凌晨 2 点,支付链路 P0 告警炸了。 根因不是新代码,而是一个封板前 3 天上线的配置变更——某个限流规则的白名单写错了 IP 段,平时流量小没问题,双十一零点流量打到 8 倍,限流规则误杀了 30% 的正常请求。封板期间没人复查这个配置,因为"封板了,不动了嘛"。 这次故障给我最大的冲击是:封板 14 天,零代码变更,还是炸了 P0。问题不在变更多少,在于变更冻结制造了一种虚假的安全感——你以为关了闸门就安全了,实际上水位一直在涨。 行业数据也支持这个判断。SRE 实践白皮书指出,约 70% 的线上生产故障由变更直接引发。但"变更引发故障"不等于"减少变更就能减少故障"——封板期间积累的配置偏差、无人维护的监控规则、被延迟修复的隐患,都在暗处发酵。 这篇文章要拆解的就是:人工封板到底哪里出了问题,以及如何用错误预算驱动的动态变更窗口替代日历封板。我会给出 5 个工程决策,每个都来自实际项目中的踩坑和修正。 变更冻结的本质:你以为在防故障,其实在做"安全剧场" 先说清楚"变更冻结"到底是什么。 变更冻结(Change Freeze),行业里也叫封板、blackout period、code freeze,指的是在特定时间段内禁止或严格限制生产环境的任何变更操作。常见触发场景: 双十一/618 等大促前 1-2 周 春节/国庆等法定长假期间 核心系统迁移或基础设施切换期间 合规审计期间 IBM 在其云服务的维护策略中明确定义了 Change Freeze Period 的概念:在冻结期内系统正常运行,所有标准自动化流程(如数据库备份)照常执行,但协调性变更(如应用升级)不可用,SRE 团队不在此期间安排维护。 这个定义本身没问题。问题出在执行层面——大多数团队的封板实践,本质上是一种"安全剧场"(Security Theater): 做法 看起来在做 实际效果 关闭 CI/CD 闸门 阻止新代码上线 配置变更、手动操作绕过流水线照样上 全量冻结所有变更 风险最小化 安全补丁被延迟,隐患变成定时炸弹 人工审批特例变更 精准放行 审批人不懂技术细节,变成橡皮图章 封板期间不巡检 “稳定"了不用看 配置漂移、监控失效无人发现 我不是反对变更冻结——在特定场景下,封板确实有必要。我反对的是"一刀切式"的静态封板:用日历决定什么时候能变更,而不是用数据决定风险有多大。...

September 12, 2026 · 8 分钟 · 1583 字 · 徐保金

2GB 共享内存僵尸段无人回收:Linux IPC 机制选型与生产排障实录

概述 凌晨 1 点 47 分,告警群弹出一条消息:192.168.10.23 shared memory usage > 1.5GB。登录机器一看,ipcs -m 输出里躺着 14 个共享内存段,其中 9 个 nattch=0(没有进程关联),却占着将近 2GB 物理内存。更恶心的是,ipcrm -m 删了 3 个,剩下的报 Operation not permitted——进程已经退出一个月了,这些"僵尸段"还赖在内核里不走。 这不是个例。在做 K8s 迁移那段时间,某个 Go 服务每次异常退出都会留下一块共享内存段。一个月下来积累了 30 多个段,直接把节点内存吃掉 3GB,导致 Pod 调度失败。当时排查了好几个小时才搞清楚根因:进程用了 shmget 创建共享内存做进程间数据交换,但异常退出时没走到 shmctl(IPC_RMID) 的清理逻辑,共享内存的生命周期跟着内核走,进程死了内存还在。 Linux 进程间通信(IPC,Inter-Process Communication)是个老话题,但大多数资料要么只讲 API 用法,要么纯讲内核原理,很少有人从"生产环境踩坑"的角度把它讲透。这篇文章从那次凌晨排障出发,把 7 种 IPC 机制的原理、性能差异、选型决策和排障方法一次讲清。不管你是做运维排查还是做服务架构选型,看完应该能独立处理 IPC 相关的线上问题。 相关文章:Linux 内存管理机制与调优实战 IPC 到底解决什么问题 一句话:进程之间天然是隔离的,每个进程有独立的虚拟地址空间,A 进程的指针 0x7fff1234 和 B 进程的同名指针指向完全不同的物理内存。要交换数据、同步状态、传递事件通知,就得通过内核提供的"通信通道"绕过隔离墙。 这不是废话——理解了"为什么需要 IPC",才能理解每种机制的设计取舍。管道要拷贝两次数据(用户态→内核缓冲区→用户态),因为内核要做中转站;共享内存零拷贝,因为内核只负责映射物理页,之后进程自己读写;Unix 域套接字比 TCP 快 30-50%,因为省掉了协议栈的包头封装和校验。每种快慢差异背后都有明确的物理原因。 Linux 提供了 7 种主要 IPC 机制,我先用一张表做全景对比,后面逐个拆解:...

September 10, 2026 · 10 分钟 · 2072 字 · 徐保金

错误预算耗尽还在催发版:用三级门禁把可靠性变成产品决策的硬约束

概述 你大概率遇到过这个场景:SLO 定了 99.9%,错误预算也算了,Grafana 仪表盘画得漂漂亮亮。然后某个周五下午,错误预算已经消耗了 87%,产品经理拿着老板的旨意来说"这个功能周一必须上"。你说不行,预算快没了。产品说"那你说什么时候上"。吵了半小时,最后还是上了。周一晚上果然炸了。 这不是个例。我见过太多团队把错误预算做成了"运维的仪表盘"——指标定义了、告警配了、仪表盘画了,但一到决策环节就失效。问题的根源不是技术实现,而是错误预算从来就不是运维一个人的工具。 这篇文章要讲的是:怎么让错误预算从"运维墙上的一张图"变成"产品发版时绕不开的硬约束"。我会拆解三个层面的工作——把技术指标翻译成产品语言、设计三级响应机制让决策有规则可依、用燃烧速率做预测而非等预算花完才慌。每一步都附完整代码和配置,直接拿去用。 在展开之前,建议先回顾 SLO 的基础概念(相关文章:SRE核心理念:SLI、SLO与错误预算)。本文聚焦的不是"什么是错误预算",而是"怎么让它真正管用"。 一、错误预算为什么在大多数团队形同虚设 1.1 一个典型失败案例 2024 年,我在某电商平台做 SRE 顾问。他们花了三个月搭建 SLO 体系:梳理了 47 个核心服务的 SLI,每个服务定了 99.9% 或 99.95% 的可用性目标,错误预算计算逻辑也写好了。Grafana 仪表盘很专业,每个服务一个面板,剩余预算一目了然。 然后呢?没有任何决策流程绑定到错误预算上。 产品该发版还是发版,发布评审会上没人看一眼预算仪表盘。直到某次大促前两天,订单服务的错误预算已经归零(实际可用性掉到了 99.82%),但促销活动的代码照常合入。结果大促当天流量翻三倍,订单服务 P99 从 200ms 飙到 3.5s,优惠券模块超时连锁崩溃,最终损失了大约 40 万订单。 事后复盘,所有人都在问:错误预算不是已经标红了吗?为什么没人拦住? 答案很简单:仪表盘是给别人看的,决策是另一些人做的。两者之间没有桥梁。 1.2 三个根因 我复盘过至少 8 个团队的错误预算落地过程,失败模式高度集中: 失败模式 表现 根因 单方面制定 SLO 由运维独自定,产品不知道也不认 缺乏跨团队共识 只监控不执行 仪表盘有,但没有发布门禁代码 没有把预算消耗和发布流程绑定 当惩罚用 预算耗尽=运维要找开发的麻烦 定位错误,预算是共享决策工具不是武器 第三个最致命。错误预算的设计意图——Google SRE Workbook 里讲得很清楚——是给开发和运维一个共同的数据基础,让"要不要发版"从立场之争变成数据决策(来源:Google SRE Workbook)。如果运维把它当武器去卡开发,开发就会想办法绕过——比如把故障时间拆小到不触发阈值,或者在 SLO 计算窗口结束前一天重启计数器。 我的观点:错误预算落地的第一步不是配告警,而是开一次跨团队会议,让产品、开发、运维三方共同签署一份"错误预算策略文档"。这份文档要回答三个问题:预算耗尽时谁有权叫停发布?叫停后恢复条件是什么?预算充足时谁有权加速发布?没有这份共识,任何技术实现都是空中楼阁。 二、把错误预算翻译成产品语言 2.1 产品经理看不懂"剩余预算 13%" 你跟产品经理说"订单服务的错误预算还剩 13%",他脑子里想的可能是"13% 听起来还有不少啊"。你得换一种语言。...

September 10, 2026 · 9 分钟 · 1764 字 · 徐保金

IP 池耗尽后 Pod 集体 Pending:TKE 网络选型与节点池治理的 5 个生产决策

概述 凌晨两点,手机被告警轰炸。打开看,TKE 集群里 40 多个 Pod 突然全部进入 Pending 状态,业务接口大面积超时。kubectl describe pod 一看,调度失败原因清清楚楚写着 Insufficient tke.cloud.tencent.com/eni-ip。 这不是什么高深的技术难题。根因是 VPC-CNI 模式下,节点上弹性网卡(ENI)绑定的辅助 IP 用完了。但排查和修复花了 3 个小时——因为没人想到 IP 会耗尽,监控里压根没有这个指标,节点池弹性伸缩也扩不出来(新节点同样绑不上 IP,子网 IP 已被分配光)。 这件事给我最大的教训:TKE 网络选型不是选性能参数,是选故障模式。GlobalRouter 和 VPC-CNI 的差异远不止"性能差 10%“这么简单,它们在 IP 管理、扩缩容行为、监控指标和故障传播路径上完全不同。这篇文章从这次故障出发,拆解 5 个我实际踩过的生产决策,帮你在选型阶段就避开这些坑。 如果你正在用或准备上腾讯云 TKE(容器服务 Kubernetes 引擎),不管是从自建 K8s 迁移还是新建集群,网络模型选型和节点池治理是绕不过去的第一道关。选错了,后面补救的成本远高于选型时多花半天思考。 TKE 三种网络模型:你选的不是性能,是故障模式 先说清楚三种模型是什么,再说为什么选择本质上是"选故障模式”。 GlobalRouter:地址充裕但多了一层转发 GlobalRouter 是 TKE 基于腾讯云 VPC 全局路由能力实现的容器网络方案。原理不复杂:给每个工作节点分配一个 CIDR 网段(通常是 /24),节点上所有 Pod 从这个网段拿 IP,节点充当路由器,通过 VPC 底层路由策略实现 Pod 间通信。 # 查看节点分配的容器网段 kubectl get node <node-name> -o jsonpath='{.spec.providerID}' # GlobalRouter 模式下,每个节点有独立的容器 CIDR 它的优势很明显:容器网段和 VPC 网段不重叠,地址空间充裕,一个 /24 就够 254 个 Pod。扩展性强,标准 K8s 功能无缝兼容, Pod 重启或迁移 IP 会变但 Service 层屏蔽了这个问题。...

September 8, 2026 · 7 分钟 · 1279 字 · 徐保金

别让基础设施管了两遍:Terraform 建资源 + Ansible 管配置的协同边界与 5 个生产级决策

概述 凌晨两点,告警群炸了。一台刚上线两小时的 Web 服务器 CPU 飙到 100%,SSH 进去一看,Nginx 没装,但端口被一个旧版本 Apache 占着。翻部署日志发现:Terraform 10 分钟前做了一次 terraform apply,把这台机器重建了(因为有人改了 instance_type),但 Ansible 的配置脚本没有跟着跑——机器是新机器,上面的软件配置全丢了。 这不是个例。用 Terraform 建云主机、用 Ansible 做配置管理,这个组合在 2026 年已经是运维团队的标配。但"标配"不等于"配好了"——大量团队把这两个工具简单堆在一起,没有清晰的协同设计,结果就是基础设施"管了两遍":Terraform 建了一遍资源,Ansible 又配了一遍,两边都不知道对方在干什么,配置漂移、状态不一致、流水线断裂,全来了。 这篇文章拆解 Terraform + Ansible 协同的 5 个核心决策。每个决策都来自实际生产环境的踩坑经验,不是理论推演。如果你的团队正在用或准备用这个组合,这些决策点会帮你少走至少半年的弯路。 一、职责边界:Terraform 管什么,Ansible 管什么 先说清楚一个最基本但最容易被忽视的问题:这两个工具的职责边界到底画在哪里。 Terraform 的强项是基础设施编排——创建云主机、虚拟机、网络、存储、负载均衡、安全组、数据库实例、K8s 集群。它是声明式的,你告诉它"我要 3 台 4C8G 的云主机在这个可用区",它就去创建。它管理资源的整个生命周期:创建、修改、销毁。 Ansible 的强项是系统配置和应用交付——操作系统初始化、账号权限、内核参数、防火墙规则、软件包安装、中间件部署、配置文件渲染、服务启停、定时任务。它是过程式的(虽然也有幂等性设计),你告诉它"先装 Nginx,再拷配置,然后启动服务",它按顺序执行。 两个工具各管一摊,看起来很清楚。但实际生产中,边界经常模糊。举几个常见的"灰色地带": 配置项 Terraform 能做 Ansible 能做 应该谁管 创建云主机 ✅ 原生支持 ❌ 不适合 Terraform 安装 Nginx ✅ remote-exec ✅ 原生支持 Ansible 配置安全组规则 ✅ 原生支持 ⚠️ 能做但不推荐 Terraform 渲染 Nginx 配置文件 ⚠️ local-exec 拼接 ✅ Jinja2 模板 Ansible 磁盘挂载和格式化 ⚠️ 能做但粗糙 ✅ 精细控制 Ansible 创建 DNS 记录 ✅ 原生支持 ⚠️ 能做但不推荐 Terraform 用户和 SSH 密钥 ✅ 能做 ✅ 原生支持 Ansible 决策 1:不要用 Terraform provisioner 做复杂配置 Terraform 提供了 remote-exec 和 local-exec 两个 provisioner,可以在资源创建后执行命令或脚本。很多团队一上来就在 Terraform 里写一长串 remote-exec 块,用 shell 脚本装软件、配防火墙、改内核参数。...

September 5, 2026 · 10 分钟 · 2068 字 · 徐保金

注入网络分区后 Pod 僵死了 6 分钟:故障注入测试的爆炸半径控制与 5 个生产级决策

概述 Netflix 说混沌工程让线上重大事故减少了 70%。这个数字很多团队都看过,但真正在生产环境跑过故障注入的,寥寥无几。 原因很简单:怕。注入一个网络分区,Pod 卡死怎么办?模拟磁盘写满,数据库崩了怎么办?在凌晨 3 点手动注入故障然后手忙脚乱地回滚——这不是演练,这是制造事故。 我曾经在某新能源物流平台的 K8s 迁移过程中,需要在 120+ 微服务全量切换前验证容灾能力。纯靠理论推演不够,团队需要眼见为实。于是我们在预发环境做了一轮故障注入测试,结果第一次注入网络分区就发现了 Pod 驱逐延迟 6 分钟的问题——如果这个 bug 在生产环境暴露,RTO 直接超标。 这篇文章不讲混沌工程的入门概念(那篇 相关文章:混沌工程:主动发现系统弱点 已经讲过),而是直接进入生产级决策:怎么选工具、怎么控制爆炸半径、怎么设计自动化演练流水线,以及 3 个我在实战中踩过的反直觉坑。 故障注入测试 vs 混沌工程:分清两件事 很多人把这两个词混着用。它们不一样。 故障注入测试是一种测试技术——你明确知道要注入什么故障(比如"把节点 A 和节点 B 之间的网络断开 5 分钟"),有明确的预期结果(比如"流量应该自动切换到节点 C"),有通过/不通过的判定标准。它的核心是验证:你已经设计的容错机制到底管不管用。 混沌工程是一种工程实践——你随机注入故障,观察系统行为,发现你不知道的弱点。它的核心是探索:系统在未知故障组合下会怎样。 维度 故障注入测试 混沌工程 目标 验证已知容错机制 发现未知弱点 故障选择 预定义、有针对性 随机、组合式 预期结果 明确的通过/失败标准 观察系统行为 执行频率 发布前、变更后 持续、定期 适用阶段 预发 → 生产灰度 生产环境常态运行 风险可控性 高(已知故障、已知预期) 中(随机组合可能暴露级联失效) 我推荐的落地路径:先做故障注入测试,再做混沌工程。原因很实际——如果你的系统连已知的、单一的故障都扛不住,随机组合只会制造混乱。 四类故障的注入方式与生产风险 故障注入的核心是覆盖系统最可能出问题的维度。我按实践经验分成四类,每类的注入方式、验证目标和生产风险完全不同。 网络故障:最危险的一类 网络故障包括网络分区(partition)、延迟(delay)、丢包(loss)、带宽限制(bandwidth)。其中网络分区是最危险的——它会导致分布式系统的"裂脑"(split-brain)。 为什么危险?因为网络分区不像 Pod 被杀那样有明确的故障信号。K8s 的 kube-controller-manager 需要等待 node-monitor-grace-period(默认 40 秒)才把节点标记为 NotReady,然后再等 pod-eviction-timeout(默认 5 分钟)才开始驱逐 Pod。加起来将近 6 分钟,在这段时间内,节点上的 Pod 仍然在运行,仍然认为自己是"活的",但和其他节点的通信已经断了。...

September 3, 2026 · 8 分钟 · 1698 字 · 徐保金

镜像推上去就不管了?Harbor 制品仓库的权限管控、漏洞扫描与 200GB 存储治理

概述 凌晨两点,手机震了一下。磁盘告警——95%。 爬起来一看,Harbor 服务器 /data/registry 目录占了 200GB,里面堆了 3000 多个 tag。有去年测试时推的 app:v0.0.3-beta,有构建失败残留的 app:feature-branch-xxx,还有十个版本的 base image 副本——每个都 800MB 起步。 这不是个例。我在多个团队见过同样的剧本:CI/CD 跑起来之后,镜像只管推不管清,三个月后磁盘就炸。更麻烦的是,有些镜像带着已知 CVE 漏洞跑在生产上,权限管理形同虚设——谁都能推、谁都能拉,项目之间没有隔离。 这篇文章解决三个问题:镜像怎么管权限、怎么拦漏洞、怎么清垃圾。我会用 Harbor(CNCF 毕业项目,目前 GitHub 29k+ star)从安装到生产配置走一遍,每一步都给出可直接复制的配置。如果你刚开始搭制品仓库,或者已经有了但管得稀里糊涂,这篇能帮你少走弯路。 为什么需要制品仓库 先说清楚一个概念:制品仓库(Artifact Repository)不是 Docker Hub。 Docker Hub 是公共镜像托管平台,类似 npm 的 registry。你在上面拉官方镜像没问题,但拿它存公司业务镜像?有几个硬伤: 没有细粒度权限。Docker Hub 的 organization 只有 admin 和普通成员,做不到"测试团队能推 dev 项目、不能碰 prod 项目" 没有漏洞扫描。推上去就推上去了,CVE 该有还是有 没有保留策略。镜像只增不减,除非手动删 网络不稳定。国内拉 Docker Hub 限速、超时是家常便饭 Harbor 解决的就是这些问题。说白了,Harbor = Docker Registry + 权限管理 + 漏洞扫描 + 复制同步 + 审计日志。它像一个带安保、带分拣、带回收站的仓库,而不是一个露天堆场。 类比一下:Docker Hub 像公共停车场,谁都能进;Harbor 像企业内部车库,分区域(项目)、刷卡进(RBAC)、进门安检(漏洞扫描)、定期清退僵尸车(GC + 保留策略)。...

September 3, 2026 · 8 分钟 · 1532 字 · 徐保金

API 网关监控实战:从 Kong 到 APISIX 的指标采集与告警设计

概述 凌晨两点,支付系统告警炸了。看了半天日志发现不是下游服务挂了,而是 API 网关的连接池打满了——请求堆在网关这一层根本没转发出去。但你的监控大盘上只有 CPU 和内存曲线,压根看不到网关层的延迟、连接数和错误率。 这不是个例。我见过太多团队把 API 网关当"高级 Nginx"用,监控只看 nginx_active_connections,出事了才去翻日志。问题是网关是所有流量的咽喉,一旦这层出问题,影响面是全局的。 这篇文章讲清楚三件事:Kong、APISIX、Envoy 各自暴露哪些指标、怎么用 Prometheus 采集、告警规则怎么设计才能在故障扩散前收到通知。不是泛泛而谈的"最佳实践",是我在生产环境踩过坑后整理出来的方案。 为什么 API 网关需要专门的监控 你可能会想:网关后面已经有服务监控了,为什么还要单独监控网关? 因为网关和后端服务看到的世界不一样。举个例子: 维度 网关视角 后端服务视角 请求延迟 包含路由匹配、插件执行、上游转发全链路 只看到自己处理那段 错误来源 可能是路由不存在、插件拦截、上游超时、连接池满 只知道返回了 500 连接状态 能看到与上游的连接池使用率 只知道自己收了多少请求 限流触发 网关层限流命中了哪些规则 服务端可能根本不知道被限了 简单说,网关是流量高速公路的收费站。收费站堵了,后面所有车都堵。你不在收费站装监控,等问题传导到后端服务再排查,黄花菜都凉了。 三大主流网关的指标体系对比 Kong 的指标暴露 Kong 通过 prometheus 插件暴露指标,启用方式很简单: # 启用 Prometheus 插件(全局级别) curl -X POST http://kong-admin:8001/plugins \ --data "name=prometheus" \ --data "config.per_consumer=true" \ --data "config.status_code_metrics=true" \ --data "config.latency_metrics=true" \ --data "config.upstream_health_metrics=true" 启用后访问 http://kong-proxy:8001/metrics 就能拿到 Prometheus 格式的指标。Kong 的核心指标分四类:...

September 1, 2026 · 8 分钟 · 1642 字 · 徐保金

别等炸了才看监控:Linux 性能基线建立与异常识别的实战方法论

概述 你大概率经历过这种场景:凌晨三点被告警吵醒,爬起来看 Grafana,发现 CPU 使用率飙到 85%。你紧张了半天,查了一圈,最后发现——这台数据库服务器每天凌晨 2:50 到 3:10 都会跑定时备份任务,CPU 本来就该到这个数。 问题出在哪?你不知道这台机器"正常"是什么样子。没有基线,85% 是高还是低,你根本判断不了。 性能基线(Performance Baseline)解决的就是这个问题:在系统健康的时候,把关键指标记录下来,形成一份"体检报告"。以后出了异常,拿当前数据跟基线一对比,是真故障还是正常波动,一眼就能看出来。 这篇文章讲的是怎么从零建立一套可落地的 Linux 性能基线体系。不是泛泛而谈"监控很重要",而是从方法论选择、指标采集、基线建模、异常识别到自动化落地,每一步都给你能直接用的配置和代码。 为什么静态阈值不靠谱 大多数团队的告警配置是这样的:CPU > 80% 告警,内存 > 90% 告警,磁盘 > 85% 告警。这就是静态阈值——一个拍脑袋定的数字,挂在所有机器上。 静态阈值有三个致命问题: 第一,不同业务、不同时段的正常值不一样。 一台跑批处理任务的服务器,CPU 峰值在工作时间冲到 95% 是正常的;一台 API 网关,CPU 持续 70% 就得警惕了。用同一个 80% 阈值套上去,前者天天误报,后者出了事还不报。 第二,绝对值掩盖趋势。 某台机器 CPU 从 30% 缓慢爬到 60%,持续两周。静态阈值看不到——没到 80% 嘛。但这种缓慢上升往往是内存泄漏或连接堆积的前兆,等真到 80% 的时候已经炸了。 第三,无法识别"不正常的好"。 某个核心服务的 QPS 突然从 5000 掉到 200,CPU 使用率跟着降到 10%。静态阈值觉得一切正常——CPU 低着呢。但实际上上游可能挂了,流量根本没进来。 基线解决这些问题的思路很简单:不设固定阈值,而是让系统自己学什么算正常。当实际表现偏离了历史学到的"正常模式",才触发告警。 USE 方法论:基线采集的骨架 建立基线之前,先得知道采什么指标。乱采一通,采了 200 个指标,80% 没人看,纯属浪费。...

August 30, 2026 · 12 分钟 · 2486 字 · 徐保金