上一篇 下一篇 分享链接 返回 返回顶部

高并发站点响应变慢,香港服务器如何判断磁盘I/O瓶颈?

发布人:Minchunlin 发布时间:2026-10-05 18:14 阅读量:12

高并发站点响应变慢时,不能看到服务器的磁盘 %util 接近 100% 就直接认定是磁盘瓶颈,也不能因为更换了 NVMe 后延迟下降,就忽略应用、数据库、内存和网络的影响。可靠的判断方式,是在同一个观察时间窗口内,把请求延迟、错误率、磁盘等待、I/O 队列、CPU、内存和网络指标放在一起对照。

如果响应时间的 p95、p99 与磁盘 await、队列长度同步升高,CPU 使用率和内存状态相对稳定,网络也没有达到上限,那么磁盘 I/O 瓶颈的可能性较高。只有完成这种关联验证后,才能判断香港服务器是否需要优先选择 NVMe,而不是仅凭单项指标或存储介质名称做决定。

先建立可比较的观察窗口

性能判断最容易出错的地方,是把不同时间、不同流量和不同缓存状态下的数据直接比较。一次有效的测试,至少要记录以下几个阶段:

  1. 基线阶段:在正常访问量下持续观察 5~10 分钟。
  2. 升压阶段:逐步提高并发或请求速率,避免瞬间压垮服务。
  3. 峰值阶段:保持目标压力 10~15 分钟,观察指标是否持续恶化。
  4. 恢复阶段:停止压测或恢复正常流量,确认队列和延迟能否回落。

测试环境应尽量保持以下条件一致:

  • 使用同一台香港服务器、同一挂载卷和同一套应用版本。
  • 请求比例、接口类型、响应数据量和并发模型保持一致。
  • 明确测试是“冷缓存”还是“热缓存”,两种状态不要混在一起比较。
  • 避开备份、日志轮转、批量导入、定时任务等会额外产生 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/超时磁盘 awaitI/O 队列%utilCPU wa可用内存网络吞吐
基线900160 ms0.1%3 ms0.442%2%8.6 GB180 Mbps
峰值前段1,300420 ms0.3%12 ms3.178%8%8.4 GB255 Mbps
峰值阶段1,6001.9 s1.8%41 ms11.899%21%8.3 GB310 Mbps
流量恢复920210 ms0.2%4 ms0.648%3%8.2 GB185 Mbps

这组数据中,响应延迟、错误率、await、队列长度和 %util在峰值阶段同步恶化,流量下降后又接近基线;CPU 用户态没有达到极高水平,内存和网络没有出现同幅度异常。因此,可以把磁盘 I/O列为首要怀疑对象。

但如果只有 %util从 40%升到 99%,而 p95、p99几乎不变,就不能把它称为用户可感知的磁盘瓶颈。磁盘忙碌不一定等于请求在等待,真正需要确认的是等待时间和业务延迟是否同步变化。

通过进程级 I/O 找到制造队列的进程

系统级指标只能告诉你“哪个设备繁忙”,还要确认是哪个进程产生了压力:

通过进程级 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配图

更适合优先评估 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作为高并发站点的优先磁盘方案。