1.什么是惊群?当多个进程/线程同时等待同一个socket事件时,当事件发生时,多个进程/线程同时被唤醒,但只有一个进程/线程响应处理该事件,其他被唤醒的进程/线程回去睡觉。这种情况称为冲击群。由于唤醒一个进程需要内核重新调度,那些不响应处理事件的进程也被唤醒,这意味着性能的浪费,因此需要采取措施避免雷群的发生。需要说明的是,对于accept()函数,Linux2.6已经从内核层面解决了雷群问题。方法是当连接到达时,只唤醒等待队列中的第一个进程或线程。2、什么情况下还会出现这个问题?在使用select、poll、epoll的时候,还是会出现雷霆万钧的羊群问题。特别需要注意的是,即使是2.6之后的linux,epoll_wait在某些场景下不会出现震群问题,但在其他场景下还是很有可能会出现震群问题。比如epoll_wait之后有sleep的时候,因为信号会唤醒sleep,所以不再是内核中最先唤醒等待队列的进程。3.如何解决?(1)Lockbeforeaccept,类似Nginx;锁;接受();开锁;(2)linuxkernel3.9后使用SO_REUSEPORT增加一个socket属性SO_REUSEPORTfcntl(serverFd,F_SETFL,flags|O_NONBLOCK|SO_REUSEPORT)
