写点什么

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

评论

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

来,肝了这份网络安全学习计划无敌

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 学习安全

官方线索|FATE开源社区1024程序员节福利

石云升

1024我在现场 10月月更

EMQ 在2021电力人工智能大会:稳健数据基础设施架构支撑电力数字化发展

EMQ映云科技

人工智能 物联网 电力 mqtt

我的新下属都怀念老领导,我该把他们全部开除吗?

石云升

职场经验 10月月更

数字化转型请从一个清晰的定义开始 | DBT What

王和全

人工智能 大数据 数字化转型 数字化 数字经济

利用基数排序LSD方法给等长字符串按字典序排序

Regan Yue

算法 10月月更

欢庆1024程序员节,开源茁壮成长

Zilliz

创业 开源 程序员 成长

024云原生之软件部署策略

穿过生命散发芬芳

云原生 10月月更

Leetcode 题目解析:96. 不同的二叉搜索树

程序员架构进阶

算法 LeetCode 10月月更

👊【Spring技术实战】分析探究RedisTemplate的序列化和反序列化+泛型机制

码界西柚

spring 序列化 RedisTemplate 10月月更

解决网卡“Device eth0 does not seem to be present, delaying initialization”

耳东@Erdong

Linux 10月月更

开源应用中心 | KodBox快捷高效的私有云在线文档管理系统

开源技术

GrowingIO 数据安全实践

GrowingIO技术专栏

隐私保护 数据安全 隐私安全 数据安全法

以“有用”为圆心:重新认识智慧城市的“高手之路”

脑极体

从芯片公司到VR,字节跳动为了元宇宙加码布局

海比研究院

北鲲云如何为企业提供混合云解决方案

北鲲云

linux之curl使用技巧

入门小站

Linux

在线文字转图片工具

入门小站

工具

3面蚂蚁,一路过关斩将 成功拿到offer定级P6,大厂面试雀食有点难!

进击的王小二

java面试 大厂面试 阿里巴巴面经总结 java

华为云企业级Redis:助力VMALL打造先进特征平台

华为云数据库小助手

GaussDB GaussDB ( for Redis ) 华为云数据库

面试了一个34岁的Java大佬,感觉到他背过很多面试题,年薪50w面试基本都能答得上

Java java面试 java架构

HarmonyOS Connect伙伴峰会,车载智慧屏S50正式发布

科技汇

从区块链到元宇宙 Metaverse

devpoint

区块链 元宇宙 10月月更

硝烟弥漫的安全战场,只等一位超级英雄登场

白洞计划

Stream 操作

风翱

stream 10月月更

自定义View:resolveSizeAndState方法

Changing Lin

10月月更

Android 音视频 - EGL 源码解析以及 C++ 实现

声网

android 音视频 OpenGL ES

声网发布融合CDN直播等系列新品,拓宽RTE产品边界

ToB行业头条

声网

【得物技术】时间切片的实践与应用

得物技术

架构 性能优化 大前端 性能 业务

揭秘!探访百度AI反诈第一线

脑极体

再谈字节小程序

字节跳动终端技术

小程序 字节跳动 火山引擎

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