惊群现象(Thundering Herd Problem)是指在多线程或多进程环境中,当多个线程或进程在等待同一个事件(如I/O操作、信号、锁等)时,一旦该事件发生时所有等待的线程或进程都会被同时唤醒,但最终只有一个线程或进程能够处理该事件,其他线程或进程则会再次进入等待状态。
一、概念
惊群现象(Thundering Herd Problem)是指在多线程或多进程环境中,当多个线程或进程在等待同一个事件(如I/O操作、信号、锁等)时,一旦该事件发生时所有等待的线程或进程都会被同时唤醒,但最终只有一个线程或进程能够处理该事件,其他线程或进程则会再次进入等待状态。这种现象会导致CPU资源的浪费和系统性能的下降。
- accept惊群
- epoll惊群
二、解决方案
- 使用边缘触发模式
- 水平触发:只要仍然有未处理的事件,epoll就会通知你,调用epoll_wait就会立即返回。
- 边缘触发:只有事件列表发生变化了,epoll才会通知你(epoll_wait返回通知你去处理事件),如果没处理完epoll不会再通知你了,调用epoll_wait会睡眠等待,直到下一个事件到来或者超时。
- 使用互斥锁/读写锁
- 使用事件驱动编程模型
- 减少进程、线程数量
- 使用条件变量控制线程的唤醒