2

我的处境让我很困惑,似乎没有人知道问题出在哪里。

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

在此处输入图像描述

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

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

在此处输入图像描述

我不确定这是什么以及为什么会发生。我以为mysql可能挂了,所以我用syslogs包围了php中的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

但情况似乎并非如此。和syslog 总是紧随其后出现BEFOREAFTER即使我在“睡眠”上看到 mysqladmin 进程列表中的查询。此外,正如您所看到的,它是一个非常简单的读取查询,所以我想某种 mysql 锁不会是问题(因为我认为锁只用于写入)。

从这一点开始,我对如何进行调试有点迷失了。有谁知道这些结果告诉我什么以及我在哪里可以找到解决这个问题的方法?欢迎所有提示!

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

再次; 欢迎所有提示!

4

1 回答 1

0

理想情况下,代码应该在任务完成后关闭连接,或者应该根据如何编写代码的要求重用连接。

如果你想让 MySQL 处理这个任务,我建议检查 wait_timeout 设置/变量。此设置/真实的值以秒为单位。

例如,如果你设置 wait_timeout=10,那么 MySQL 内部的任何连接处于休眠状态超过 10 秒都会被 MySQL 自动关闭。

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

于 2020-07-24T22:12:45.007 回答