博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
惊群24小时
阅读量:5158 次
发布时间:2019-06-13

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

很有意思,这么有名的事情,昨天才亲身经历了。
隔壁小王继续用google perftools 排查cpu占用率。先说明一下场景。多服务进程阻塞在select上,这个select是和一个消息队列对应的,一旦有消息进入队列,select就唤醒阻塞的进程,从队列中取消息处理。发现select(__select_nocancel)占用了30%左右的cpu。先是怀疑select阻塞也被perftools记在内了。写了个小程序验证了一下,非也。遂在select下加一行log,发现每处理一个消息之前,就会有多个select被唤醒。才意识到一个消息来了之后,多个阻塞在select的服务进程都被唤醒,而只有一个会到达消息并处理。才知道这就是著名的惊群效应。
 
解决中。尝试在select之前加互斥锁,select之后释放锁,确保任何一个时刻只会有一个进程在select阻塞。为了确保锁不会被集体唤醒,特意查了一些资料,linux中,阻塞在互斥锁上的进程id是存放在一个队列中的,每次只会取出一个唤醒。更近一步考虑,获取锁的进程一旦检测到有消息进来,就立即去出一个消息,并释放锁,然后遍历消息队列有一个就处理一个。这里先取出一个基于两点考虑:1.在消息队列中只有一个消息时,如果不及时取出,释放锁后,获得锁的下一个进程就会来取这个消息,但很可能取不到,因为前一个进程刚好去走了,多了一次无谓的进程切换。2.一个进程处理一个消息,特别是比较耗时的业务,能使得并发量最大。

转载于:https://www.cnblogs.com/mjohh/p/5363334.html

你可能感兴趣的文章
处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“Manag
查看>>
01: socket模块
查看>>
mysql触发器
查看>>
淌淌淌
查看>>
win10每次开机都显示“你的硬件设置已更改,请重启电脑……”的解决办法
查看>>
C++有关 const & 内敛 & 友元&静态成员那些事
查看>>
函数积累
查看>>
Swift 入门之简单语法(六)
查看>>
〖Python〗-- IO多路复用
查看>>
栈(括号匹配)
查看>>
Java学习 · 初识 面向对象深入一
查看>>
源代码如何管理
查看>>
vue怎么将一个组件引入另一个组件?
查看>>
bzoj1040: [ZJOI2008]骑士
查看>>
LeetCode 74. Search a 2D Matrix(搜索二维矩阵)
查看>>
利用SignalR来同步更新Winfrom
查看>>
反射机制
查看>>
CocoaPod
查看>>
BZOJ 1251: 序列终结者 [splay]
查看>>
5G边缘网络虚拟化的利器:vCPE和SD-WAN
查看>>