我正在尝试虚拟化我的percona服务器5.5.32-31.0并且看到奇怪的东西。在虚拟化框中,插入(实际上所有)查询都很慢,但这是查询的“查询结束”步骤,它会消除响应时间。
让我退后一步,这是我的测试表:
CREATE TABLE `mysql_io_test` (
`id` int(11) NOT NULL,
`time_diff` char(8) COLLATE utf8mb4_unicode_ci NOT NULL,
`data` char(100) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
运行此:
set profiling = 1;
insert into util.mysql_io_test select 999, '99:99:99', 'ABCDEFGHIJ';
set profiling = 0;
我明白了:
starting, 0.000031
checking permissions, 0.000005
Opening tables, 0.000530
System lock, 0.000008
init, 0.000008
optimizing, 0.000002
executing, 0.000095
end, 0.000005
query end, 0.067226
closing tables, 0.000013
freeing items, 0.000039
logging slow query, 0.000002
cleaning up, 0.000005
在未虚拟化的盒子上(使用较旧的数据库:v5.5.27-28.1)我得到了更合理的信息:
starting, 0.000039
checking permissions, 0.000004
Opening tables, 0.000013
System lock, 0.000009
init, 0.000008
optimizing, 0.000002
executing, 0.000038
end, 0.000003
query end, 0.000143
closing tables, 0.000008
freeing items, 0.000018
logging slow query, 0.000001
cleaning up, 0.000002
我不是很熟悉这些步骤的真正意义,但我真的不知道为什么“查询结束”会很慢。手册(http://dev.mysql.com/doc/refman/5.5/en/general-thread-states.html)没有提供更多信息。我会尝试回到旧版本并明天挖掘代码,但我想有人可能已经看过这个,并且可能能够为我揭开这个谜团的一些亮点。
其他一些可能有用的东西:
答案 0 :(得分:0)
对于遇到这种情况的任何其他人,我想我已经跟踪了这个问题。我已将innodb_flush_method从常规框中的ALL_O_DIRECT更改为VM上的O_DIRECT,因为mysql正在发出此警告:
kernel: EXT4-fs (vdb1): Unaligned AIO/DIO on inode 17565314 by mysqld; performance will be poor.
恢复到ALL_O_DIRECT会使警告重新开始显示 - 但在“查询结束”步骤中我的表现要好100倍,所以我现在要继续使用它。
我希望这可以帮助遇到同样问题的其他人。