2003:无法连接到'127.0.0.1:3306'上的MySQL服务器(99无法分配请求的地址)

时间:2014-07-22 10:06:02

标签: mysql linux database-connection scalability mariadb

我正在运行一个执行"插入"的python2.7应用程序。在多核64位CentOS(或ubuntu)机器上的单个mysql / mariadb实例。一旦并行进程/核心超过4或6,我就会看到这个错误。 (在执行的不同点) 2003:无法通过' 127.0.0.1:3306'连接到MySQL服务器(99无法分配请求的地址)

我在CentOS6.5上运行应用程序,mariadb 10.1 我也试过用Ubuntu 14.04(64位),mysql导致同样的问题。

我尝试进行以下更改:

In my.cnf file:
[mysqld]
interactive_timeout=1
wait-timeout = 1
thread_cache_size = 800
max_connections = 5000
#max_user_connections = 5000
max_connect_errors = 150


In sysctl.conf file:
fs.file-max = 65536

In limits.confg file:
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535

我倾向于认为这是一个配置问题,因为代码在2核心Mac上运行得很好。有人可以建议一些配置调整或任何简单的方法来重用连接吗?

3 个答案:

答案 0 :(得分:7)

你可能以相当高的费率连接/断开mysqld? 当遇到错误99时,您可能会在netstat -nt输出中看到很多的TIME_WAIT状态的连接?

问题很可能是由于频繁的重新连接和TIME_WAIT延迟,您的客户端端口用完了很多。这也可以解释为什么你的并行客户端数量越多,你就越有可能遇到这种情况。

TL; DR解决方案可以将net.ipv4.tcp_tw_reuse设置为1,例如使用

echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse

或者,正如您在同一台机器上拥有客户端和mysql服务器一样,您可以使用UNIX域套接字连接而不是TCP。这可能就像连接到逐字“localhost”主机名而不是127.0.0.1一样简单,但我不知道各种Python连接器以及它们如何处理这个......

有关更详细的提示和解释,请参阅

http://www.fromdual.com/huge-amount-of-time-wait-connections

http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html

答案 1 :(得分:0)

您可以使用睡眠机制来解决此问题。

import time

time.sleep(2) ##睡了两秒钟。

这将减少处于等待状态的进程数。

答案 2 :(得分:0)

在较新的环境中,尝试访问Traefik 2.0-beta反向代理后面的Docker容器中的MariaDB时,我遇到了相同的错误消息。

该错误消息与实际发生的情况相比毫无意义,这就是为什么我加2美分。

我发现的解决方案是使用Docker服务的名称作为主机,而不是使用Traefik给我的MariaDB服务器提供的本地域名。

此处可能有一些新的输入https://github.com/jclaveau/docker-standalone-webdev-ci-stack/tree/master/examples/docker-example-lamp