Web 服务与 I/O 模型
一、Web 服务核心模型
Apache 的三种工作模式
Apache 作为老牌 Web 服务器,其性能表现很大程度上取决于 MPM(Multi-Processing Module)的选择。
prefork 预派生模式
这是最经典的模式。主进程启动多个独立的子进程,每个子进程单线程处理请求。它使用 select 模型,最大并发数通常限制在 1024 左右。
- 资源占用:较高,因为每个连接都对应一个进程。
- 稳定性:极佳,进程间隔离性好,一个崩溃不影响其他。
- 适用场景:访问量中等,对稳定性要求高于并发量的场景。
worker 多进程多线程混合模式
为了解决 prefork 内存占用高的问题,worker 模式引入了线程。主进程管理多个子进程,每个子进程包含固定数量的线程。当线程不足时,会创建新的子进程补充。
- 优势:相比 prefork 更节省内存,支持更高并发。
- 注意点:长连接(keepalive)会长期占用线程,高并发下容易出现无可用线程的情况。
event 事件驱动模式
从 2.4.X 版本开始正式支持,基于 epoll 事件驱动。它专门有一个线程管理 keepalive 连接,只有在有真实请求时才分配服务线程,执行完立即释放。这有效解决了线程空占的问题。
- 优势:单线程响应多请求,内存占用少,高并发表现优秀。
- 风险:缺乏线程安全控制,需要开发者注意代码逻辑。
Nginx 高性能实践
Nginx 由 Igor Sysoev 开发,最初为了应对 Rambler.ru 的高流量需求。如今它已成为互联网基础设施的重要组成部分,天猫、淘宝、京东等一线大厂均在使用或二次开发。
- 核心特性:支持 HTTP 反向代理、邮件服务器、TCP/UDP 负载均衡(1.9+ 开启 stream 模块)。
- 性能表现:快速响应静态网页,支持 FastCGI、SSL、URL Rewrite 等丰富功能。
- 生态:拥有大量第三方模块扩展能力。
二、服务端 I/O 流程基础
理解 I/O 模型前,先明确几个基本概念。
- I/O:输入输出,本质是用户空间进程与内核空间的数据交换。由于内核与用户空间严格隔离,数据必须通过拷贝传递。
- IOPS:每秒输入输出量,衡量磁盘性能的关键指标。
- 完整流程:无论是磁盘还是网络,都涉及两个阶段:
- 数据准备:将数据加载到内核缓冲区(耗时较长)。
- 数据拷贝:将数据从内核缓冲区拷贝到用户进程内存(耗时较短)。
三、五大 I/O 模型深度解析
1. 阻塞型 I/O (Blocking IO)
这是最直观的模式。用户线程发起 read 调用后,直接挂起等待,直到内核准备好数据并拷贝完成才返回。
- 特点:全程阻塞,CPU 利用率低。
- 优缺点:程序简单,但高并发下线程切换开销大,不适合海量连接。
- 典型应用:Apache prefork 模式。

