高并发站点响应变慢,香港服务器如何判断磁盘I/O瓶颈?
高并发站点响应变慢时,不能看到服务器的磁盘 %util 接近 100% 就直接认定是磁盘瓶颈,也不能因为更换了 NVMe 后延迟下降,就忽略应用、数据库、内存和网络的影响。可靠的判断方式,是在同一个观察时间窗口内,把请求延迟、错误率、磁盘等待、I/O 队列、CPU、内存和网络指标放在一起对照。
如果响应时间的 p95、p99 与磁盘 await、队列长度同步升高,CPU 使用率和内存状态相对稳定,网络也没有达到上限,那么磁盘 I/O 瓶颈的可能性较高。只有完成这种关联验证后,才能判断香港服务器是否需要优先选择 NVMe,而不是仅凭单项指标或存储介质名称做决定。
先建立可比较的观察窗口
性能判断最容易出错的地方,是把不同时间、不同流量和不同缓存状态下的数据直接比较。一次有效的测试,至少要记录以下几个阶段:
- 基线阶段:在正常访问量下持续观察 5~10 分钟。
- 升压阶段:逐步提高并发或请求速率,避免瞬间压垮服务。
- 峰值阶段:保持目标压力 10~15 分钟,观察指标是否持续恶化。
- 恢复阶段:停止压测或恢复正常流量,确认队列和延迟能否回落。
测试环境应尽量保持以下条件一致:
- 使用同一台香港服务器、同一挂载卷和同一套应用版本。
- 请求比例、接口类型、响应数据量和并发模型保持一致。
- 明确测试是“冷缓存”还是“热缓存”,两种状态不要混在一起比较。
- 避开备份、日志轮转、批量导入、定时任务等会额外产生 I/O 的时段。
- 记录压测端位置、请求速率和持续时间,保证复测时可以重现。
- 生产环境有真实流量时,不建议直接运行高写入量的磁盘测试;优先使用隔离环境或独立测试卷。
单次平均响应时间不够用。高并发下,少量慢请求可能被平均值掩盖,因此至少同时关注:
- 吞吐量:每秒请求数、每秒事务数。
- 延迟:平均值、p50、p95、p99。
- 错误率:超时、5xx、连接失败和应用主动拒绝。
- 磁盘:读写速率、IOPS、
await、队列长度、忙碌比例。 - CPU:用户态、内核态、运行队列和 I/O wait。
- 内存:可用内存、swap 读写、页面回收和主要缺页。
- 网络:吞吐、丢包、错误、连接数和重传。
- 应用与数据库:线程池、连接池、慢请求、锁等待和活跃会话。
先看响应延迟,再对齐系统指标
建议把应用访问日志或监控中的请求时间,与操作系统指标按同一秒或同一分钟对齐。比如,某一分钟 p99 从 300 毫秒升到 2 秒,就要查看这一分钟内磁盘队列、CPU、内存和网络是否同时发生变化。
磁盘指标应该看什么
Linux 服务器通常可以使用 iostat 观察块设备:
iostat -xz 1 10
如果系统已安装 sysstat,常见字段包括:
| 指标 | 含义 | 观察重点 |
|---|---|---|
r/s、w/s | 每秒读写请求数 | 判断请求量和读写方向 |
rkB/s、wkB/s | 每秒读写数据量 | 判断带宽是否达到设备或虚拟卷能力 |
r_await、w_await | 读写请求平均等待时间,单位通常为毫秒 | 判断请求是否在设备或队列中等待 |
await | 综合 I/O 等待时间 | 与应用延迟、队列长度同步观察 |
aqu-sz 或 avgqu-sz | 平均 I/O 队列长度 | 判断请求是否持续堆积 |
%util | 设备处于忙碌状态的时间比例 | 判断设备是否长期繁忙,但不能单独作为结论 |
不同版本的 sysstat 字段名称可能略有差异。重点不是记住某个字段的绝对阈值,而是观察它是否随着请求延迟一起上升,并在流量下降后恢复。
典型的磁盘瓶颈通常同时出现以下变化:
- p95、p99 延迟持续升高,而不是只有一个瞬时尖峰。
await明显高于低流量基线。aqu-sz持续增加,流量下降后才逐渐回落。%util长时间接近高位。- 读写请求量或数据库日志写入量明显增加。
- CPU 的用户态和内核态没有同步达到极高水平。
- 可用内存没有明显耗尽,swap 活动不明显。
- 网络吞吐和丢包没有达到异常程度。
需要注意,%util 接近 100%并不等于一定存在响应瓶颈。现代多队列存储可以在设备忙碌比例较高时仍保持较低延迟;相反,虚拟化存储也可能在 %util 不高时出现较长的 I/O 等待。因此,await、队列和应用尾部延迟必须一起看。
CPU 指标如何排除误判
使用 vmstat 可以同时观察运行队列、阻塞任务和 I/O wait:
vmstat 1 10
重点关注:
r:处于可运行状态、等待 CPU 调度的任务数。b:处于不可中断睡眠状态的任务数,常见于等待 I/O 的任务。us:用户态 CPU 使用率。sy:内核态 CPU 使用率。wa:CPU 等待 I/O 的时间比例。si、so:swap 换入和换出活动。
如果请求变慢时 us 或 sy 长时间接近 CPU 能力上限,同时 r 明显增加,而磁盘 await 和队列没有同步升高,更像是 CPU 不足。此时更换 NVMe通常不会解决主要问题。
wa 高也不能独立证明磁盘故障。它只能说明 CPU 有时间在等待 I/O,等待对象可能是本地块设备、网络存储或其他阻塞操作。必须结合 iostat 中具体设备的等待时间和队列变化。
内存指标如何排除误判
先查看内存总览:
free -m
必要时结合:
sar -r -W 1 10
高并发场景下,内存不足可能间接制造“磁盘变慢”的假象。原因是系统开始回收页面、频繁换入换出,应用工作集无法稳定留在内存中。
更接近内存瓶颈的表现包括:
available持续下降。si、so或sar -W中的换入换出活动持续增加。- 应用进程的主要缺页明显增多。
- 磁盘读写量上升,但这些 I/O 并不对应数据库、日志或业务文件的正常访问。
- CPU 使用率未必很高,但响应时间随并发快速恶化。
如果换入换出活跃,磁盘 await 也随之升高,首先应处理内存压力和应用工作集,而不是简单地把普通 SSD 换成 NVMe。NVMe可能降低换页等待,但不能替代足够的内存。
用联动数据判断是否真的是磁盘瓶颈
下面是一组模拟监控数据,用来说明判断过程。数据仅用于展示分析方法,不代表某台香港服务器的实测结果。

