最近我们在服务器上运行了一些(安全)更新,并重新启动了机器。 由于GPU(集成在CPU中)的问题,我们的开发服务器不再上网了。 我们已经replace(并升级)了该机器上的硬件,并将原来的裸机转换为虚拟机(KVM),以便日后从CentOS5 – > CentOS6升级。
但是机器本身并没有被重新安装,所有的数据都被保护起来,并被复制1:1作为(新)VM可以用来启动的新镜像。
我们现在的问题是MySQL的性能。 它似乎主要与真正简单的CREATE TABLE语句有关。 我们无法find这个问题是与MySQL升级到5.5.50还是迁移到虚拟机有关。
问题:
MySQL的慢,querylog
# 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 ;
(我们的unit testing套件创build一个数据库结构,这是一个创build的表)
你会注意到创build这张表需要花费将近8秒的时间! (我们的testing套件现在需要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进行一些更改,但是我还没有设法提高性能。 我已经上传我们的my.cnf作为参考。
服务器上的一些细节:
主办:
VM:
我不能相信这只是从裸机=>虚拟机。 任何人都可以把我们指向正确的方向吗? 如果需要更多信息,请告诉我。
附加信息:
您没有指定虚拟磁盘高速cachingtypes,因此libvirt正在采用最安全的高速cachingscheme: directsync
,这意味着所有写入都立即同步到物理磁盘。
这种限制性的cachingtypes对于现代的caching感知应用程序来说通常是过度的,它们自己使用写入屏障来确保重要的写入被同步到磁盘。
请执行下列操作:
virt-manager
打开configuration virtio disk 1
,然后在右侧窗格中单击advanced
,然后performance options
writeback
虚拟机现在应该快得多。 但是,由于您使用的是较旧的操作系统(CentOS 5.x),请确保在来宾操作系统中启用写入屏障。 要做到这一点,你应该挂载你的客户的文件系统的barrier=1
挂载选项(例如:通过/etc/fstab
传递它)。
有关caching和屏障的其他信息,请参阅此处