前奏:我使用 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,因此这看起来相当合理。