如何解决因mysql睡眠而导致的30秒响应时间?

时间:2016-11-21 22:15:41

标签: php mysql linux laravel mysqladmin

我处在一个让我感到困惑的情况,似乎没有人知道问题是什么。

我有一个用php / Laravel编写的网站,它连接到一个mysql服务器。如果我非常快地几次调用api端点(通过快速点击网站按钮大约10-15次),最后几次,呼叫需要很长时间。当它通常持续约200ms时,它突然需要30秒的倍数。因此,一个呼叫需要30秒,另一个(或更多)60,另一个或多个呼叫需要90秒等。所有呼叫都成功结束,但它们只需要很长时间才能完成。

enter image description here

我首先想到它可能是php max_execution_time,所以我把它设置为15.不幸的是,没有变化;通话仍然需要30秒的倍数。另外,如果这是问题,它将返回错误,而在这种情况下,我得到正确的200响应。

经过一些摆弄我跑watch -n 0.3 "mysqladmin processlist"看看mysql是否可能是原因。在长时间通话中,我看到以下内容:

enter image description here

我不确定这是什么以及它为什么会发生。我以为mysql可能会挂起,所以我在php中用syslogs包围了mysql查询,看看代码是否真的挂起了mysql调用:

syslog(LOG_ERR, "BEFORE");
$results = TheTable::where('edg', $edg)->get();
$theResponse = response(json_encode($results), 200)->header('Content-Type', 'application/json');
syslog(LOG_ERR, "AFTER");
return $theResponse

但事实似乎并非如此。即使我在mysqladmin进程列表中看到“sleep”中的查询,BEFOREAFTER系统日志也会立即出现在彼此之后。 此外,你可以看到它是一个非常简单的读取查询,所以我猜某种类型的mysql锁不能成为问题(因为我认为锁只能用于写入)。

从这一点来说,我对如何继续调试这件事感到很失望。有谁知道这些结果告诉我什么以及我在哪里可以找到解决这个问题的方法?欢迎所有提示!

[PS:有关设置的更多信息] 设置比我上面描述的稍微复杂一点,但由于我不认为它与它有任何关系,我保存了最后的信息。我们实际上有两个Ubuntu 16.04服务器,前面有一个负载均衡器。这两个服务器都包含一个mysql服务器,它处于某种主/主同步模式。虽然我觉得在Linux上很舒服,但我没有设置它,我不是一个系统管理员,所以我可能会在那里遗漏一些东西。我问过管理这个设置的人,但他们说问题必须在代码中。我不知道那可能是哪里。

再次;欢迎所有提示!

1 个答案:

答案 0 :(得分:0)

理想情况下,代码应在任务完成后关闭连接,或者应根据编写代码的方式根据需要重新使用连接。

如果您希望MySQL负责此任务,我建议您检查wait_timeout设置/变量。此设置/可验证的值以秒为单位。

例如,如果您将wait_timeout = 10设置为MySQL内处于睡眠状态的任何连接超过10秒钟,则MySQL将自动关闭该连接。

注意:以上设置本质上是全局的或动态的,因此可以在不重启MySQL的情况下进行设置。 示例命令: mysql>设置全局wait_timeout = 10;