无法解释 iostat 的 tps 度量

dvo*_*gel 6 linux raid performance iostat

前奏:我使用 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
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)

我正在重新加载的 .sql 文件位于 md2 上的 /home 分区上,而 /var 分区位于 md3 上。我假设由于 MySql 重新生成索引,写入 md3 的块比从 md2 读取的块高得多。然而,我遇到的一个大问题是,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
Run Code Online (Sandbox Code Playgroud)

iostat 手册页说:

tps

指示发送到设备的每秒传输次数。传输是对设备的 I/O 请求。多个逻辑请求可以合并为一个对设备的 I/O 请求。传输的大小不确定。

我不希望它们完全相同,但肯定不会有 864% 的不同!这是由于我对 md 设备的错误配置而导致瓶颈的迹象还是我只是担心什么?

Ric*_*hlv 12

这是一个单一的 iostat 调用,它没有为“每秒”值提供有意义的数据,只有计数器有用——它不能从单个值计算每秒变化,它需要知道两个值和它们之间的时间。要查看真实值,请尝试以下操作:

iostat -d 1 2
Run Code Online (Sandbox Code Playgroud)

第二个输出将是实际值。

从 iostat 联机帮助页:

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


Kam*_*iel 2

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

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