再谈 Linux epoll 惊群问题的原因和解决方案
时间:2021-10-22 15:13:29
手机看文章
扫描二维码
随时随地手机看文章
[导读]缘起近期排查了一个问题,epoll惊群的问题,起初我并不认为这是惊群导致,因为从现象上看,只是体现了CPU不均衡。一共fork了20个Server进程,在请求负载中等的时候,有三四个Server进程呈现出比较高的CPU利用率,其余的Server进程的CPU利用率都是非常低。中断,...
缘起近期排查了一个问题,epoll惊群的问题,起初我并不认为这是惊群导致,因为从现象上看,只是体现了CPU不均衡。一共fork了20个Server进程,在请求负载中等的时候,有三四个Server进程呈现出比较高的CPU利用率,其余的Server进程的CPU利用率都是非常低。中断,软中断都是均衡的,网卡RSS和CPU之间进行了bind之后依然如故,既然系统层面查不出个所以然,只能从服务的角度来查了。自上而下的排查首先就想到了strace,没想到一下子就暴露了原形:
accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
如果仅仅strace accept,即加上“-e trace=accept”参数的话,偶尔会有accept成功的现象:accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
accept(4, 0x9ecd930, [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(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
accept(4, 0x9ecd930, [16]) = -1 EAGAIN (Resource temporarily unavailable)
大量的CPU空转,进一步加大请求负载,CPU空转明显降低,这说明在预期的空转期间,新来的请求降低了空转率…现象明显偏向于这就是惊群导致的之判断!本文将详细说一下关于epoll的细节。现在开始!
题目中为什么是“再谈”,因为这个话题别人已经聊过很多了,我顺势继续下去而已。简单介绍惊群和事件模型关于什么是惊群,这里不再做概念上的解释,能搜到这篇文章的想必已经有所了解,如果仍有概念上的疑惑,自行百度或者谷歌。惊群问题一般出现在那些web服务器上,曾经Linux系统有个经典的accept惊群问题困扰了大家非常久的时间,这个问题现在已经在内核曾经得以解决,具体来讲就是当有新的连接进入到accept队列的时候,内核唤醒且仅唤醒一个进程来处理,这是通过以下的代码来实现的:list_for_each_entry_safe(curr, next,