我们聘请了一位顾问来帮助我们增加 MySQL 集群的容量,他做的第一件事(几乎是唯一的一件事)就是测量我们服务器的磁盘 i/o 速度。
我对与我们现有的类似系统上的磁盘 i/o 的比较很感兴趣:
- 我们的 MySQL 服务器是运行在 32 位 VMWare ESX 3.5 上的虚拟服务器,带有 SCSI SAN(Raid 5),虚拟服务器本身运行 Debian Etch 和 MySQL 版本 5.0.32
在 MySQL 框上运行以下命令为我提供了这些结果(顾问将其描述为“非常慢”):
time dd if=/dev/zero of=OUT.tmp bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 71.3347 seconds, 14.7 MB/s
real 1m13.596s
user 0m0.052s
sys 0m56.932s
time dd if=OUT.tmp of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 21.8202 seconds, 48.1 MB/s
real 0m21.902s
user 0m0.012s
sys 0m7.948s
这些结果确实“非常慢”吗?
我有兴趣比较其他人在其专用的 MySQL 机器上使用这两个命令所获得的结果 - 特别是如果它是一个 32 位虚拟机。
答案1
需要注意的是,您的 dd 命令不会绕过操作系统的文件系统缓存。这意味着您将根据其他情况获得不同的结果,并且您会注意到随着输出大小的增加(从而耗尽您的 fs 缓存),性能会有显著的变化
添加“oflag=direct”以绕过输出文件上的文件系统缓存,例如
time dd if=/dev/zero of=OUT.tmp bs=1M count=1000 oflag=direct
您可以使用 iflag=direct 绕过文件系统缓存进行读取
此外,您的性能会因块大小而有很大差异。虽然 1M 对于测试顺序写入来说是一个很好的权衡,但除非您的应用程序写入 1M 块,否则它不会代表您的实际性能。
总体而言,这些吞吐量数据非常糟糕 - 单个 SATA 驱动器(例如 Seagate ES.2 驱动器)在驱动器启动时可以达到 105MB/秒的顺序写入峰值,并且在整个驱动器上可以维持约 60MB/秒。
最后,一般的数据库“最佳实践”建议避免将 RAID5/6 作为数据库的底层系统,因为奇偶校验写入会导致相对较高的开销(不是实际的奇偶校验计算本身,这在硬件上相当便宜,而是在写出新的奇偶校验时必须进行额外的读写)。
答案2
这是我的 mysql 服务器的结果。它是 64 位的,不是虚拟机,所以不确定它到底有多大用处,但差别非常大。
time dd if=/dev/zero of=OUT.tmp bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 5.72139 s, 183 MB/s
0.00s user 1.55s system 27% cpu 5.725 total
time dd if=OUT.tmp of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 0.432328 s, 2.4 GB/s
0.00s user 0.45s system 103% cpu 0.436 total
答案3
在大多数情况下,你还应该比较随机 io [例如邦尼++] 不仅仅是线性读/写。或者也许它是一个大数据接收器,它获取日志并存储在未索引的巨大表中?
dd“benchmark”的结果
szcapp1:/mnt/big/tmp# time dd if=/dev/zero of=OUT.tmp bs=1M count=1000
time dd if=OUT.tmp of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 4.26186 s, 246 MB/s
real 0m4.563s
user 0m0.001s
sys 0m2.255s
szcapp1:/mnt/big/tmp# time dd if=OUT.tmp of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 0.457162 s, 2.3 GB/s
real 0m0.459s
user 0m0.000s
sys 0m0.459s
szcapp1:/mnt/big/tmp#
戴尔 poweredge 2950 上的 64 位 linux,5x 台式机 500GB SATA 磁盘上的 perc6 raid 10。16GB 内存,2x 四核 2.66GHz。但是嘿!这没有意义 - 这些数据适合 raid 控制器的缓存内存中的 1/4,其余部分 - 位于系统内存中。
你的结果确实很慢。上面在 Linux 上运行的虚拟机的结果 [ vmware server 2.0 下的 32 位 Linux 客户机 ]:
vfeed0:/tmp# time dd if=/dev/zero of=OUT.tmp bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 15.996 s, 65.6 MB/s
real 0m16.043s
user 0m0.016s
sys 0m13.117s
vfeed0:/tmp# time dd if=OUT.tmp of=/dev/null bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 0.49413 s, 2.1 GB/s
real 0m0.505s
user 0m0.000s
sys 0m0.500s
vfeed0:/tmp#
请记住,读取性能是假的 - 它是从缓存中读取的 - 如果不是从客户机的缓存中读取,那么肯定是从 vmware 主机的缓存中读取的。
答案4
与您的原始问题有些不同;但 SAN 供应商对“RAID 5 速度慢”的回应是转换为 RAID 1 或 RAID 10。还请考虑 VMFS 对齐(PDF)可能会严重影响性能。