写点什么

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

评论

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

量化合约对冲挖矿app软件开发案例(支持测试)

开发微hkkf5566

字节跳动开源数据集成引擎BitSail的演进历程与能力解析

字节跳动数据平台

数据库 开源 数据开发 数据集成 企业号十月 PK 榜

分布式锁实战:基于Zookeeper的实现

小小怪下士

Java zookeeper 分布式

IM消息ID技术专题(七):网易严选分布式ID的技术选型、优化、落地实践

JackJiang

网络编程 即时通讯 IM 开源im

NGINX Sprint 年度线上会议:报名通道已开启,立即预定您的 NGINX 深潜之旅

NGINX开源社区

nginx

【愚公系列】2022年11月 Go教学课程 040-字符串处理

愚公搬代码

11月月更

前端 30 问:愿你能三十而立

GFE

面试 前端

什么是实时渲染及其重要性

3DCAT实时渲染

云计算 元宇宙 实时渲染 实时云渲染 云VR

软件测试面试真题 | 说一下常用的控件定位方法

测试人

软件测试 面试题 web测试 元素定位

为什么应该切换到实时渲染

3DCAT实时渲染

云计算 元宇宙 实时渲染 实时云渲染 云VR

NFTScan 与 Bitizen 钱包达成战略合作,双方将在 NFT 数据层面进行深度合作

NFT Research

NFT 数据基础设施

图数据 3D 可视化在 Explorer 中的应用

NebulaGraph

可视化 图数据库 3D

扒官方文档学Ts类型编程

GFE

typescript 前端

云转售是什么意思?哪家好?理由是什么?

行云管家

云计算 企业上云 云资源 云转售

网络爬虫技术及应用

郑州埃文科技

网络安全 IP地址资源 爬虫技术

WEB项目如何通知用户在线更新?

GFE

前端 版本管理

图解vue3.0编译器核心原理

GFE

前端 Vue3

Go语言入门12—异常

良猿

Go golang 后端 11月月更

Spring Boot「22」使用 Hibernate & JPA 持久化 Java 对象

Samson

Java hibernate Spring Boot 学习笔记 11月月更

扒官方文档学Ts类型编程(二)

GFE

typescript 前端

Discount-industrial mini pcie card/Dual Band 2.4GHz 5GHz 2x2 MIMO 802.11ac Mini PCIE WiFi Module//QCA9880 3x3 FCC/CE/IC

Cindy-wallys

QCA9880 802.11ac 3*3 2*2 2.4G&5G

通过云效 CI/CD 实现微服务全链路灰度

阿里巴巴云原生

阿里云 微服务 云原生

《数字经济全景白皮书》中国商业银行普惠金融可持续发展能力评价

易观分析

银行 普惠金融

实时渲染如何改变视频制作和动画制作

3DCAT实时渲染

云计算 元宇宙 实时渲染 实时云渲染 云VR

平均110万个漏洞被积压,企业漏洞管理状况堪忧

SEAL安全

DevSecOps 漏洞修复 软件供应链安全 漏洞管理 漏洞优先级匹配

CAD和实时渲染之间的差距

3DCAT实时渲染

云计算 元宇宙 实时渲染 实时云渲染 云VR

三位技术大咖的「研发效能」实践干货

万事ONES

研发效能 课程笔记

python小知识-classmethod类方法

AIWeker

Python 人工智能 python小知识 11月月更

7k字,12张图,从零到一带你详解Redis

Java永远的神

数据库 nosql redis 程序员 面试

详解linux多线程——互斥锁、条件变量、读写锁、自旋锁、信号量

C++后台开发

多线程 后端开发 linux开发 C++开发

堡垒机按什么收费?大概多少钱?有一个标准吗?

行云管家

网络安全 堡垒机 IT安全

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