笔记: Xen VM 里面的 MySQL 服务器优化


我一直都对公司 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 的额外开销还真不小. 有机会还是把数据库直接跑在真刀真枪的物理层吧.

🙂

,