【问题标题】:mysqli_connect() suddenly extremely slowmysqli_connect() 突然非常慢
【发布时间】:2014-01-14 18:01:20
【问题描述】:

我最近在这种情况下没有改变任何东西,但最近我到远程服务器的 mysqli_connect() 非常慢(大约一半的时间达到了 30 秒的最大执行时间)。当它工作时,响应时间在 28 到 30 秒之间。

我已经在两台服务器上重新启动了 MySQL。保存 PHP 脚本的服务器是本地 WAMP 服务器,远程服务器是 LAMP 堆栈。 LAMP 服务器可以很好地提供与 WAMP 服务器请求的信息相同的信息。查询似乎不是问题,而是 mysqli_connect() 似乎是问题:

    $mtime = microtime(); 
    $mtime = explode(" ",$mtime); 
    $starttime = $mtime[1] + $mtime[0]; 
        $this->conn = mysqli_connect($this->host,$this->user,$this->password) or die(mysqli_error($this->conn));
        $etime = microtime(); 
    $etime = explode(" ",$etime); 
    $endtime = $etime[1] + $etime[0]; 
    $totaltime = ($endtime - $starttime);  
    echo('<!--mysqli_connect took: '.$totaltime.' seconds-->');

页面(当它没有为达到 max_execution_time 给出 500 响应时)将显示:

<!--mysqli_connect took: 28.975151777267 seconds-->

远程 LAMP 服务器上会显示相同的代码:

<!--mysqli_connect took: 0.036190032958984 seconds-->

自从它工作以来,我没有更新此代码或进行任何配置更改。除了在 WAMP 服务器上超过 30 秒时超出 max_execution_time 错误之外,我在任何一台服务器上都没有收到任何错误。有没有人有什么建议?

感谢阅读。

【问题讨论】:

  • 您的服务器上是否有足够的可用连接来满足您的连接需求?还是可能有一些长时间运行的查询导致查询/连接堆积?
  • 重启 10 分钟后:max_connections 设置为 151,pma 显示 max. concurrent connections 为 6,threads_connected 为 3,threads_created 为 23。没有记录慢查询。即使在重新启动后,我的 mysqli_connect 仍然需要 >30 秒。
  • mysqltuner 显示可用连接的最高使用率:5% (9/151)

标签: php mysql mysqli mysql-connect


【解决方案1】:

也许是 DNS 问题? 您是否尝试过将主机字符串更改为直接 IP 地址而不是域?这里有一个类似的问题,Connecting to mysql server(localhost) very slow,听起来很相似,但它是本地主机,更改为 127.0.0.1 解决了这个问题。

【讨论】:

  • 我按照你的建议试了IP,时间不受影响。将 LAMP 服务器上的主机名更改为使用 localhost 而不是域名确实将响应时间从 0.03 降低到 0.0002。我认为这不是 DNS 问题,因为我在两台服务器上使用了相同的主机名(LAMP 服务器没有使用 localhost 或 127.0.0.1)。不过还是谢谢你的建议。
  • Sarah - 我真的在这里射击飞镖盘,但这里有其他可能导致问题的东西(尽管你谈论的时间比这个要长很多):@ 987654322@
  • 是的,看起来这是为了降低本地 MySQL 服务器的速度(我的本地主机连接工作正常)。这似乎也是 Windows 7 及更高版本的问题,我使用的是 Linux 和旧版本的 Windows Server。
  • 非常感谢它对我有用...(从 1.08 sn 下降到 0.004sn)+1
【解决方案2】:

发现问题,它与 DNS 相关。我仍然不完全理解它。看来守护进程named 已在 LAMP 服务器上停止。此服务器是我用来连接的域名的权威 NS。我不知道为什么它有时会工作,或者为什么在我使用 IP 地址时它不起作用,但是现在我再次启动该服务时它工作正常。

感谢您的所有帮助。

【讨论】:

  • 这是因为 MySQL 服务器查找客户端的 DNS。你也可以在服务器配置中disable它。
  • WAMP 服务器的 IP 不受 LAMP 服务器控制,而是由我们的 ISP 控制 - 所以我认为问题与 LAMP 服务器无法找到有关客户端 IP 的信息无关。不过我很欣赏这个链接。
  • 好吧,为了正确起见 ;) — MySQL 服务器将查找连接客户端的 DNS 名称,无论这些客户端从何处获取其 IP 地址。我相信它的动机可能是更详细的日志记录和连接显示。从您的解决方案中,我看到一旦打开命名解决了延迟,因此 MySQL 服务器会主动使用它。此外,如果由于任何原因您会开始在 named 上得到解决延迟——这些延迟也会传播到 MySQL。我看不出有任何理由来配置这个查找(和服务依赖!)。 :)
  • 我的评论并不清楚,我的意思是 WAMP IP 的名称服务器是 ISP - 而不是我们从 ISP 获得 IP,这应该是显而易见的。我看不出在 LAMP 机器上启动名称服务会如何影响其在 WAMP 机器上查询 DNS 信息的能力,除非它需要 named 才能请求 DNS 信息......并且从快速测试来看,它看起来像有可能。我可以在它停止的情况下获得非权威答案,但只有在它正在运行时才能获得权威回复。希望有一天我有时间试试skip-name-resolve...谢谢你的帮助。
猜你喜欢
  • 2017-04-18
  • 2019-05-09
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 2019-02-05
  • 1970-01-01
相关资源
最近更新 更多