无法解释 iostat 的 tps 测量结果

无法解释 iostat 的 tps 测量结果

前奏:我使用 mysqldump 命令转储了一个 5.2 GB 的数据库。我在一台只有 512 MB 内存的低功率虚拟服务器上执行了此操作。大约花了一个小时。我现在正在我的台式机上重新加载该数据库,该台式机具有双核 CPU 和 2 GB 内存。重新加载已经进行了 9 个小时,我不知道它是否接近完成。大约一年前,我在同一台机器上重新加载了这个数据库,只花了两个小时。当时和现在的区别在于,我用 raid1 模式下的两个 SATA 磁盘替换了我的单个 ATA 硬盘。我知道 raid1 写入速度会更慢(理论上),但绝对不会慢 4.5 倍!所以我打开了 iostat,结果我变得更加困惑。

$ sudo iostat 
Linux 2.6.30-2-amd64 (lukahn)  12/12/2009  _x86_64_ (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           7.13    0.00    1.94   27.96    0.00   62.97

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda             144.02       198.41     11139.44    9322418  523399320
sdb             143.78       165.59     11137.39    7780516  523303000
hda               0.01         0.05         0.00       2492          0
md0               0.66         6.44         0.71     302538      33496
md1               7.32        67.02         7.51    3148938     352960
md2               6.08       240.02        18.95   11277610     890584
md3            1389.80        46.85     11106.55    2201410  521853640
md4               0.41         3.03         0.21     142322       9824

sda 和 sdb 是支持 md 设备的真正 SATA 驱动器,正如您在 /proc/mdstat 中看到的那样:

$ cat /proc/mdstat 
Personalities : [raid0] [raid1] 
md4 : active raid0 sda6[0] sdb6[1]
      48821248 blocks 64k chunks

md3 : active raid1 sda5[0] sdb5[1]
      48829440 blocks [2/2] [UU]

md2 : active raid1 sda4[0] sdb4[1]
      1318358080 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
      48829440 blocks [2/2] [UU]

md0 : active raid1 sda1[0] sdb1[1]
      9767424 blocks [2/2] [UU]

我要重新加载的 .sql 文件位于 md2 上的 /home 分区,而 /var 分区位于 md3 上。我假设写入 md3 的块比从 md2 读取的块高得多,这是因为 MySql 重新生成索引。然而,我最大的疑问是,为什么 md3 的 tps 测量值比 sda 和 sdb 的 tps 测量值高得多?

iostat 的 -m 选项显示,向 md3 和 sda/sdb 写入磁盘的数据量相同(5.55 MB/s):

$ sudo iostat -m
Linux 2.6.30-2-amd64 (lukahn)   12/12/2009  _x86_64_    (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           7.39    0.00    2.00   28.16    0.00   62.44

Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda             145.16         0.10         5.55       4976     267768
sdb             144.90         0.09         5.55       4143     267716
hda               0.01         0.00         0.00          1          0
md0               0.66         0.00         0.00        154         16
md1               7.18         0.03         0.00       1580        172
md2               6.19         0.13         0.01       6153        443
md3            1418.41         0.02         5.53       1146     266994
md4               0.40         0.00         0.00         69          5

iostat 手册页说:

每秒

指示每秒向设备发出的传输次数。传输是对设备的 I/O 请求。多个逻辑请求可以组合成对设备的单个 I/O 请求。传输的大小不确定。

我并不指望它们完全相同,但肯定不会有 864% 的差异!这是由于我对 md 设备配置错误而导致瓶颈的迹象,还是我只是在担心一些小事?

答案1

这是一次单独的 iostat 调用,它不提供“每秒”值的有意义的数据,只有计数器有用 - 它无法根据单个值计算每秒的变化,它需要知道两个值以及它们之间的时间。要查看实际值,请尝试以下操作:

iostat -d 1 2

第二个输出将是真实值。

来自 iostat 手册页:

iostat 命令生成的第一个报告提供了自系统启动以来的统计信息。每个后续报告都涵盖了自上一个报告以来的时间。

答案2

由于传输速率相同,您提供的输出告诉我 MD 层会缓存事务,然后将它们以更大的块形式写入物理磁盘。

正如您所说,重新加载数据库时出现的速度缓慢可能是由于索引造成的。您可以通过在加载数据时不更新索引,然后在最后重新创建索引来避免这种情况。

答案3

给定磁盘支持的事务速率取决于磁道寻道时间。对于 SATA 驱动器,这通常约为 5-8ms,因此我预计每秒的事务数约为 125-200。

您会看到每个驱动器上有 ~145 tps,因此这看起来相当合理。

相关内容