如何从vdbench 日志中探测 IO 出现了超时/中断?

146 阅读8分钟

前言

在测试分布式文件系统的工具中,常用的一种工具就是vdbench。

同时对于分布式文件系统的高可用以及高可靠来说,我们经常人为对存储系统注入故障。在故障注入期间,我们不仅要关注 IO 数据的正确性(高可靠),还应该关注IO的高可用(IO中断时间不能超过业务/系统所能容忍的时间)。

那么,我们如何通过vdbench的日志来判断后端是否发生了故障,以及故障导致的IO中断的具体时长呢?

两个重要的日志文件

在vdbench 每一次执行的目录下,都有 errorlogflatfile 两个日志文件。

比如 执行一次 vdbench:
~/workspace/vdbench/vdbench -jn -o /tmp/tmp.ED3oNdKf0e/output -f /tmp/tmp.ED3oNdKf0e/basic_io_4fault_injection fsd1_mountpoint=/mnt/SQKhf/ duration=900

在上述vdbench 执行完成之后, 在 -o 参数所指定的目录下 /tmp/tmp.ED3oNdKf0e/output 存在着vdbench 的关键日志文件。

errorlog 日志文件分析

摘取一段 errorlog 日志如下:

15:46:46.933 localhost-0Created new mmap file/tmp/vdbench.pid22619.fsd1.mmap.0 mmap size49.098k  
15:46:46.933 localhost-0Allocating Data Validation map50,276 one-byte entries for each 4,096-byte block.  
15:46:46.933 localhost-0Created new DV map: fsd1 size205,926,400 bytes; key block size4096entries50,275  
15:46:46.937 localhost-0Creating journal file /root/fsd1.jnl  
15:46:46.939 localhost-0Writing Data Validation map to /root/fsd1.jnl  
15:46:47.042 localhost-0Writing Data Validation map to /root/fsd1.map  
15:47:31.006 timeout=1 value exceeded for fsd=fsd1 on slave=localhost-0 for   1 seconds.  
15:47:33.006 timeout=1 value exceeded for fsd=fsd1 on slave=localhost-0 for   3 seconds.  
15:47:35.012 timeout=1 value exceeded for fsd=fsd1 on slave=localhost-0 for   5 seconds.  
15:47:37.005 timeout=1 value exceeded for fsd=fsd1 on slave=localhost-0 for   7 seconds.  
15:47:38.007 timeout=1 value exceeded for fsd=fsd1 on slave=localhost-0 for   8 seconds.  
15:47:40.006 timeout=1 value exceeded for fsd=fsd1 on slave=localhost-0 for  10 seconds.  
15:47:41.008 timeout=1 value exceeded for fsd=fsd1 on slave=localhost-0 for  11 seconds.  
15:47:43.007 timeout=1 value exceeded for fsd=fsd1 on slave=localhost-0 for  13 seconds.  
......  

上面的日志可以看到有较多的 timeout=1 value exceeded,这意味着该FSD IO响应时间超过1秒在连续的统计周期1s内,目标FSD的完成IO数量为零,并持续了至少13s。 这也表明后端存储出现了相应的故障导致IO中断(客户端即网络因素暂不考虑),若非人为预期的故障注入,需要调查后端存储是否出现了高可用问题。(PS:该阈值可根据 vdbench 执行参数 timeout 调整,比如timeout=(1,90) 表示IO超时1s 发出告警,超过90s 会终止vdbench 进程)。

flatfile 日志文件分析

对应上述errorlog 日志出现“timeout”时,flatfile 日志如下,其数据来自线程定时读取的各IO线程统计结果,对于IO中断时间的判断比较关键的几列数据分别为

  • Rate : 总IO完成速率(IOPS)
  • Reqrate : 请求发送速率(可能包含重试)
  • Resp(ms) : 总体平均响应时间
  • Read_rate:读IO完成速率
  • Write_rate:写IO完成速率
  • Read_resp:读IO平均响应时间
  • Write_res:写IO平均响应时间

下面,我仅粘贴出和IO中断相关的列进行分析,例子如下:

Time                   Interval    Rate       Reqrate    Resp(ms)      Read_rate    Write_rate   Read_resp    Write_resp  
07/02/2025-15:01:21-CST   1        513         9999988    10.6295          343            0      11.9906       3.3331
07/02/2025-15:01:22-CST   2        843         9999988     9.0279          543            0      10.1938       2.8051
07/02/2025-15:01:23-CST   3        846         9999988     9.1067          564            0       9.9486       3.5630
......
07/02/2025-15:01:37-CST   17       826         9999988     9.2634          531            0      10.4557       2.5029
07/02/2025-15:01:38-CST   18       565         9999988    12.7210          354            0      15.9799       2.6742
07/02/2025-15:01:39-CST   19       520         9999988    15.3111          343            0      18.7140       7.5279
07/02/2025-15:01:40-CST   20       728         9999988    10.4209          472            0      11.5669       4.0718
07/02/2025-15:01:41-CST   21       723         9999988     9.9312          461            0      11.0244       3.4462
07/02/2025-15:01:42-CST   22       0           9999988     0.0000            0            0       0.0000       0.0000 <== RateResp从这里降为0
07/02/2025-15:01:43-CST   23       0           9999988     0.0000            0            0       0.0000       0.0000
07/02/2025-15:01:44-CST   24       0           9999988     0.0000            0            0       0.0000       0.0000
07/02/2025-15:01:45-CST   25       0           9999988     0.0000            0            0       0.0000       0.0000
07/02/2025-15:01:46-CST   26       0           9999988     0.0000            0            0       0.0000       0.0000
07/02/2025-15:01:47-CST   27       0           9999988     0.0000            0            0       0.0000       0.0000
.....
07/02/2025-15:03:21-CST   121      0           9999988     0.0000            0            0       0.0000       0.0000
07/02/2025-15:03:22-CST   122      342         9999988    16.6358          220            0      14.6156      24.1906 <== 从这里开始恢复正常
07/02/2025-15:03:23-CST   123      310         9999988    21.6378          197            0      15.9209      27.4677
07/02/2025-15:03:24-CST   124      392         9999988    19.6406          261            0      10.4393      26.6481
07/02/2025-15:03:25-CST   125      615         9999988    12.3238          394            0      13.5716       3.7917
07/02/2025-15:03:26-CST   126      645         9999988    11.2375          421            0      11.7855       4.5078
07/02/2025-15:03:27-CST   127      662         9999988    10.9222          441            0      11.2563       4.3261

