写点什么

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

评论

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

<<活法>>读后感

Tiger

28天写作

区块链技术何以成为中国数字化转型最新驱动力?

CECBC

央行数字货币完成闭环测试 亮剑在即

CECBC

netty系列之:一个价值上亿的网站速度优化方案

程序那些事

Java Netty nio 程序那些事 12月日更

30个类手写Spring核心原理之Ioc顶层架构设计(2)

Tom弹架构

Java spring 源码

2022年企业采购多云管理软件就选行云管家!

行云管家

云计算 公有云 混合云 多云 云管理

【干货分享】研效优化实践:AI算法助力深层BUG挖掘

WeTest

10年经验总结,华为fellow教你如何成为一名优秀的架构师?

华为云开发者联盟

架构设计 架构师 华为fellow 云服务运维

大数据开发之传输组件Sqoop的功能介绍

@零度

大数据 sqoop

OceanBase 源码解读(七):一文读懂数据库索引实现原理

OceanBase 数据库

开源 oceanbase 技术解析

【入门教程直播第三期】如何完成一次高质量的 OceanBase 数据迁移

OceanBase 数据库

数据库 学习 开源 课程 oceanbase

Camtasia有哪些基本功能

淋雨

Camtasia 录屏软件

模块6作业

Asha

浅谈服务网关和联邦云

星环科技

联邦云 服务网关

万吨黄金做后盾!央行数字货币正式拉开序幕

CECBC

🏆【Alibaba中间件技术系列】「RocketMQ技术专题」Broker配置介绍及发送流程、异常(XX Busy)问题分析

洛神灬殇

RocketMQ 消息队列 Apache RocketMQ 12月日更 System Busy/Broker busy

青岛等保测评机构有几家?咨询电话多少?在哪里?

行云管家

网络安全 等保 等级保护 等保测评 等保2.0

极光笔记|基于CMPP协议集成短信测试桩全流程实践分享

极光JIGUANG

Kyligence 智能数据服务与管理相关研究

Kyligence

技术专题合集

Linux常用命令速查手册

入门小站

Linux

架构实战营-模块六作业

无名

架构实战营 「架构实战营」

MySql优化:一条SQL语句的执行过程是怎样的?

秋水

MySQL性能优化 内容合集 签约计划第二季

站在你领导的角度考虑问题

张老蔫

28天写作

Python enumerate():使用计数器简化循环

华为云开发者联盟

Python 变量 计数器 循环 enumerate

前端开发之Vue 技术栈编写表单组件

@零度

Vue 前端开发

注册了一个新域名(10/28)

赵新龙

28天写作

恒拓高科WorkPlus助力南兴装备移动数字化升级

WorkPlus

Linux一学就会之文件系统结构-硬链接和软链接

学神来啦

Linux 运维 链接 linux云计算 硬盘

浅析流媒体CDN与WEB CDN的业务差异

郑州埃文科技

CDN加速 IP网络 在线并发

数据库大赛50强之「中国人民大学」:培养工程性精英人才,共筑数据库美好未来

OceanBase 数据库

开源 新闻动态 oceanbase OceanBase 数据库大赛

在自己的服务器上部署hexo博客

为自己带盐

Hexo 28天写作 12月日更

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