香港云服务器承载高并发网站时,哪些CPU、内存与连接数指标适合设置告警?

先把并发量转换成可告警的指标
香港云服务器承载高并发网站时,CPU、内存和连接数不应只按“使用率超过多少”设置告警,而要结合请求速率、响应时间、连接持续时间和业务峰值判断。一个可执行的初始方案是:
- CPU:CPU繁忙度连续10分钟超过70%时预警,连续5分钟超过85%时严重告警;同时观察运行队列、I/O等待和虚拟化偷取时间。
- 内存:可用内存低于总内存20%时预警,低于10%时严重告警;发生持续换入换出或内存不足事件时,应立即升级告警。
- 连接数:不要按操作系统理论上限设置阈值,应以压测得到的“稳定连接上限”为基准。已建立连接达到该上限的70%时预警,达到85%时严重告警。
- 业务关联:如果CPU、内存或连接数升高,但响应时间和错误率没有变化,可以先观察;如果资源指标与P95响应时间、超时率或错误率同步恶化,应视为容量不足前兆。
这些数值只能作为首次配置的起点。真正适合某台香港云服务器的阈值,应通过与实际业务接近的性能测试得到,并在流量结构、数据规模或程序版本发生变化后重新校准。
一、先建立负载画像:并发不等于请求数
高并发网站的“并发”至少包含三种不同含义:
- 单位时间收到的请求数,即RPS或请求速率。
- 同一时刻正在处理的请求数,即应用层并发。
- 同一时刻保持的TCP连接数,即网络连接并发。
三者不能直接相互替代。例如,长连接或较长的Keep-Alive时间会让连接数持续升高,但不一定代表CPU正在处理同样多的请求;相反,大量短连接可能使新建连接速率很高,即使瞬时已建立连接数并不突出。
可以先记录以下变量:
| 变量 | 含义 | 主要用于判断 |
|---|---|---|
R_peak | 峰值请求速率,单位为请求/秒 | CPU消耗和应用并发 |
W | 请求平均或P95响应时间,单位为秒 | 请求在系统中停留的时间 |
C_req | 同时处理中的请求数 | 应用并发压力 |
R_conn | 新建连接速率,单位为连接/秒 | 连接建立和握手压力 |
T_conn | 单个连接平均持续时间 | 已建立连接数量 |
C_est | 已建立连接数 | 连接资源占用 |
C_safe | 压测得到的稳定连接上限 | 连接告警阈值 |
E | 错误率、超时率或拒绝率 | 是否已经影响用户 |
请求并发可以用排队关系进行估算:
C_req ≈ R_peak × W
例如,峰值请求速率为 R_peak,P95响应时间为 W,则得到的C_req是一个容量规划参考值,而不是必须直接设置成告警值。实际监控中还要区分静态页面、动态请求、慢查询请求和大响应请求,因为它们对CPU和内存的消耗可能不同。
已建立连接数则更接近以下关系:
C_est ≈ R_conn × T_conn
当连接保持时间变长时,即使请求速率不变,C_est也可能继续增加。因此,连接数持续上涨而请求量没有同步上涨,通常需要重点检查连接释放、Keep-Alive时长、客户端重试或连接池使用情况。
二、CPU估算与告警设置
1. 不只看CPU百分比
CPU监控至少应包含以下指标:
- 总CPU繁忙度;
- 单核或单个虚拟CPU的繁忙度;
- 运行队列长度;
- I/O等待时间;
- 虚拟化偷取时间;
- 用户态与内核态CPU占比;
- 应用请求速率和P95响应时间。
在多核环境中,总CPU使用率可能看起来不高,但某一个CPU已经接近饱和。例如,某个单线程任务占满一个虚拟CPU,而其他CPU空闲,此时总使用率不一定达到80%,但请求延迟可能已经升高。
Linux中的load average也不能直接等同于CPU利用率。它通常反映等待运行或等待不可中断资源的任务数量。判断CPU是否成为瓶颈时,可以结合以下关系:
归一化负载 ≈ load average / 虚拟CPU数量
归一化负载长时间接近或超过1,说明可运行任务可能已经排队。但如果I/O等待较高,负载升高不一定意味着CPU算力不足,还可能是存储或其他资源等待。
2. CPU告警的起始阈值
在没有历史基线时,可以先使用以下分级方式,再根据压测结果调整:
| 指标 | 预警建议 | 严重告警建议 | 解释 |
|---|---|---|---|
| CPU繁忙度 | 连续10分钟超过70% | 连续5分钟超过85% | 观察是否与延迟、错误率同时升高 |
| 归一化负载 | 连续10分钟超过0.8 | 连续5分钟超过1.0 | 需要结合I/O等待判断 |
| I/O等待 | 持续高于历史基线 | 持续升高且响应超时 | 不宜直接当作CPU不足 |
| 偷取时间 | 持续高于历史基线 | 与延迟、吞吐下降同时出现 | 说明实际可用CPU低于分配值 |
“连续”比单次采样更重要。短时CPU冲高可能只是流量突发、缓存刷新或定时任务,不适合直接触发扩容。若业务对延迟敏感,且压测显示P95响应时间在CPU达到60%至70%时已经明显恶化,则应把预警阈值提前,而不是机械等待CPU达到85%。
3. 用单位请求CPU消耗估算容量
更稳定的估算方法是测量单位请求消耗的CPU时间。设:
R_peak为目标峰值请求速率;S_cpu为每个请求消耗的CPU秒数;B为峰值突发系数;U_target为计划使用的CPU目标比例。
则可以使用:
所需虚拟CPU数 ≈ R_peak × S_cpu × B / U_target
S_cpu不能凭空设定,应在与生产环境接近的压测中测量。测试时需要尽量保持以下条件一致:
- 请求类型和比例接近真实流量;
- 请求参数和响应大小接近生产数据;
- 缓存命中情况接近峰值期间;
- 数据库或其他后端响应时间处于可比状态;
- 连接复用方式与线上一致。
如果CPU使用率很高,但请求速率没有增加,通常不能直接得出“需要更多CPU”的结论。应先比较以下组合:
- CPU高、RPS高、响应时间稳定:接近容量上限但尚未失稳;
- CPU高、RPS不高、响应时间升高:可能存在慢请求、异常循环或后端等待;
- CPU不高、I/O等待高:瓶颈可能不在CPU;
- CPU不高、偷取时间升高:需要关注实际可用CPU变化;
- CPU高、错误率同步升高:应按容量不足处理,而不是只观察利用率。
三、内存估算与告警设置
1. 使用“可用内存”,不要只看“已用内存”
Linux会使用空闲内存作为文件缓存,因此“已用内存”较高并不一定表示内存不足。告警时应优先看:
- 可用内存;
- 工作集是否持续增长;
- 交换区读入和写出;
- 主要缺页次数;
- 内存不足事件;
- 应用进程或服务的内存增长趋势;
- 请求并发与响应时间变化。
可以将内存需求拆成几部分:
所需内存
≈ 系统与常驻进程
+ 连接占用
+ 并发请求工作集
+ 缓存
+ 运行时保留空间
+ 安全余量
进一步表示为:
M_need ≈ M_base + C_est × M_conn + C_req × M_req + M_cache + M_margin
其中:
M_base是系统和常驻进程的基础占用;M_conn是单个连接产生的平均内存占用;M_req是单个并发请求产生的平均工作集;M_cache是缓存、文件页或应用缓存;M_margin是为流量波动和异常请求保留的空间。
M_conn和M_req必须通过测试或运行数据测量。连接数增加时,内存不一定按固定比例增长,因为连接可能只保留少量状态,也可能附带缓冲区、会话信息或请求上下文。
2. 内存告警的起始阈值
| 指标 | 预警建议 | 严重告警建议 | 处理含义 |
|---|---|---|---|
| 可用内存占比 | 低于总内存20%,持续5分钟 | 低于10%,持续2分钟 | 结合交换活动和延迟判断 |
| 交换区读入/写出 | 高于平时基线并持续 | 持续增加且响应变慢 | 说明内存压力正在影响请求 |
| 主要缺页 | 明显高于稳定基线 | 与超时、延迟同步升高 | 可能已进入回收压力 |
| 内存不足事件 | 出现即告警 | 重复出现或进程被终止 | 属于严重故障前兆 |
可用内存低于20%并不必然意味着需要扩容。如果缓存可以快速回收、交换活动为零、应用响应时间稳定,可能只是正常缓存行为。相反,即使可用内存仍高于10%,只要交换区持续读写、缺页显著上升并且P95延迟变差,也应提前处理。
3. 识别内存泄漏和缓慢耗尽
内存故障通常不是瞬间发生,而是表现为工作集在多个业务周期中持续上升。可以观察:
- 流量回落后,进程内存是否回到接近原有水平;
- 相同请求量下,单位请求内存是否逐步增加;
- 连接数下降后,内存是否同步释放;
- 每次发布或配置变更后,内存基线是否抬高;
- 长时间运行后是否出现交换、超时或进程被终止。
如果流量下降后内存仍持续增加,应优先按内存泄漏、缓存无界增长或连接状态未释放排查,而不是立刻通过增加内存掩盖问题。增加容量可以作为临时缓冲,但不能代替复测和修复。
四、连接数估算与告警设置
1. 区分连接上限、已建立连接和请求并发
连接相关指标至少需要分开记录:
- 新建连接速率;
- 已建立连接数;
- 半连接或监听队列等待数量;
- 连接关闭速率;
TIME_WAIT数量及增长速度;- 应用实际活跃请求数;
- 文件描述符使用量;
- 应用连接池或服务连接上限。
操作系统理论上允许的文件描述符数量,不等于网站可以稳定承载的连接数。稳定连接上限还会受到每个连接的内存占用、请求处理方式、连接复用、应用限制和响应时间影响。
因此,应先通过压测确定C_safe:
C_safe = 在业务响应目标、错误率和资源阈值均可接受时的最大稳定连接数
这个值不是某次测试中出现过的最大连接数,而是连续运行一段时间后仍未出现明显排队、错误或资源失控的连接规模。
2. 连接数告警阈值
建议将告警绑定到压测得到的稳定上限:
连接预警阈值 ≈ 70% × C_safe
连接严重阈值 ≈ 85% × C_safe
如果测试结果显示连接数达到某个水平后,响应时间开始陡增,即使CPU和内存尚未耗尽,也应把该位置视为容量拐点。对于长连接业务,还需要根据连接增长速度设置趋势告警:
预计耗尽时间
≈(C_limit - 当前连接数)/ 连接数增长速率
当预计耗尽时间小于一个业务处理周期或维护窗口时,应提前告警。具体时间取值要结合流量波动和人工处理速度确定,不宜直接套用固定分钟数。
3. 根据组合指标判断连接问题
| 现象 | 可能含义 | 首要判断 |
|---|---|---|
| 已建立连接数高,但请求并发低 | 长连接保持时间过长或连接释放慢 | 检查连接生命周期和空闲连接比例 |
| 新建连接速率突然升高 | 流量突发、客户端重试或连接复用失效 | 对比请求速率、错误率和关闭速率 |
TIME_WAIT持续增加 | 短连接频繁建立和关闭 | 关注连接 churn,而非只看已建立数 |
| 连接数高、内存同步上涨 | 单连接状态或缓冲区占用明显 | 测量单位连接内存 |
| 连接数不高但请求排队 | 瓶颈可能在CPU、后端处理或应用队列 | 对比活跃请求、CPU和响应时间 |
| 连接接近上限且出现拒绝或超时 | 已进入连接容量边界 | 立即按严重告警处理 |
如果只监控系统级连接总数,可能把其他服务或管理连接纳入统计,造成误判。生产监控应尽量区分目标网站进程、监听端口或服务实例,并将统计口径固定下来,避免压测和线上监控使用不同定义。
在Linux环境中,可以使用以下无修改操作查看基础状态:
nproc
uptime
free -h
ss -s
cat /proc/sys/fs/file-nr
这些命令适用于常见Linux发行版,不会修改系统配置。其中:
nproc用于确认可见的处理器数量;uptime用于查看负载;free -h用于查看可用内存和交换区概况;ss -s用于查看系统级连接摘要;file-nr用于了解文件描述符使用情况。
如果需要按网站进程或监听端口统计,应使用与实际服务配置相符的筛选条件,不要直接把系统级总数当成应用连接数。
五、用性能测试确定告警阈值
1. 测试环境和前置条件
测试环境至少应固定以下条件:
- 香港云服务器的CPU和内存规格与生产环境一致;
- 网站程序版本、配置和数据规模与生产环境接近;
- 请求比例、请求参数、响应大小和连接复用方式可复现;
- 测试流量不会影响真实用户;
- 记录测试开始前的CPU、内存、连接数和响应时间基线;
- 明确业务可接受的P95、P99响应时间、错误率和超时率。
如果测试环境与生产环境不完全一致,结果只能用于相对比较。此时不要把测试得到的绝对请求数直接当作线上承诺容量,而应关注资源曲线和失稳拐点。
2. 推荐测试流程
可以按以下顺序进行:
- 基线阶段
在无压或低压状态下记录基础CPU、可用内存、连接数、响应时间和错误率。
- 阶梯加压
逐步增加请求速率或连接数,每个压力档位保持足够时间,让CPU、内存和连接数达到相对稳定状态。
- 峰值阶段
使用预期峰值流量运行,观察资源是否持续上升,还是在某个水平稳定。
- 突发阶段
在稳定峰值上增加短时流量,测试CPU、连接数和内存对突发的响应速度。
- 持续阶段
保持峰值或接近峰值运行,观察是否出现缓慢内存增长、连接泄漏、错误率累积或响应时间逐步变差。
- 回落阶段
降低压力,检查连接数、内存和CPU是否回到接近基线。不能回落的指标需要单独分析。
- 重复验证
调整配置或资源后,在相同负载曲线下复测,比较拐点位置、P95延迟和错误率,而不是只比较某一时刻的CPU百分比。
3. 结果如何转成告警规则
测试结束后,可按以下方法确定阈值:
- 找到CPU开始持续排队、响应时间明显上升或错误率增加的拐点;
- 找到可用内存开始快速下降、交换活动出现或请求延迟恶化的拐点;
- 找到连接数增加后,连接建立失败、排队或响应超时明显增加的拐点;
- 将拐点前的稳定区域作为容量区间;
- 将预警阈值放在稳定区间的前段,将严重阈值放在接近拐点的位置;
- 对突发流量单独保留余量,不用持续峰值的平均值代替瞬时峰值。
如果压测中CPU达到85%但响应时间仍稳定、错误率为零,不能据此断定线上一定可以长期运行在85%。还要确认测试时长、请求类型、内存趋势和连接释放情况。反过来,如果CPU只有65%但P95延迟已经超出业务目标,应以业务结果为准,提前设置告警或扩容触发点。
六、降低误报:让告警反映真实容量风险
1. 使用持续时间和恢复阈值
单次采样超过阈值不宜直接告警。更适合的规则是:
预警条件:指标超过预警线,并持续多个采样周期
严重条件:指标超过严重线,且业务指标同步恶化
恢复条件:指标下降到恢复线以下,并持续一段时间
恢复线应低于触发线。例如,CPU超过85%触发严重告警后,不要刚降到84%就恢复,可以等待其回落到较低水平并保持稳定,避免告警反复开关。
2. 使用组合条件
单指标告警容易产生噪声,可以将资源指标与业务指标组合:
- CPU高 + 请求速率高 + P95延迟上升:更接近计算容量不足;
- CPU高 + 请求速率不高 + 错误率上升:优先排查异常请求或程序行为;
- 可用内存低 + 交换活动增加 + 延迟上升:内存压力已经影响服务;
- 连接数高 + 新建连接速率高 + 拒绝或超时增加:连接容量正在耗尽;
- 连接数高 + 请求并发低 + 内存持续上涨:需要检查连接释放和单连接内存;
- 所有资源指标正常但延迟升高:不要强行归因于CPU、内存或连接数,应继续查看请求处理链路中的其他等待点。
3. 为增长趋势设置提前量
除了阈值告警,还应关注增长斜率。对于每个指标,可以计算最近一段时间的增长速度:
预计达到告警线时间
≈(告警线 - 当前值)/ 当前增长速率
如果连接数正在稳定增长,虽然当前只达到C_safe的50%,但按照当前斜率很快会接近70%或85%,趋势告警比达到阈值后再通知更有价值。内存缓慢增长同样适合使用趋势判断,尤其是长时间运行的网站。
七、确定扩容和复测触发点
以下情况适合作为香港云服务器的扩容或重新压测触发条件:
- 峰值期间CPU繁忙度长期超过严重阈值,且P95响应时间同步恶化;
- 归一化负载持续超过1,运行队列不断增长;
- 可用内存进入严重区间,并伴随交换活动或内存不足事件;
- 已建立连接数接近压测得到的稳定上限;
- 连接数增长速度明显高于请求速率增长速度;
- 在相同流量下,单位请求CPU或单位请求内存较上次测试增加;
- 流量尚未达到预期峰值,但已经触发容量拐点;
- 版本、缓存策略、数据规模、请求比例或连接保持时间发生明显变化。
每次调整资源或配置后,都应使用相同的负载画像复测,至少比较以下结果:
| 对比项 | 需要确认的内容 |
|---|---|
| 峰值请求速率 | 是否达到目标流量,是否存在吞吐下降 |
| CPU曲线 | 是否推迟了排队和延迟拐点 |
| 内存曲线 | 压力回落后是否恢复,是否仍持续增长 |
| 连接曲线 | 是否在稳定范围内,是否存在释放滞后 |
| P95/P99延迟 | 是否符合业务目标 |
| 错误与超时 | 是否随压力增加而提前恶化 |
| 告警数量 | 是否减少误报,同时保留故障前兆 |
这样建立的阈值,不是简单套用某个百分比,而是把业务峰值、资源消耗、稳定上限和增长速度统一起来。对于“高并发网站如何估算香港云服务器 CPU、内存和连接数?”这一问题,最可靠的答案是:先用真实负载测出单位请求和单位连接的资源消耗,再用稳定容量拐点确定告警线,最后通过持续时间、组合指标和趋势预测降低误报,并在流量或运行条件变化后重新测试。