从上面的日志信息可以看到 在 07/02/2025-15:03:22-CST 出现 IOPS 和 Resp(ms) 都降为0, 在 07/02/2025-15:03:22-CST IO 恢复,和前面的errorlog 日志相符。

特殊的情况

但是,在实际测试中,我发现,即便后端存储明确注入了故障,errorlog 日志没有任何“timeout=xxx value exceeded”日志出现。以某次 vdbench 执行日志为例:

errorlog 日志如下:

❯ cat errorlog.html
<title>Vdbench output/errorlog.html</title><pre>
Vdbench error log, created 15:00:34 Jul 02 2025 CST 
Error log. If there are no error messages beyond this line then there were no Data Validation or I/O errors.
15:00:35.331 localhost-0: Created new mmap file: /tmp/vdbench.pid616799.fsd1.mmap.0 mmap size: 49.098k
15:00:35.332 localhost-0: Allocating Data Validation map: 50,276 one-byte entries for each 4,096-byte block.
15:00:35.332 localhost-0: Created new DV map: fsd1 size: 205,926,400 bytes; key block size: 4096; entries: 50,275
15:00:35.336 localhost-0: Creating journal file /root/fsd1.jnl
15:00:35.338 localhost-0: Writing Data Validation map to /root/fsd1.jnl
15:00:35.442 localhost-0: Writing Data Validation map to /root/fsd1.map
15:01:18.321 localhost-0: Writing Data Validation map to /root/fsd1.jnl
15:01:18.422 localhost-0: Writing Data Validation map to /root/fsd1.map
15:01:18.643 localhost-0: 15:01:18.643 Total amount of key blocks read and validated:        0; key blocks marked in error:    0 
15:06:20.116 localhost-0: Writing Data Validation map to /root/fsd1.jnl
15:06:20.216 localhost-0: Writing Data Validation map to /root/fsd1.map
15:06:20.425 localhost-0: 15:06:20.424 Total amount of key blocks read and validated:   80,707; key blocks marked in error:    0

flatfile 信息如下:

❯  awk -f parse_flatfile.awk flatfile.html
Time                  Interval     Rate       Reqrate     Resp(ms)     Read_rate      Write_rate   Read_resp    Write_resp  
07/02/2025-15:01:40-CST   20       728         9999988    10.4209          472            0      11.5669       4.0718
07/02/2025-15:01:41-CST   21       723         9999988     9.9312          461            0      11.0244       3.4462
07/02/2025-15:01:42-CST   22       0           9999988     0.0000            0            0       0.0000       0.0000
07/02/2025-15:01:43-CST   23       0           9999988     0.0000            0            0       0.0000       0.0000
....
07/02/2025-15:02:09-CST   49       0           9999988     0.0000            0            0       0.0000       0.0000
07/02/2025-15:02:10-CST   50       0           9999988     0.0000            0            0       0.0000       0.0000
07/02/2025-15:02:11-CST   51       0           9999988     0.0000            0            0       0.0000       0.0000  
....  
07/02/2025-15:03:17-CST   117      0           9999988     0.0000            0            0       0.0000       0.0000
07/02/2025-15:03:18-CST   118      100         9999988  7756.4191           64            0    7570.1670   27129.4222
07/02/2025-15:03:19-CST   119      22          9999988     9.8833           15            0       9.4700       9.9524

从上面的日志可以看到,在后端主人故障之后(此次日志未提供),errorlog 中无任何“timeout=xxx value exceeded”字段,而 flatfile 日志中出现了明显的IO中断。

结论

errorlog 日志中 “timeout=xxx value exceeded”表示vdbench IO 在配置timeout时间内没有任何I/O完成,即出现了IO中断/超时。但当errorlog 日志中无该信息时,也并不意味着后端存储系统未出现故障。

flatfile 日志中 Rate 和 Resp(ms) 为0 时,并不能直接标志 IO处于停滞状态。有可能是因为这个时间点实际上没有发起IO请求(或IO请求已完成),导致Rate=0 和 Resp(ms)=0。

所以,如果要通过检测errorlog 日志来确认后端故障导致IO中断时长,需要保证 vdbench 的IO在故障发生时,一定有IO请求发出。避免故障注入期间出现测试阶段分段执行(比如前后有格式化、数据验证阶段等)同时增加负载连续性保障。