硬件升级并迁移至虚拟机后出现 MySQL 性能问题

硬件升级并迁移至虚拟机后出现 MySQL 性能问题

最近,我们在服务器上运行了一些(安全)更新并重新启动了机器。由于 GPU(集成在 CPU 中)出现问题,我们的开发服务器无法再上线。我们更换(并升级)了该机器上的硬件,并将原来的裸机转换为 VM(KVM),以便我们以后可以将其从 CentOS5 升级到 CentOS6。

但是机器本身并未重新安装,所有数据均已保护并以 1:1 的比例复制为(新)虚拟机可以用于启动的新映像。

我们现在遇到的问题是 MySQL 性能。这似乎主要与非常简单的 CREATE TABLE 语句有关。我们无法确定这个问题是否与 MySQL 升级到 5.5.50 或移动到 VM 有关。

问题:

mysql 慢查询日志

# Time: 160610 13:55:50
# User@Host: unittest[unittest] @ localhost [127.0.0.1]
# Query_time: 7.954247  Lock_time: 0.000049 Rows_sent: 0  Rows_examined: 0
use unittest_api_575aaabd9e502;
SET timestamp=1465559750;
-- --------------------------------------------------------

--
-- Table structure for table `customer`
--

CREATE TABLE IF NOT EXISTS `customer` (
  `customer_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `crm_id` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`customer_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=25 ;

(我们的单元测试套件创建了一个数据库结构,这是一个创建的表)

您会注意到创建此表花了将近 8 秒!(我们的测试套件现在只需 2 分钟,而不是 30 秒)

我还通过分析运行了以下查询:

DROP TABLE IF EXISTS `customer`;

set profiling =1;

CREATE TABLE IF NOT EXISTS `customer` (
    `customer_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(255) NOT NULL,
    `crm_id` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`customer_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=25;

set profiling =0;

show profile all for query 1;

输出结果如下: 慢查询 结果各不相同,但我确实看到很多高值(> 1 秒),在我看来,这在负载很少的服务器上绝不会花费超过一秒钟的时间。

我尝试对 my.conf 进行一些更改,但尚未提高性能。我已上传我们的我的cnf以供参考。

有关服务器的一些详细信息:

  • MySQL 5.5.50
  • CentOS 5.11

主持人:

  • i7 6300
  • 32GB 内存
  • 2x 1TB 硬盘

虚拟机:

  • 4 核
  • 16GB 内存

我不敢相信这只是来自裸机 => VM。有人能给我们指明正确的方向吗?如果需要更多信息,请告诉我。

附加信息:

答案1

您没有指定 vdisk 缓存类型,因此 libvirt 假设最安全的缓存方案:directsync,这意味着所有写入都会立即同步到物理磁盘。

对于现代的缓存感知应用程序来说,这种限制性缓存类型通常有些过度,因为现代缓存感知应用程序本身使用写屏障来确保重要的写入同步到磁盘。

请执行下列操作:

  • 关闭你的机器
  • 通过打开其配置virt-manager
  • 选择virtio disk 1,然后在右侧窗格中单击advanced,然后performance options
  • 将缓存类型设置为writeback
  • 最后,重新启动虚拟机。

VM 现在应该快多了。但是,由于您使用的是相当旧的操作系统(CentOS 5.x),请确保在客户操作系统中启用写入屏障。为此,您应该使用 mount 选项挂载客户的文件系统barrier=1(例如:通过 传递它/etc/fstab)。

有关缓存和屏障的其他信息,看看这里

相关内容