8

在 TCP 服务器中,我知道 Connection Refused 要么是因为

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

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

这个问题是为了帮助我缩小关于 Solaris 10 配置的 MySQL 连接之谜

4

1 回答 1

-2

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

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

如果 mysqld 没有重新启动,即进程 ID 保持不变,请尝试“truss -v listen,accept -p”之类的操作。每次客户端连接时,这都会为您提供一些输出 - 也许您可以将“很多事情发生在 truss 中”与“我现在连接被拒绝”相匹配。但是,不要在负载很重的生产系统上执行此操作,否则 truss 会 a) 淹没您的输出和 b) 显着减慢您的服务器。

于 2013-12-06T16:22:24.083 回答