写点什么

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

评论

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

[Day6]-[动态规划] 俄罗斯套娃

方勇(gopher)

LeetCode 数据结构和算法

Linux之ssh-add命令

入门小站

Linux驱动开发-编写(EEPROM)AT24C02驱动

DS小龙哥

4月月更

王者荣耀商城异地多活架构设计

「架构实战营」

当东数西算变成一场西游记……

白洞计划

在线时间加减计算器

入门小站

计算器

在线XML压缩工具

入门小站

工具

为什么他们选择阿里云容器服务 ACK

阿里巴巴云原生

阿里云 容器 ACK 合作 阿里云云原生

OpenKruise v1.1:功能增强与上游对齐,大规模场景性能优化

阿里巴巴云原生

阿里云 容器 云原生 OpenKruise 套件

王者荣耀商城异地多活架构设计

孙强

#架构师实战

浏览器突然好用多了。。。

Jackpop

初创者的精神和领导力--Coursera学习笔记(27/100)

hackstoic

领导力 创业者

浅谈软件项目开发过程

小锅米线

OpenYurt 之 Yurthub 数据过滤框架解析

阿里巴巴云原生

阿里云 开源 容器 云原生 边缘计算

架构设计学习资料汇总

俞凡

架构

系统架构实践(一)

Trent

SeekTiger治理通证STI流动性质押的背后,是DAO社区的支持

小哈区块

【图解数据结构】栈全面总结

知心宝贝

c++ 数据结构 算法 4月月更

恭喜我的同事丁宇入选年度 IT 领军人物

阿里巴巴云原生

阿里云 开源 云原生 获奖

让页面跳转更有趣 —— 实现自定义页面切换转场动画

岛上码农

flutter 移动端开发 4月月更 跨平台开发 安卓 ios

赶紧给你的文件加个密吧!

Jackpop

基于 KubeVela 的机器学习实践

阿里巴巴云原生

阿里云 开源 容器 云原生 KubeVela

即学即会 Serverless | 如何解决 Serverless 应用开发部署的难题?

阿里巴巴云原生

阿里云 开源 Serverless 云原生 Serverless Devs

王者荣耀商城异地多活架构设计

Geek_8d5fe5

「架构实战营」

剑指Offer之面试题57: 和为s的数字

宇宙之一粟

算法刷题 4月月更 剑指Offer

阿里云OSS图床搭建

懒时小窝

阿里云 OSS 图床

你真的会用搜索引擎吗?

Jackpop

体验一款基于AI和区块链的体感运动App(26/100)

hackstoic

NFT 区块链、 gamefi P2E

flink维表查询redis之flink-connector-redis

山里小龙

一条SQL语句是如何执行的?

程序员阿杜

MySQL 数据库

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