写点什么

NGINX 如何实现高性能和可扩展性

  • 2015-06-26
  • 本文字数:1035 字

    阅读完需:约 3 分钟

Owen Garrett 是 Nginx 公司的产品总监,他在 Nginx 的官方博客上发表了一篇博文,说明了是哪些设计决策使得 NGINX 产品具备一流的性能和扩展能力。

NGINX 的整体架构的特点是由一组进程协同工作:

  • 主进程:负责执行特权操作,如阅读配置文件、绑定套接字、创建 / 通知协调(Signalling)子进程。
  • 工作进程:负责接收和处理连接请求,读取和写入磁盘,并与上游服务器通信。当 NGINX 处于活跃状态时,只有工作进程是忙碌的。
  • 缓存加载器进程:负责将磁盘高速缓存加载到内存中。这个进程在启动时运行后随即退出。
  • 缓存管理器进程:负责整理磁盘缓存的数据保证其不越界。这个进程会间歇性运行。

NGINX 能够实现高性能和可扩展性的关键取决于两个基本的设计选型:

  • 尽可能限制工作进程的数量,从而减少上下文切换带来的开销。默认和推荐配置是让每个 CPU 内核对应一个工作进程,从而高效利用硬件资源。
  • 工作进程采用单线程,并以非阻塞的方式处理多个并发连接。

NGINX 的每个工作进程通过状态机处理多个连接请求,这个状态机被实现为非阻塞的工作方式:

  • 每个工作进程需要处理若干套接字,包括监听套接字或者连接套接字。
  • 当监听套接字收到新的请求时,会打开一个新的连接套接字来处理与客户端的通信。
  • 当一个事件到达连接套接字时,工作进程迅速完成响应,并转而处理其他任何套接字新收到的事件。

Garrett 说,NGINX 选择这样的设计,使它从根本上区别于其他 Web 服务器。通常的 Web 服务器会选用将每个连接分配给独立线程的模式,这使得多个连接的处理非常容易,因为每个连接可以被认为是包含多个步骤的一个线性序列,但这样会产生上下文切换的开销。事实上,工作线程大部分的时间处于阻塞的状态,在等待客户端或其它上游服务器。当试图执行 I/O 等操作的并发连接数 / 线程数的规模超过一定阈值,或是内存消耗殆尽的时候,上下文切换的成本就显现出来了。

从另一方面讲,NGINX 的设计是不让工作进程阻止网络流量,除非没有任何工作要做。此外,每一个新的连接只消耗很少的资源,仅包括一个文件描述符和少量的工作进程内存。

总的来说,NGINX 的这种工作模式在系统调优后,它的每个工作进程都能够处理成百上千的HTTP 并发连接。

查看英文原文: How NGINX Achieves Performance and Scalability


感谢邵思华对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群InfoQ 好读者)。

2015-06-26 07:499069

评论

发布
暂无评论
发现更多内容

网络七层结构是干啥的? 看这篇文章就够了

郑州埃文科技

TCP/IP 网络结构 传输网络

架构实战营|模块3

KDA

#架构实战营

明道云入围“2022年中国低/零代码行业影响力TOP15”

明道云

【Python技能树共建】正则表达式

梦想橡皮擦

6月月更

优酷端侧弹幕穿人技术实战之:PixelAI移动端实时人像分割

阿里巴巴文娱技术

音视频 弹幕 人像 移动端 移动端开发

刘勇智:一码通缺陷分析与架构设计方案丨声网开发者创业讲堂 Vol.02

声网

架构 创业讲堂

JWT 登录认证及 Token 自动续期

源字节1号

软件开发 前端开发 后端开发 小程序开发

得物技术埋点自动化验证的探索和最佳实践

得物技术

自动化 重构 稳定性 电商 埋点

面试突击55:delete、drop、truncate有什么区别?

王磊

Java 面试

帮助中心对企业有用吗?要不要做帮助中心页面?

小炮

电商后台权限设置有哪些规范你知道吗!

CRMEB

基于QUIC协议的HTTP/3正式发布!

JackJiang

网络编程 QUIC http3

GIT 常见问题

甜甜的白桃

git 版本管理 6月月更

我常用的两个翻译神器!程序员必备 | JavaGuide

JavaGuide

OA协同办公系统的发展趋势

力软低代码开发平台

什么是加密?有哪些加密类型和加密算法?逆天原创神作,值得一读!

wljslmz

加密 密码学 加密算法 网络技术 6月月更

Wallys/Network_Card/DR9074-2.4G-PN01.1-Wifi-6-Qualcomm-QCN9074

wallys-wifi6

wifi6 m.2 802.11AX QCN9074

Vue 中 JSX 的基本用法

CRMEB

web前端培训如何定位 MySQL 中DDL 被阻塞

@零度

MySQL 前端开发

SAS击球实验室向青少年展示数据与分析的价值

E科讯

java培训流Stream循环遍历list

@零度

stream JAVA开发

使用 JavaScript 开发AR(增强现实)移动应用的预备知识和环境搭建

汪子熙

JavaScript AR SAP 增强现实 6月月更

C#/VB.NET 在Word中设置纯色/渐变/图片背景

在下毛毛雨

C# .net word文档 背景设置

2022年中国现制柠檬茶市场发展洞察

易观分析

茶饮市场

数字货币持币生息质押理财dapp系统开发

开发微hkkf5566

系统运维 SIG 直播: libbpf 编译平台 LCC——eBPF从入门到享受 | 第 20 期

OpenAnolis小助手

Linux 运维 内核 ebpf LCC

这本书押中了2022北京高考作文题!

博文视点Broadview

助力工业化设计,提升变电站三维设计效率和业务保障

焱融科技

gpu 存储 数字化 三维设计 工业化设计

写入速度提升数十倍,TDengine 在拓斯达智能工厂解决方案上的应用

TDengine

数据库 tdengine 时序数据库

模块八:作业

本人法海

「架构实战营」

大数据培训 Yarn和Spark配置与说明

@零度

spark YARN 大数据开发

NGINX如何实现高性能和可扩展性_架构_Sergio De Simone_InfoQ精选文章