硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

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:499347

评论

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

盘点 15 个好用的 API 接口管理神器

Java小咖秀

工具 工具分享

区块链电子合同--助推合同数字化管理

13530558032

华云大咖说 | 华云数据与海量数据携手共建国产云生态

华云数据

Linux cat 命令

一个大红包

4月日更

多功能工具箱Quicker+笔记软件flomo,竟然还能擦出这样的火花?

彭宏豪95

效率 工具软件 笔记 工具分享 4月日更

python 调用 cmd 而不显示黑框的方法

一代咩神

Python cmd

手把手教你写一个spring IOC容器

华为云开发者联盟

spring 容器 ioc spring框架

Golang 字符串分组

一代咩神

Go 语言

区块链农产品质量安全溯源,保证农产品品质

13530558032

火山引擎 Redis 云原生实践

火山引擎开发者社区

云原生 redis cluster

面试笔记(一)事务连环炮

U2647

分布式事务 事务隔离级别 事务 4月日更

区块链产业园区服务平台开发,搭建区块链园区运营平台

13828808769

区块链+ #区块链#

初识Nginx(一)

书旅

nginx

智慧平安社区建设,创建“三零平安社区”

13530558032

团队协作中,如何写出让同事赞不绝口的代码

有道技术团队

代码规范

重磅功能!博睿数据APM助企业从容应对云原生架构演进

博睿数据

应用性能监控产品 Bonree Server 博睿数据 bonree

LeetCode题解:剑指 Offer 49. 丑数,二叉堆,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

Spring IOC 特性有哪些,不会读不懂源码!

小傅哥

Java spring 小傅哥 控制反转IOC

区块链农产品溯源平台,为农产品质量安全护航

13828808769

区块链 区块链+

技术分享第二讲报名!

神策技术社区

大数据 活动 报名 神策

马特量化交易机器人,炒币24小时不停歇

飞亚科技

空中交警:借你一双“慧眼”,让你看透这飞机的“黑色十分钟”

华为云开发者联盟

modelarts yolo 华为云ModelArts 模型开发 华为开发者大会2021

【LeetCode】寻找旋转排序数组中的最小值Java题解

Albert

算法 LeetCode 4月日更

语音聊天室 anyHouse 使用手册

anyRTC开发者

ios android 音视频 WebRTC RTC

EFT【阿凡提】等级规则、收益、排线方法与EFTalk十大关键点

币圈那点事

区块链数据共享平台—追踪、溯源、可信

电微13828808271

区块链+

3w 字长文爆肝 Java 基础面试题!太顶了!!!

苹果看辽宁体育

Java 面试 后端

“区块链+电子处方”,医疗跟更健康

电微13828808271

年薪百万是社会认同,更是自身价值体现

博文视点Broadview

善盾SD币是什么?

飞亚科技

SumSwap节点预售关注度飙升而Uniswap V3版本却备受争议

币圈资讯

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