我正在运行一个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上运行得很好.有人可以建议一些配置调整或任何简单的方法来重用连接?
您可能以相当高的速率连接/断开mysqld?当遇到错误99时,你可能在输出中看到很多 TIME_WAIT状态的连接netstat -nt
?
最常见的问题是,由于频繁的重新连接和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