为什么连接到我的InnoDB数据库经常延迟整数秒?
一些背景
我有一个非常小的MySQL数据库,包括一个表'用户' (150条记录)和表格连接' (增长到150 * 150记录)。表和索引总计不到5 MB。
当用户处于活动状态时,在'连接中有5-50条记录。改变(重量改变)或添加(如果它们还没有存在)。整个应用程序运行平稳,加载时间低于~100 ms。
除非他们不是。
详情
即使是非常小的负载,页面加载时间也会从60毫秒增加到1,000毫秒到10,000毫秒之间。
在Symfony中使用分析器,我可以确定' getRepository'的延迟时间为95 +%。语句,而查询每个查询只需要约1毫秒。这让我相信连接到数据库是一个缓慢的行动。我写了一个定期连接到数据库的辅助脚本来测试这个理论。
<?php // call this script commandline using watch
$a = microtime(true);
$pdo = new PDO('mysql:host=127.0.0.1;dbname=mydb','myuser','mypass');
file_put_contents( 'performance.txt', (microtime(true)-$a).PHP_EOL, FILE_APPEND );
神秘
连接到数据库时始终持续1-3毫秒,或1,001-1,003毫秒,或2,001-2,003毫秒,或3,001-3,003毫秒等。整数秒,加上正常时间。两者之间没有任何东西,比如400毫秒或800毫秒。由于没有写入,连接几乎立即进行。只要通过应用程序执行了一些写操作,就会达到更高的数字。
导致此行为的原因是什么? InnoDB page_cleaner似乎每1000毫秒完成一次工作,也许是解释的一部分?
更重要的是,我该如何解决这个问题?我正在考虑切换到MEMORY表,但我要说更优雅的选项应该可用。
修改
根据要求,the variables and global status。
附加信息:我直接连接到127.0.0.1(参见上面的代码片段),我测试了skip-name-resolve标志无效。顺便说一下,它是Debian服务器。
编辑2
我发现延误时间分别为1,3,7或15秒。注意模式:1秒,+ 2s,+ 4s,+ 8s。这真的看起来像一些超时问题......
答案 0 :(得分:1)
反向dns查找通常需要很长时间。随着host_cache
的大小,它可以给出不稳定的行为。
将其添加到my.cnf
将其关闭[mysqld]
skip-name-resolve
请注意,如果您更改此权限,则所有授权必须通过IP而不是名称。
还有更多内容需要阅读