【ArchSummit 】会议即将开幕,一起来看架构师在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:498780

评论

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

资本市场两极分化将是新常态

JiangX

28天写作

团队建设,凝聚人心打胜战

一笑

管理 团队建设 28天写作

14天1000+大集群滚动升级,银行柜台竟然毫无感觉

华为云开发者联盟

大数据 金融 FusionInsight 华为云 集群

localStorage和sessionStorage本地存储

我是哪吒

html html5 面试 大前端 html/css

GTX1060安装TF2-GPU

IT蜗壳-Tango

七日更

老同学遭遇电信诈骗纪实

石君

28天写作 电信诈骗

区块链真正的价值即将“引爆”行业应用

CECBC

区块链金融

半导体芯片小白基础知识(1) (28天写作 Day22/28)

mtfelix

芯片 半导体 集成电路 28天写作

字节跳动:“挖”出来的技术战斗力

李忠良

28天写作

MapReduce练习案例4 -求共同好友

小马哥

大数据 hadoop mapreduce 七日更

Soul 源码阅读 06|Nacos 同步数据分析

哼干嘛

浅说 SQLite 的许可证模式

Justin

开源 版权保护 28天写作

架构解读丨Volcano作业资源预留设计原理

华为云开发者联盟

批处理 Volcano 资源预留 作业资源预留

28天瞎写的第二百三十二天:转角遇到蚵仔煎

树上

28天写作

创业失败启示录|神奇的茶学

阿萌

28天写作 创业失败启示录 青城

机器学习·笔记之:Gradient Descent

Nydia

【Node.js】事件触发器 - 基础篇

德育处主任

Node 28天写作

两种端到端通用目标检测方法

华为云开发者联盟

训练 目标检测 端到端 DETR DeFCN

jdk8 String和StringBuilder对象创建所在位置

ilovealt

Java string StringBuilder

回到过去就能无憾了吗?「幻想短篇 22/28」

道伟

28天写作

区块链人才能力评价测试机构亮相

CECBC

区块链人才

融资融券两融系统搭建开发

v16629866266

数字货币将如何改变日常生活

CECBC

数字货币

架构师训练营第 2 期 第 6 周 作业一:CAP原理.md

老腊肉

架构师训练营第2期

管理笔记[1]:成为管理者的开端“以人文本“

L3C老司机

h-index

lidaobing

28天写作 h-index

提词器来了 | 视频号28天(23)

赵新龙

28天写作

《程序员修炼之道》- 务实的方法(4)

石云升

程序员 28天写作

开发质量提升系列:系统建起来就能解决项目的困难?

罗小龙

最佳实践 方法论 28天写作

Elasticsearch 是分布式文件存储么 ?

escray

elastic 七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试

苹果设备电池及充电周期

张老蔫

28天写作

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