调试 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。

学习了。

时间: 2024-10-17 10:26:58

调试 zeromq 发现 accept 死循环的相关文章

深度解析Tengine的调试与资源监控方法论

摘要: Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,提供更强大的流量负载均衡能力.全站HTTPS服务.安全防×××.链路追踪等众多高级特性.团队的核心成员来自于淘宝.搜狗等互联网企业,从2011年12月开始,Tengine成为一个开源项目,团队在积极地开发和维护着它,最终目标是打造一个高效.稳定.安全.易用的Web平台. 阿里云CDN现在服务超过24万家客户,Tengine作为接入层提供高性能Web Server服务,是CDN系统最核心的组件之

[原]调试实战——程序CPU占用率飙升,你知道如何快速定位吗?

原调试debugwindbghangprocess explorer 前言 如果我们自己的程序的CPU Usage(CPU占用率)飙升,并且居高不下,很有可能陷入了死循环.你知道怎么快速定位并解决吗?今天跟大家分享几种定位方法,希望对你有所帮助. 如何判断是否有死循环? 通过电脑风扇的声音猜测. 如果风扇一直响个不停,说明电脑很热.高CPU占用率会导致CPU发热量增大,从而导致风扇狂响.如果听到风扇响个不停,可以打开任务管理器看看CPU占用率是不是很高.如果发现是我们的进程导致的高CPU占用率,

C语言调试

1.调试的概念以及调试器的选择 在编写代码的过程中,相信大家肯定遇到过这样的情况:代码能够编译通过,没有语法错误,但是运行结果却不对,反复检查了很多遍,依然不知道哪里出了问题.这个时候,就需要调试程序了. 所谓调试(Debug),就是让代码一步一步慢慢执行,跟踪程序的运行过程.比如,可以让程序停在某个地方,查看当前所有变量的值,或者内存中的数据:也可以让程序一次只执行一条或者几条语句,看看程序到底执行了哪些代码. 在调试的过程中,我们可以监控程序的每一个细节,包括变量的值.函数的调用过程.内存中

Window10中利用Windbg与虚拟机(window7)中调试驱动建立方法

想起自己的windbg配置就转载:eqera的windows内核调试配置,真的是获益良多希望他不会介意我转载他的博客,帮了我很多,记录下来给我也给大家, 其中我主要看的是VMWare的pipe建立,而我有些分享是在vs2015中打上DDK,然后在开始菜单window kits下找见windbgx86或者是你想要用的类型,然后 发送快捷方式到桌面利于以后用.发到桌面后,在属性插入你放置的的符号的路径,让然最后别忘了在windbg检查路径是否正确. eqera他的解述给了我很多帮助,可以耐心解读.下

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析(1)

堆栈跟踪 首先编辑一个程序 用gcc编译,再使用gdb调试,发现gdb尚未下载 下载后重新运行gdb 设置断点:b+行号或者"main" 运行:r frame:打印出的信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句. info frame:打印出的信息:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的.函数参数地址及值.局部变量的地址等等. 输入命令disassemble:显示出该代码(main())的汇编形式 info

调试方法

一. 调试模式ThinkPHP 专门为开发过程而设置了调试模式,调试模式开启后,特别方便我们进行排错和调整.但由于它执行效率会稍低,所以在正式部署项目的时候,关闭调试模式. 1 // 入口文件处,开启调试模式 建议开发阶段开启 部署阶段注释或者设为false 2 define('APP_DEBUG',t t rue); 开启来会告诉你错误的一些具体信息,部署项目后,错误信息是给用户看的,这时不需要列出错误的具体信息在哪 下图为用户看到的错误页面 调试模式在开发中的优势在于: 1.开启日志记录,任

Android Studio代码调试大全

http://blog.csdn.net/dd864140130/article/details/51560664 Android Studio目前已经成为开发android的主要工具,用熟了可谓相当顺手.作为开发者,调试并发现bug,进而解决,可是我们的看家本领.正所谓,工欲善其事必先利其器,和其他开发工具一样,如Eclipse.Idea,Android Studio也为我们提供了强大的调试技巧,今天我们就来看看Android Studio中有关调试的技巧. 首先,来看看Android stu

Cocoa惯性思维调试一例

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 人总有惯性思维,在编程调试里也不例外.你总以为错误是显然的那一个,可是结果却不是. 在stroyboard中建立2个UIView控制器,如果按下第一个控制其中的reg按钮则会显示第二个控制器视图: - (IBAction)reg:(id)sender { UIStoryboard *sb = [UIStoryboard storyboardWithName:@

Quick cocos2dx-Lua(V3.3R1)学习笔记(十二)----使用Cocos Code IDE 配合自带的PrebuiltRuntimeLua.apk进行真机调试

cocos code ide出来很久,虽然用了各种问题,比如卡顿,比如打开库文件编码乱码什么的,但它的真机调试还是很不错的,比logcat少了很多不需要的信息,也少了调试的时候,还要打包的蛋疼东. 我们打开cocos code ide 确定,等待载入成功 出现一个让我们选择lua和quick路径, 我们填入路径 确定后,我们新建一个quick工程,写一个单点触摸,真机调试一下 我们在MainScene.lua一段代码 function MainScene:ctor() local sprite