导致UNIX域套接字上出现ECONNREFUSED的原因



在TCP服务器中,我知道拒绝连接可能是因为

  1. 进程停止侦听,方法是在服务器套接字上调用close(现有连接保持打开状态,新连接被拒绝),或者
  2. 过程结束,或
  3. 该流程没有足够频繁地接受连接,因此积压工作已满/积压工作太少

尝试连接到UNIX域套接字时,ECONNREFUSED的可能原因是什么。

这个问题是为了帮助我缩小Solaris 10配置上MySQL连接的神秘范围。

拒绝连接并不意味着服务器关闭了套接字(在连接到它之后),它意味着没有服务器在侦听套接字。所以,首先,你的服务器崩溃,然后,客户端的连接被拒绝。(除非积压工作已满,或者您传递给listen()的积压工作太小,或者您的服务器没有足够快地接受()连接,但我从未在现实生活中见过这种情况)。

通常,我会把它归咎于某些防火墙,但由于在你的另一篇文章中,你说它只是间歇性发生的,我想发生的是:你的mysql服务器崩溃,safe_mysqld重新启动它,这需要几秒钟的时间,在启动阶段,你会收到连接被拒绝的错误,因为那里没有服务器可以监听你。尝试设置一个每分钟执行"ps-ef|grep-mysqld"的cron作业,检查进程id是否不时更改,并尝试将这些更改与拒绝连接的错误消息相匹配。

如果mysqld没有重新启动,即进程ID保持不变,请尝试类似"特拉斯-v listen,accept-p"的操作。这应该会在每次客户端连接时为您提供一些输出——也许您可以将"特拉斯中发生的很多事情"与"我现在拒绝连接"相匹配。但是,不要在负载严重的生产系统上这样做,否则特拉斯将a)淹没您的输出,b)显著降低您的服务器速度。

最新更新