包处理线程阻塞导致丢包

标签:阻塞   丢包   同步    1784人阅读 评论(0)
分类:

现象:

    某项目报告故障,业务流量下降严重,只有平时流量的1/10,

    到现场查看驱动日志,网卡有2Gbps入流量,但90%多都被应用丢弃了,

    gdb attach 应用进程发现,大量线程都被阻塞了,主要原因是connect某个ip地址阻塞了,

    而那个ip所属的服务器因硬件崩溃,连不上了,

    虽然connect加了超时,但也要等待N秒才能返回错误,这N秒期间已经丢了上百万个数据包。


解决办法:

    恢复在线系统运行优先,先将故障ip从配置文件删掉,暂时不给那台机器发数据,

    (那个IP属于某模块后端集群之一,临时禁用一台影响不太大,只是把流量分担给其他正常服务器),

    报硬件故障,待机器修复后,再恢复正常配置。


经验教训:

    此项目是几年前开发、上线,目前相关公共库的connect已经支持异步模式,

    除此之外,任何可能导致阻塞的操作,都不应该在sapp的包处理线程上下文中调用,

    包括上述的connect, send, write, recv等网络IO类,

    还有:pthread_mutex_lock, pthread_cond_wait等。


    除此之外,慎用磁盘I/O类接口,磁盘的读写速度要比内存慢的多,

    由于系统其它进程频繁读写文件操作,也可能导致fopen, fwrite等函数执行很长时间才返回,

    包处理线程最好不要用同步方式写日志。


查看评论

暂无评论

发表评论
  • 评论内容:
      
首页
团队介绍
发展历史
组织结构
MESA大事记
新闻中心
通知
组内动态
科研成果
专利
论文
项目
获奖
软著
人才培养
MESA毕业生
MESA在读生
MESA员工
招贤纳士
走进MESA
学长分享
招聘通知
招生宣传
知识库
文章
地址:北京市朝阳区华严北里甲22号楼五层 | 邮编:100029
邮箱:nelist@iie.ac.cn
京ICP备15019404号-1