博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
惊群问题及解决
阅读量:6699 次
发布时间:2019-06-25

本文共 586 字,大约阅读时间需要 1 分钟。

1.什么是惊群?

当多个进程/线程同时等待同一个socket的事件,当事件发生时,多个进程/线程同时被唤醒,但只有一个进程/线程响应处理该事件,其他被唤醒的进程/线程重新休眠,这种情况称为惊群。

由于唤醒进程需要内核重新调度,所以那些没有响应处理事件的进程也被唤醒就意味着性能浪费,所以需要采取措施避免惊群发生。

需要说明的是,对于accept()函数,Linux2.6已经从内核层面解决了惊群问题,做法是当连接来到后,只唤醒等待队列中的第一个进程或线程。

2.什么情况下还会有这个问题?

当使用select,poll,epoll时,仍然会有惊群问题。

特别需要注意的是,即便是2.6以后的linux,epoll_wait在某些场景下不会出现惊群问题,但其仍旧有很大可能会在另外的场景中出现惊群问题。

例如,当epoll_wait之后又sleep的情况,因为信号将唤醒sleep,不再是内核唤醒等待队列中的第一个进程。

3.如何解决?

(1)在accept之前加锁,像Nginx那样;

lock;
accept();
unlock;

(2)在linux kernel 3.9之后利用SO_REUSEPORT,将socket属性加多一个SO_REUSEPORT

fcntl(serverFd,F_SETFL,flags | O_NONBLOCK |SO_REUSEPORT)

转载地址:http://dpwlo.baihongyu.com/

你可能感兴趣的文章
Tornado 4.3文档翻译: 用户指南-协程
查看>>
被遗忘的Android mipmaps简介
查看>>
最长回文子串——Manacher 算法
查看>>
数据齿轮(DataGear)数据库管理系统 1.1 版本发布
查看>>
[Leetcode] Max Points on a Line 线上最大点数
查看>>
arm还是x86?未来在工业SBC数字谁可以脱颖而出
查看>>
Mybatis成为首选持久框架的原因
查看>>
SAP利用内表删除多条数据(自定义表)
查看>>
电脑上卸载软件的残留文件怎么清理?
查看>>
Android 初始化Menu item的值(ActionBar篇)
查看>>
Facebook和Google服务全球大瘫痪,网友:全世界只剩下推特 ...
查看>>
不让「数据孤岛」成为 AI 发展的绊脚石,「联邦学习」将成突破口? ...
查看>>
阿里云大数据ACP认证知识点梳理9——产品特点(DATA WORKS) ...
查看>>
首发 | 完成近亿美元B轮融资,黑芝麻如何成为自动驾驶芯片破局者?
查看>>
AI通过儿童眼球运动,筛查胎儿酒精谱系障碍
查看>>
【资料下载】Python第四讲——使用IPython/Jupyter Notebook与日志服务玩转超大规模数据分析与可视化...
查看>>
用不到 30 行 Python 代码实现 YOLO
查看>>
云HBase备份恢复,为云HBase数据安全保驾护航
查看>>
Ubuntu16.04上通过kubeadm安装指定版本Kubernetes1.9.0
查看>>
Intellij IDEA Jrebel Plugin 激活服务
查看>>