端口复用
Linux 3.9以上
使用 so_reuseport 选项即可
Linux 3.9以下
非listen态的端口复用
so_addrreuse 解决
listen态的socket
多个进程accept 同一个listen_socket实现端口复用
惊群
Linux 2.6以下是有惊群效应,当一个连接到来时,内核会唤醒该listen_socket上调用accept函数的所有进程,但是只有一个进程获得该连接
Linux 2.6 以上修复了次bug,内核会选择一个线程唤醒处理该连接而不是多个
epoll 惊群
发生于多个进程使用同一个epoll_fd 进行epoll_wait 并且它们都注册了同一个listen_socket。如果这个时候socket 可读就绪(有连接到来可以accept),内核会唤醒一个进程去处理这个socket,但是如果该进程没有及时accept,内核下次条件就绪的时候就会唤醒其他进程,这样就发生了惊群
epoll惊群不是本质的惊群而是我们使用epoll方法不多,应该one thread per pool ,也就是每个线程一个epoll_fd.