【问题标题】:mysql connection taking too long after a few connections几次连接后mysql连接时间过长
【发布时间】:2015-11-13 15:55:02
【问题描述】:

我在 Centos 7 上有 Mysql 5.7,这里是 my.cnf:

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

key_buffer_size = 512M
query_cache_type = 1
query_cache_size = 1024M
tmp_table_size = 32M
innodb_buffer_pool_size = 2048M
##innodb_additional_mem_pool_size = 10M
innodb_log_buffer_size = 8M
max_connections = 250
sort_buffer_size = 64M

long_query_time = 5
slow_query_log = 1
skip-name-resolve

如你所见,我有 skip-name-resolve 反正我做了 test.php:

<?php

for ($i = 0;$i<1000;$i++) {
    $t1 = microtime(true);
    $conn = new \mysqli("xx.xx.xx.xxx","xxxxxxx","xxxxxx","xxxx");
    $t2 = microtime(true);
    echo "connection: ". floatval($t2 - $t1). PHP_EOL;

    $t3 = microtime(true);
    $query = $conn->query("SELECT 1");
    $t4 = microtime(true);
    echo "query: ".$i.") ". floatval($t4-$t3) . PHP_EOL;
    $conn->close();
}

当我在第 65 个循环后运行这个 test.php 时,我看到连接持续时间增加到 1 秒甚至 3 秒,这是示例输出:

...
...
query: 62) 0.0028440952301025
connection: 0.0020878314971924
query: 63) 0.002816915512085
connection: 0.002126932144165
query: 64) 0.002856969833374
connection: 1.0042409896851
query: 65) 0.013001918792725
connection: 1.0027761459351
query: 66) 0.01302695274353
connection: 1.002720117569
query: 67) 0.012753009796143
connection: 1.003103017807
query: 68) 0.012816905975342
connection: 1.0031731128693
query: 69) 0.012447118759155
connection: 1.003485918045
query: 70) 0.012918949127197
...
...

每次我运行这个 test.php 结果都是一样的,总是在第 65 次循环后将连接时间增加到不可接受的时间。我真的很困惑。有人知道吗?

最好的问候。

【问题讨论】:

  • 似乎有一些限制,我不是专家,但可能与centos或mysql 5.7有关

标签: php mysql centos


【解决方案1】:

我们解决了与 mysql 服务器本身无关的问题。问题是 centos7 的主机名,因为主机名不是真实的,所以操作系统试图解决它们并且花费了太长时间,有两个解决方案:

1) 用 localhost 设置它们

hostnamectl --transient set-hostname "localhost"

2) 将您的假主机名重定向到 localhost,假设 mysql-server1.mydomain.com 是服务器的主机名

echo 127.0.0.1 mysql-server1.mydomain.com > /etc/hosts

【讨论】:

    【解决方案2】:

    您不应该创建这么多连接,而应该只创建一个:

    $conn = new mysqli("xx.xx.xx.xxx","xxxxxxx","xxxxxx","xxxx");
    
    for ($i = 0;$i<1000;$i++) {
        $t1 = microtime(true);
    
        $t2 = microtime(true);
        echo "connection: ". floatval($t2 - $t1). PHP_EOL;
    
        $t3 = microtime(true);
        $query = $conn->query("SELECT 1");
        $t4 = microtime(true);
        echo "query: ".$i.") ". floatval($t4-$t3) . PHP_EOL;
    }
    
    $conn->close();
    

    【讨论】:

    • 我知道我不需要新的连接,但我模拟了我的 http API,如果你向它发出 GET 请求,我有一个 http API,它连接到数据库并插入一个新行,但我做了一个负载对其进行测试,我发现它在一些请求后连接花费了太长时间
    • 尝试在$conn-&gt;close(); 之后设置$conn = null; 以强制php 释放变量。
    • 我做了,结果相同,真的很奇怪,每次尝试第 65 次循环后它变慢了 :) 我认为它与服务器设置或 mysql 5.7 的新内容有关
    • 尝试在连接关闭时设置$query = null;
    • same :(,这一次不是第 65 个循环,也许它与我的客户端服务器有关,是否有限制或每秒打开套接字的东西?
    猜你喜欢
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 2012-03-17
    • 2023-03-16
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多