| 阶段 | 请求数/秒 | p95 延迟 | 5xx/超时 | 磁盘 await | I/O 队列 | %util | CPU wa | 可用内存 | 网络吞吐 |
|---|---|---|---|---|---|---|---|---|---|
| 基线 | 900 | 160 ms | 0.1% | 3 ms | 0.4 | 42% | 2% | 8.6 GB | 180 Mbps |
| 峰值前段 | 1,300 | 420 ms | 0.3% | 12 ms | 3.1 | 78% | 8% | 8.4 GB | 255 Mbps |
| 峰值阶段 | 1,600 | 1.9 s | 1.8% | 41 ms | 11.8 | 99% | 21% | 8.3 GB | 310 Mbps |
| 流量恢复 | 920 | 210 ms | 0.2% | 4 ms | 0.6 | 48% | 3% | 8.2 GB | 185 Mbps |
这组数据中,响应延迟、错误率、await、队列长度和 %util在峰值阶段同步恶化,流量下降后又接近基线;CPU 用户态没有达到极高水平,内存和网络没有出现同幅度异常。因此,可以把磁盘 I/O列为首要怀疑对象。
但如果只有 %util从 40%升到 99%,而 p95、p99几乎不变,就不能把它称为用户可感知的磁盘瓶颈。磁盘忙碌不一定等于请求在等待,真正需要确认的是等待时间和业务延迟是否同步变化。
通过进程级 I/O 找到制造队列的进程
系统级指标只能告诉你“哪个设备繁忙”,还要确认是哪个进程产生了压力:

