调试 zeromq 发现 accept 死循环

Posted kaopuman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调试 zeromq 发现 accept 死循环相关的知识,希望对你有一定的参考价值。

起因:在群里一个同学说使用 zeromq 的时候出了点儿问题,问题描述如下“router连接十几万客户端后,然后把router杀死,重启,这时候zeromq的某个线程99%的cpu,卡死了,再也接受不到消息了”。使用gdb跟踪发现是accept在死循环,查百度找到如下信息。

  场景:一个多线程服务器,每个线程执行一个事件循环。在事件循环开始前,调用 socket/bind/listen 监听端口,然后将监听句柄(fd)添加到 epoll,然后开始事件循环,执行 epoll_wait。epoll_wait 返回有效事件时,对于监听事件,调用 accept 建立新连接,将该连接句柄添加到 epoll;对于普通连接,调用 read/write 进行网络 IO 及其他处理逻辑。

  现象:服务器进程 CPU 占用彪高,几乎每个事件循环都在 accept,客户端出现超时。
  原因:ulimit -n 为 65535, 进程打开的 fd 已经超过该数值,导致 accept 时无法取得 fd 而失败,而此时 TCP 连接的三次握手已经建立。又因为 epoll 使用的 LT 触发模式,该连接事件会不停地由 epoll 上报,于是产生了所谓的『死循环』,其实是事件循环闲不下来了,即使没有实际的 网络 IO。

 

学习了。

以上是关于调试 zeromq 发现 accept 死循环的主要内容,如果未能解决你的问题,请参考以下文章

《保姆系列三》细数 for 循环中的那些坑!实例展示

《保姆系列三》细数 for 循环中的那些坑!实例展示

《保姆系列三》细数 for 循环中的那些坑!实例展示

HashMap为什么是线程不安全的?

PHP基本功

while循环console.clearbreakcontinue的用法