当前位置:首页 > 公众号精选 > CPP开发者
[导读]缘起近期排查了一个问题,epoll惊群的问题,起初我并不认为这是惊群导致,因为从现象上看,只是体现了CPU不均衡。一共fork了20个Server进程,在请求负载中等的时候,有三四个Server进程呈现出比较高的CPU利用率,其余的Server进程的CPU利用率都是非常低。中断,...

缘起

近期排查了一个问题,epoll惊群的问题,起初我并不认为这是惊群导致,因为从现象上看,只是体现了CPU不均衡。一共fork了20个Server进程,在请求负载中等的时候,有三四个Server进程呈现出比较高的CPU利用率,其余的Server进程的CPU利用率都是非常低。

中断,软中断都是均衡的,网卡RSS和CPU之间进行了bind之后依然如故,既然系统层面查不出个所以然,只能从服务的角度来查了。

自上而下的排查首先就想到了strace,没想到一下子就暴露了原形:

accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
如果仅仅strace accept,即加上“-e trace=accept”参数的话,偶尔会有accept成功的现象:

accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(4, {sa_family=AF_INET, sin_port=htons(39306), sin_addr=inet_addr("172.16.1.202")}, [16]) = 19
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
accept(40x9ecd930, [16])              = -1 EAGAIN (Resource temporarily unavailable)
大量的CPU空转,进一步加大请求负载,CPU空转明显降低,这说明在预期的空转期间,新来的请求降低了空转率…现象明显偏向于这就是惊群导致的之判断!

本文将详细说一下关于epoll的细节。现在开始!

题目中为什么是“再谈”,因为这个话题别人已经聊过很多了,我顺势继续下去而已。

简单介绍惊群和事件模型

关于什么是惊群,这里不再做概念上的解释,能搜到这篇文章的想必已经有所了解,如果仍有概念上的疑惑,自行百度或者谷歌。

惊群问题一般出现在那些web服务器上,曾经Linux系统有个经典的accept惊群问题困扰了大家非常久的时间,这个问题现在已经在内核曾经得以解决,具体来讲就是当有新的连接进入到accept队列的时候,内核唤醒且仅唤醒一个进程来处理,这是通过以下的代码来实现的:

list_for_each_entry_safe(curr, next, 
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭
关闭