Epoll的惊群效应

什么是惊群效应?

​ 在多线程或者多进程环境中使用Epoll来处理事件,每个线程 / 进程都同时监听着socket,那么当socket中的某个事件就绪后或者添加新的事件进去,操作系统就不知道应该将哪个线程 / 进程唤醒来处理此次事件,所以操作系统的处理方法就是同时唤醒多个线程 / 进程,可是此时必定只有一个线程/进程能够获得处理此次事件的权利,那么其他没有竞争到处理权限的线程 / 进程就会失败,错误码为EAGAIN。

惊群效应有什么危害?

  • 浪费系统的资源
  • 影响系统的性能

怎么处理惊群效应?

多线程

​采用master/worker线程模式,即只让其中一个线程(master线程)在epoll_wait监听socket,当有新的连接请求进来之后,由epoll_wait的线程调用accept,建立新的连接,然后交给其他线程(worker线程)处理后续的数据读写请求,这样就可以避免了由于多线程环境下的epoll_wait惊群效应问题。

多进程

​ nginx的解决思路:在同一时刻,永远都只有一个子进程在监听的socket上epoll_wait,其做法是,创建一个全局的pthread_mutex_t,在子进程进行epoll_wait前,则先获取锁。

你可能感兴趣的:(Network,Service,Linux,Backend,Dev)