草稿未验证
1 epoll编程,如何实现高并发服务器开发?
- 知乎 https://www.zhihu.com/question/21516827/answer/55127881
nginx 多进程网络编程的巅峰
memcached 多线程网络编程的巅峰
redis单线程网络编程的巅峰~~
2 为什么说 event-loop 在 IO 密集型场景中比线程模型更高效?
https://www.zhihu.com/question/67751355/answer/256921689
3 单个 epoll + 线程池与每个线程一个 epoll 这两种架构哪个更适合大量短连接的场景?
3.1
单个 epoll + 线程池与每个线程一个 epoll 这两种架构哪个更适合大量短连接的场景? - kanmars的回答 - 知乎 https://www.zhihu.com/question/271561199/answer/374711772
相关知识可以查看书籍《UNIX环境高级编程》中的重点章节。
单epoll+线程池?线程池+epoll?
3.2 https://www.zhihu.com/question/271561199/answer/374621127
不需要线程池。线程池的应用场景是线程数量不断增减的情况,因此需要用一个池来不断维护申请与释放。
现在主流做法是按cpu核心数量开线程数量,线程数量恒定不变,等于epoll数量。这种情况下,由于线程数量固定,线程池毫无优势。
4 nginx实现高并发的原理
nginx是以多进程的方式来工作的。
nginx在启动后,会有一个master进程和多个worker进程。
多进程的工作模式
-
1、Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。
-
2、接收来自外界的信号,向各worker进程发送信号,每个进程都有可能来处理这个连接。
-
3、 master 进程能监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动启动新的 worker 进程。
注意 worker 进程数,一般会设置成机器 cpu 核数。因为更多的worker 数,只会导致进程相互竞争 cpu,从而带来不必要的上下文切换。
使用多进程模式,不仅能提高并发率,而且进程之间相互独立,一个 worker 进程挂了不会影响到其他 worker 进程。
惊群现象
主进程(master 进程)首先通过 socket() 来创建一个 sock 文件描述符用来监听,然后fork生成子进程(workers 进程),子进程将继承父进程的 sockfd(socket 文件描述符),之后子进程 accept() 后将创建已连接描述符(connected descriptor)),然后通过已连接描述符来与客户端通信。
那么,由于所有子进程都继承了父进程的 sockfd,那么当连接进来时ÿ