nginx高并发低内存占用靠异步事件驱动模型:单worker处理数万连接,共享预分配结构与轻量级请求内存池,零拷贝传输及共享内存区协同优化。

Nginx 在高并发下保持低内存占用,不是靠“省着用”,而是靠异步事件驱动模型从根本上重构了资源管理逻辑——它让内存分配与连接、请求的生命周期严格对齐,避免碎片、规避锁竞争、消除空转开销。
单 worker 管数万连接,不为每个请求开新线程
传统服务器(如 Apache prefork)每并发一个请求就 fork 一个进程,1000 并发 ≈ 1000 个进程,每个常驻几十 MB;Nginx 则用单个 worker 进程 + epoll/kqueue 同时监听上万个 socket。连接建立后只注册事件,数据就绪才回调处理,全程无等待、无空转。
- worker_processes 设为 CPU 核心数(如 worker_processes auto;),避免上下文切换浪费
- worker_connections 可设至 65535,但需同步调高系统级文件描述符限制:ulimit -n 65535
- 所有连接共享同一套预分配结构(如 ngx_connection_t),不为每个连接 malloc 新内存块
内存池按生命周期整批创建销毁,零碎片
每个 HTTP 请求绑定一个轻量级内存池(r->pool),所有 header、临时变量、buffer 都从中分配。这块内存是连续预分配的,分配靠指针偏移(ngx_palloc),释放靠整池归还(ngx_destroy_pool),不走 libc malloc/free。
- 小内存(≤4095 字节)在线性区分配,O(1)、无锁、无元数据开销
- 大内存走 large 链表单独 malloc,不污染主池,释放时一并清理
- 请求结束即销毁整个池——不管中间分配了多少次,都不逐块 free,彻底绕过碎片产生条件
关键资源走内核直通,跳过用户态搬运
大文件传输若走 read+write 路径,数据要在用户态缓冲区中拷贝两次,既占内存又耗 CPU。Nginx 用零拷贝机制绕过这一层:
- sendfile on;:文件 → socket 直通内核,不进用户态 buffer
- tcp_nopush on;:配合 sendfile,攒满 TCP 包再发,减少小包数量
- aio on; directio 4k;(Linux 4.1+):对 ≥4KB 文件启用异步读,不阻塞事件循环
共享状态独立管理,不挤占请求内存
限流、缓存键计数、SSL 会话复用等跨 worker 协作功能,不放在各 worker 的请求池里,而是通过 shared memory zone 统一管理:
- 由 master 进程初始化,所有 worker 映射访问,容量可控
- 不随请求数线性增长,不会因高频请求引发内存抖动
- 典型配置如 limit_req_zone $binary_remote_addr zone=rate:10m rate=1r/s;
不复杂但容易忽略——真正吃内存的往往不是 Nginx 本身,而是开着没用的日志、未精简的模块、或第三方代码悄悄调用 malloc。关掉 access_log、禁用 server_tokens、编译时去掉不用的模块,比调参数更立竿见影。