pidstat -d 1 10
可以关注:
kB_rd/s:进程每秒读取的数据量。kB_wr/s:进程每秒写入的数据量。iodelay:进程因 I/O 产生的延迟情况,字段含义以当前版本输出为准。
如果数据库进程的写入量、I/O 延迟与请求 p99同步升高,可能是事务日志、检查点或随机写入导致存储等待。如果是日志采集、压缩任务或备份进程突然占满写带宽,则问题不一定是业务磁盘选型,而可能是后台任务与业务流量发生竞争。
还要确认业务数据究竟位于哪个设备:
findmnt -T /var/www
lsblk -o NAME,ROTA,TYPE,MODEL,TRAN,SIZE,MOUNTPOINT
/var/www只是示例路径,应替换为实际站点数据、数据库数据或日志所在路径。ROTA=0通常说明设备被系统识别为非旋转介质,但它不能单独证明设备一定是物理 NVMe;虚拟化环境可能隐藏底层存储细节。判断时应以实际挂载卷的延迟和业务表现为准。
排除其他瓶颈后再给磁盘定性
CPU 瓶颈
CPU更可能是主因的组合是:
us、sy持续高位。vmstat的r长期大于可用 CPU 并行处理能力。- 应用线程处于运行队列,而不是大量阻塞等待。
- 磁盘
await、队列长度接近基线。 - 降低请求计算量后,延迟明显恢复。
常见诱因包括复杂序列化、压缩、模板渲染、加密计算和业务代码循环。此时提高磁盘随机 I/O能力,通常只能改善少量读写等待,无法消除 CPU 排队。
内存瓶颈
内存更可能是主因的组合是:
available明显下降。- swap持续读写。
- 应用进程频繁发生页面回收或缺页。
- 磁盘读写量增加,但与业务请求类型不匹配。
- 并发降低后,内存回收压力和响应时间同时下降。
需要把“业务文件 I/O”和“内存回收产生的 I/O”区分开。后者会让磁盘指标变差,但根本原因是内存容量、缓存策略或进程工作集。
网络瓶颈
网络问题常见的联动表现是:
- 服务器出口吞吐接近配置上限。
- 网卡统计中出现持续丢包或错误。
- TCP重传、连接建立失败或连接排队增加。
- 静态资源和大响应接口的耗时增长更明显。
- 服务器端应用处理时间正常,但客户端看到的总耗时变长。
可以先观察网络接口统计:
sar -n DEV 1 10
ip -s link
ss -s
如果接口流量、丢包或连接数异常,而磁盘 await保持稳定,那么不应优先更换存储。还要区分服务器处理时间、首字节时间和完整响应时间:只有完整响应变慢,可能是网络传输或响应体过大;如果首字节时间已经变慢,则应继续看应用、数据库和磁盘。
应用层瓶颈
当系统指标都没有明显异常,但请求仍然变慢,问题可能在应用层:
- 工作线程或协程池已耗尽。
- 连接池不足,排队时间增加。
- 应用内部锁竞争。
- 单个接口执行了过多计算或串行调用。
- 下游服务响应变慢。
- 日志同步写入或序列化耗时增加。
这类问题通常表现为应用内部排队时间上升,但操作系统磁盘队列并不明显。需要把请求拆分为排队、应用执行、数据库调用和网络发送几个阶段,而不是用服务器整体负载替代应用监控。
数据库瓶颈
数据库问题与磁盘问题经常同时出现,但两者不是同一个结论。建议同时观察:
- 活跃连接数和连接池等待。
- 慢查询数量及执行时间。
- 行锁、表锁或事务锁等待。
- 提交、回滚和日志写入延迟。
- 缓存命中情况。
- 数据库进程的读写 I/O和等待时间。
如果数据库锁等待升高,但磁盘 await没有变化,优先排查事务范围、索引和并发访问。如果提交延迟、数据库日志写入和磁盘写等待同时升高,才更支持“数据库 I/O受存储能力限制”的判断。
使用 fio 做补充验证时要控制影响范围
系统监控反映真实业务状态,fio适合补充验证存储在特定访问模式下的能力,但不能用它的峰值结果直接代替网站性能测试。
写入型测试会改变目标卷内容并消耗 I/O资源,因此必须满足以下条件:
- 优先使用隔离测试卷、快照或非生产环境。
- 测试目录不能存放业务数据、数据库文件或唯一副本。
- 执行前确认有可恢复备份,并评估测试对正在运行业务的影响。
- 预留足够空间,避免因测试文件导致文件系统容量不足。
- 记录测试的读写比例、块大小、队列深度和并发数。
- 测试结束后,确认路径和文件归属,再按既定保留策略清理测试文件。
例如,在已经确认的隔离测试目录中,可以用混合随机 I/O进行一组参考测试:
fio --name=web-mix \
--filename=/srv/iotest/fio.test \
--size=4G \
--time_based \
--runtime=60s \
--rw=randrw \
--rwmixread=70 \
--bs=4k \
--ioengine=libaio \
--iodepth=16 \
--numjobs=1 \
--direct=1 \
--group_reporting
这个示例模拟约 70%读取、30%写入的 4 KiB 随机访问。实际参数应根据业务观测调整:
- 站点主要读取小对象,可提高读比例。
- 数据库事务日志和会话写入明显时,应重点观察混合写入。
- 应用并发较低时,不要使用过大的
iodepth,否则测到的是人为制造的排队。 - 数据库大量使用同步提交时,还需要单独设计同步写入测试,不能用普通随机写结果代替。
结果中应重点看:
- IOPS和带宽是否满足业务所需。
- 平均延迟与 p95、p99延迟是否随队列深度快速上升。
- 混合读写时,写入是否拖高读取延迟。
- CPU使用率是否因测试工具本身过高。
- 在持续测试后,延迟是否比刚开始明显恶化。
fio显示的顺序读写带宽很高,并不代表高并发网站一定快。动态站点更常见的是小块随机读写、元数据访问、数据库日志和多进程并发,真正相关的往往是尾部延迟和队列控制能力。
什么时候高并发站点应优先考虑 NVMe
当完成前面的关联判断后,如果确认瓶颈主要来自存储,可以把 NVMe作为优先方向,但应按业务访问模式选择,而不是只看“NVMe”这几个字。

