在UNIX域套接字上导致ECONNREFUSED的原因是什么?

时间:2013-12-06 16:10:08

标签: solaris unix-socket econnrefused

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

  1. 进程停止侦听,通过在服务器套接字上调用close(现有连接保持打开状态,拒绝新连接)或
  2. 流程结束,或
  3. 该过程不经常接受连接,因此积压工作已满/积压太小。
  4. 尝试连接 UNIX域套接字ECONNREFUSED的可能原因是什么。

    这个问题是为了帮助我缩小范围a MySQL connection mystery on a Solaris 10 configuration

1 个答案:

答案 0 :(得分:-2)

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

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

如果mysqld没有重新启动,即进程ID保持不变,请尝试类似" truss -v listen,accept -p"。这应该在每次客户端连接时给你一些输出 - 也许你可以匹配"在桁架中发生的很多事情"我现在拒绝连接"。但是,不要在负载很重的生产系统上执行此操作,否则桁架将a)淹没您的输出并且b)显着降低服务器速度。