惊群效应简介
当你往一群鸽子中间扔一块食物,虽然最终只有一个鸽子抢到食物,但所有鸽子都会被惊动来争夺,没有抢到食物的鸽子只好回去继续睡觉, 等待下一块食物到来。这样,每扔一块食物,都会惊动所有的鸽子,即为惊群。
简单地说:就是扔一块食物,所有鸽子来抢,但最终只一个鸽子抢到了食物。
语义分析:食物只有一块,最终只有一个鸽子抢到,但是惊动了所有鸽子,每个鸽子都跑过来,消耗了每个鸽子的能量。(这个很符合达尔文的进化论,物种之间的竞争,适者生存。)
操作系统的惊群:
在多进程/多线程等待同一资源时,也会出现惊群。即当某一资源可用时,多个进程/线程会惊醒,竞争资源。这就是操作系统中的惊群。
缺点:
- 惊醒所有进程/线程,导致n-1个进程/线程做了无效的调度,上下文切换,cpu瞬时增高
- 多个进程/线程争抢资源,所以涉及到同步问题,需对资源进行加锁保护,加解锁加大系统CPU开销
其他:
在某些情况:惊群次数少/进(线)程负载不高,惊群可以忽略不计
惊群的几种情况:
在高并发(多线程/多进程/多连接)中,会产生惊群的情况有:
1. accept惊群
2. epoll惊群
3. nginx惊群
4. 线程池惊群
accept惊群(新版内核已解决)
以多进程为例,在主进程创建监听描述符listenfd后,fork()多个子进程,多个进程共享listenfd,accept是在每个子进程中,当一个新连接来的时候,会发生惊群。