序曲:我使用mysqldump命令甩了一个5.2 GB的数据库。 我在只有512 MB内存的动力不足的虚拟服务器上做了这个。 花了大约一个小时。 我现在正在我的桌面计算机上重新加载该数据库,该计算机具有双核cpu和2 GB内存。 重新加载是在9小时,我不知道它是否接近完成。 大约一年前,我在同一台机器上重新加载了这个数据库,只用了两个小时。 现在和现在的区别在于,我用raid1模式下的两个SATA磁盘replace了我的单个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。 我认为由于MySql重新生成索引,写入md3的块比从md2读取的块要高得多。 然而,我有一个很大的问题是,如何测量md3的tps比sda和sdb的测量值要高得多呢?
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手册页说:
TPS
指出发送给设备的每秒传输数量。 传输是对设备的I / O请求。 多个逻辑请求可以合并为一个I / O请求到设备。 转帐的尺寸不确定。
我不指望他们完全一样,但肯定不会有864%的不同! 这是由于我的md设备configuration不正确,或者我只是不担心的一个瓶颈的迹象?
这是一个单独的iostat调用,它没有为“每秒”值提供有意义的数据,只有计数器是有用的 – 它不能从一个值计算每秒的变化,它需要知道它们之间的两个值和时间。 看到真正的价值,尝试像这样:
iostat -d 1 2
第二个输出将是真实的值。
来自iostat手册页:“iostat命令生成的第一个报告提供了系统启动以来的时间统计数据,每个后续报告涵盖自上次报告以来的时间。
由于传输速率是相同的,所以您提供的输出告诉我,MD层高速caching事务,然后将它们以较大的块写入物理磁盘。
正如您所说,重新加载数据库时看到的缓慢可能是由于索引。 您可以避免这种情况,只需在加载数据时不更新索引,然后在最后重新创build索引。
给定磁盘将支持的事务速率是追踪时间的函数。 对于SATA硬盘来说,这通常在5-8ms左右,所以我期望在每秒125-200次的交易附近。
你看到每个驱动器〜145 tps,所以这似乎很合理。