我一直都对公司 Xen VM 的数据库服务器不满, 因为实在是太慢了. 但是几百个 GB 的商业数据我可不敢动, 于是先在测试服务器上证实一下我的想法. 测试环境是:
- Dom0: Debian 6 Xen Hypervisor 64-bit, Xen 4.0
- DomU: Debian 6 64-bit
- MySQL server 5.1, innodb_file_per_table, pool=1GB, log=256MB
- 硬盘就是普通的 SATA 7200RPM, VM 用的是 LVM 分区
然后我用之前写的一个小程序做批量更新, 32K 记录. 缺省配置下, 运行时长达到24分钟, 而优化后则只需要27秒. 差不多60倍?? 我都有点不敢相信了. 下面是对应的配置和测试数据. 每次更改配置后都会重启 MySQL, 因此不大可能是缓存在起作用.
Updating 32606 records (client table), InnoDB table, autocommit=true, file_per_table, pool=1GB, log=256MB
Default(Xen):
real 24m46.195s
TPS 21.9(Xen)With innodb_flush_method=O_DIRECT
real 24m45.024s
TPS 21.95(Xen)With innodb_flush_method=O_DIRECT, innodb_flush_log_at_trx_commit=0
real 0m37.873s
TPS 860.9(Xen)With innodb_flush_method=O_DSYNC, innodb_flush_log_at_trx_commit=0
real 0m27.352s
TPS 1192
看来 innodb_flush_log_at_trx_commit 是关键, 按照文档设置为 0 的话每秒 flush 一次, 而不是每个 transaction.
通过实验, 我的判断基本被验证, 看来 Xen 对于磁盘 IO 的额外开销还真不小. 有机会还是把数据库直接跑在真刀真枪的物理层吧.
🙂