更适合优先评估 NVMe的情况包括:
- 高并发请求包含大量 4 KiB或类似大小的随机读写。
- 数据库提交、日志写入或会话写入造成持续 I/O等待。
- 磁盘
await和队列长度会随并发明显上升。 - CPU、内存和网络仍有余量。
- 更换或增加应用层缓存后,磁盘等待仍然存在。
- 业务更关心 p95、p99延迟,而不仅是顺序读写带宽。
以下情况则不应仅凭高并发就直接更换 NVMe:
- 主要瓶颈是 CPU计算、应用锁或数据库锁等待。
- 内存不足导致系统频繁换页。
- 网络吞吐、丢包或连接排队已成为主要问题。
- 应用线程池或数据库连接池先达到上限。
- 磁盘
await在高流量期间仍接近基线,只有应用响应变慢。
磁盘选型常见误区
只看顺序读写带宽。 大文件顺序读写的结果,不能代表数据库日志、小文件和随机访问的表现。应同时比较随机 IOPS、混合读写延迟和高队列深度下的 p99。
只看设备名称。 系统显示为 NVMe,不等于业务一定获得稳定的低延迟。虚拟化存储、共享资源、队列限制和持续写入策略都会影响实际结果。应测试真实挂载卷,并观察持续运行期间的延迟变化。
只做空盘测试。 空盘、低并发、单进程测试容易得到理想结果。业务数据、日志、数据库缓存和并发写入出现后,结果可能完全不同。测试应尽量使用接近业务的数据规模和访问比例。
只看平均延迟。 平均值可能只有几毫秒,但少量请求已经达到数百毫秒甚至数秒。高并发网站更应关注 p95和p99,以及它们是否随队列长度同步恶化。
把 NVMe当成数据库优化方案。 NVMe可以降低存储等待,但不能修复缺失索引、长事务、锁竞争、连接池不足和不合理查询。存储升级后仍应复查数据库等待类型。
复测时只改变一个主要变量
如果判断结果指向磁盘,复测时不要同时修改存储、应用缓存、数据库参数和并发模型,否则无法知道延迟改善来自哪里。更换存储介质或迁移数据后,至少保持以下条件一致:
- 相同的请求数量、接口比例和并发递增方式。
- 相同的数据集规模。
- 相同的冷缓存或热缓存状态。
- 相同的测试时长和观察窗口。
- 相同的压测端和网络环境。
- 相同的应用、数据库和日志配置。
复测期间同时记录下列组合:
| 观察组合 | 主要判断 |
|---|---|
p95/p99、await、I/O 队列、%util | 判断磁盘等待是否与业务尾部延迟同步 |
us、sy、r、wa | 区分 CPU排队与 I/O等待 |
available、swap读写、缺页 | 排除内存压力造成的伪磁盘瓶颈 |
| 吞吐、丢包、重传、连接数 | 排除网络传输和连接排队 |
| 应用排队、执行时间、连接池等待 | 定位应用层资源耗尽 |
| 数据库锁等待、慢查询、提交延迟 | 区分数据库逻辑瓶颈与数据库存储瓶颈 |
例如,复测后磁盘 await从 40 毫秒降到 8 毫秒,I/O 队列明显回落,p99从 2 秒降到 600 毫秒,同时 CPU、内存、网络和数据库锁等待基本不变,这种结果较能支持存储升级有效。若 fio结果改善明显,但真实请求 p99几乎不变,则应回到应用线程池、数据库锁、缓存命中率和网络发送阶段继续排查。
下一次遇到香港服务器高并发响应变慢,建议不要只截图一个 CPU或磁盘指标,而是在同一时间轴上同时保留:请求 p95/p99、错误率、磁盘 await、I/O 队列、CPU us/sy/wa、内存 available/swap、网络吞吐与丢包,以及应用和数据库的等待时间。只有这组指标指向同一个瓶颈,才适合把 NVMe作为高并发站点的优先磁盘方案。



