Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

muduo-master/examples/asio/chat 里面的./asio_chat_client 进入死循环 #131

Closed
hzhxxx opened this issue Mar 23, 2015 · 10 comments
Closed

Comments

@hzhxxx
Copy link

hzhxxx commented Mar 23, 2015

muduo-master/examples/asio/chat
里面的./asio_chat_client 进入死循环。看到客户端表现如下,不断的重新连接。
20150323 10:03:38.336293Z 6660 INFO 169.254.10.12:34128 -> 169.254.10.12:26888 is UP - client.cc:53
20150323 10:03:38.336324Z 6660 INFO 169.254.10.12:34128 -> 169.254.10.12:26888 is DOWN - client.cc:53
20150323 10:03:38.857066Z 6660 INFO TcpClient::connect[ChatClient] - Reconnecting to 169.254.10.12:26888 - TcpClient.cc:178
20150323 10:03:38.857196Z 6660 INFO 169.254.10.12:34130 -> 169.254.10.12:26888 is UP - client.cc:53
20150323 10:03:38.857328Z 6660 INFO 169.254.10.12:34130 -> 169.254.10.12:26888 is DOWN - client.cc:53
20150323 10:03:38.857345Z 6660 INFO TcpClient::connect[ChatClient] - Reconnecting to 169.254.10.12:26888 - TcpClient.cc:178

测试过程如下:

  1. 使用了 nginx 的TCP反向代理插件,https://github.com/yaoweibin/nginx_tcp_proxy_module
  2. 配置了 nginx 的 TCP 反向代理后,开始启动服务测试。
  3. 启动 asio_chat_server
  4. 启动 nginx
  5. 启动 asio_chat_client,发送数据,一切正常.
  6. 然后把 nginx 关闭或者重启(../sbin/nginx -s reload;../sbin/nginx -s reopen)
    ,重新把 nginx 起来,asio_chat_client 再发送数据进入了死循环。
  7. 就是关闭 asio_chat_client ,再起来,也一直是死循环。需要过了nginx 的自检时间,
    也就是过了 nginx 和 asio_chat_server 的检查时间才能正常。
@hzhxxx
Copy link
Author

hzhxxx commented Mar 23, 2015

基本上,只要数据收发还正常的情况下,如果把 nginx 重启,就会重现。

@chenshuo
Copy link
Owner

为什么你认为这是muduo的问题,而不是nginx的问题?
tcpdump 有没有说是谁主动断开连接?

@hzhxxx
Copy link
Author

hzhxxx commented Mar 24, 2015

现在还没有抓包分析,不过 TcpClient 的重连频率还是很高,基本和死循环一样。

@chenshuo
Copy link
Owner

从你给的log看,重连的间隔有0.5s。这有什么问题?

@hzhxxx
Copy link
Author

hzhxxx commented Mar 24, 2015

Uploading 没有完成关闭过程.PNG . . .
Uploading 完成了整个关闭过程.PNG . . .

两个截图,一个是完成了整个连接和关闭过程。
一个是完成了连接,没有完整关闭过程。
重连的时间间隔没有预期的指数回退,就是一直在连接。
当然,确实是服务器先主动关闭连接。

@hzhxxx hzhxxx closed this as completed Mar 24, 2015
@hzhxxx hzhxxx reopened this Mar 24, 2015
@hzhxxx
Copy link
Author

hzhxxx commented Mar 24, 2015

传图

@hzhxxx
Copy link
Author

hzhxxx commented Mar 24, 2015

上图上不去,只能上客户端 log 了。
20150324 01:33:24.123149Z 22876 INFO TcpClient::connect[ChatClient] - Reconnecting to 169.254.10.12:26888 - TcpClient.cc:178
20150324 01:33:24.123219Z 22876 INFO 169.254.10.12:60264 -> 169.254.10.12:26888 is UP - client.cc:53
20150324 01:33:24.123233Z 22876 INFO 169.254.10.12:60264 -> 169.254.10.12:26888 is DOWN - client.cc:53
20150324 01:33:24.123239Z 22876 INFO TcpClient::connect[ChatClient] - Reconnecting to 169.254.10.12:26888 - TcpClient.cc:178
20150324 01:33:24.123311Z 22876 INFO 169.254.10.12:60265 -> 169.254.10.12:26888 is UP - client.cc:53
20150324 01:33:24.123324Z 22876 INFO 169.254.10.12:60265 -> 169.254.10.12:26888 is DOWN - client.cc:53

@hzhxxx
Copy link
Author

hzhxxx commented Mar 24, 2015

因为服务器端主动关闭了连接,而每次客户端也析构了连接对象,导致 Connector 类每次都使用
初始化的kInitRetryDelayMs值来计算连接时间间隔,而无法不断累计时间,导致客户端就和死循环一样,
没有很优雅的不断增加连接时间间隔,两边都陷入雪崩的情况。客户端作死连接,服务器拼命关闭。

@hzhxxx
Copy link
Author

hzhxxx commented Mar 24, 2015

因为每次连接都成功了,客户端没有进入连接失败,所以
void TcpClient::removeConnection(const TcpConnectionPtr& conn)
函数内部执行了 connector_->restart(); 去重新连接。

客户端作死连接,服务器拼命关闭。
不知道这种情况,客户端是否要规避。

@chenshuo
Copy link
Owner

我认为问题出在server端,TcpClient没有问题。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants