最近在写一个网络模型,仿写了 nginx ,但是用的是多线程而非多进程
遇到一个问题,多个 epoll 线程只有一个在工作,问题大概是处理 epoll 惊群引起的:
如何能让其他线程知道自己可以争抢锁了呢
1
victorc 2023-07-18 12:24:23 +08:00
你搞错了呗,可以看看 memcache 的代码
accept 的 fd 用一个单独的 epoll worker 线程人手一个 epoll ,把一个 pipe 也放到这个 epoll 里面监视 收到新连接,选择一个 worker 线程,把 fd 通过 pipe 写过去, |
2
julyclyde 2023-07-18 13:01:55 +08:00
我一直以为惊群是古代内核的 bug
现在还有这问题?? |
3
0littleboy OP @julyclyde #2 accept 惊群随着内核的更新确实解决了,但是 epoll 还是存在惊群
|
4
ihciah 2023-07-18 15:56:06 +08:00
一个解决办法是每个 thread 创建自己的 listener socket ,还有一个办法是放弃 epoll + syscall ,用 io_uring 。
或者使用多线程+单 epoll 的形式,类似你说的单个线程陷入 epoll_wait ,其他线程等待该线程——线程等待可以用 futex 之类的东西做,也可以直接用锁,底层实现也是 futex 。 |
5
Perfect1zsh1t 2023-07-19 08:22:52 +08:00
muduo 网络库的实现思路是,主 epoll 负责接收连接请求,各个其他线程的子 epoll 负责拿到这个 fd 进行 accept 操作。主 epoll 向其他线程的分发操作采用轮询的方式均匀分发给每个线程。
|
6
holy5pb 2023-07-19 10:20:13 +08:00
小白问个与原题无关的,如果要系统的学习网络知识,达到 OP 这样能仿写 ng 的水平,需要哪些知识储备呢,有没有推荐的教程或书籍
|