我正在运行一个执行"插入"的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上运行得很好。有人可以建议一些配置调整或任何简单的方法来重用连接吗?
答案 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服务器提供的本地域名。