Nginx 比 Apache 性能强的原因主要有以下几点:
Nginx 利用了 Linux Kernel 新引入的名为 epoll 的 I/O 多路复用 API。epoll 是一种高效的 I/O 事件通知机制,它可以同时监听多个文件描述符,当其中任何一个文件描述符就绪时,就会触发相应的事件。这样,Nginx 可以在一个线程中处理多个连接,提高了并发处理能力。
Nginx 以流量转发作为设计目标。它采用了事件驱动的异步非阻塞模型,可以高效地处理大量的并发连接。而 Apache 是从标准的磁盘文件和 CGI 协议出发的一个 Web 容器,内部的很多设计都是基于进程和阻塞的,所以在处理大量并发连接时性能较差。
Nginx 使用了一些优化策略来提高性能,例如:
epoll 能够处理海量 TCP 连接的原因是它采用了事件驱动的方法来优化 TCP 连接和线程的匹配过程。
在传统的 select 方法中,每当收到一个数据包时,都需要遍历现存的所有连接。当连接数达到数千个时,寻找匹配关系的操作就会变得非常慢,甚至需要占据一整个 CPU 核心,导致性能无法继续提升,其他客户端也无法与服务器建立新的 TCP 连接。
而 epoll 通过将正向匹配流程反过来,基于事件驱动实现了高效的 TCP 连接与线程的匹配。具体来说,当接收到数据后,epoll 会通过二叉树快速找到所属的文件,并主动执行该文件对应的回调函数。这个操作大幅提高了处理海量 TCP 连接数时的效率。
📙 高并发的哲学原理 《Philosophical Principles of High Concurrency》
Copyright © 2023 吕文翰