写点什么

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

评论

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

Web Components系列(七) ——自定义组件的生命周期

编程三昧

前端 组件化 2月月更 WebComponent

「架构实战营」模块二作业 朋友圈复杂度

hxb

「架构实战营」

微信朋友圈的高性能复杂度分析

凌波微步

「架构实战营」

架构实战营模块九作业

spark99

架构实战营

我做基础架构学到的42件事

多颗糖

数据库 架构 架构师 基础架构

微信朋友圈高性能架构设计

五月雨

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

微信朋友圈的高性能复杂度分析

Leo

架构实战营

TDengine在TCL空调能源管理平台的实践

TDengine

数据库 大数据 tdengine 物联网

几种数据库存储引擎比较

乌龟哥哥

:MySQL 数据库 2月月更

使用 Cilium 增强 Kubernetes 网络安全

张晓辉

Kubernetes 云原生 ebpf cilium

Linux系统编程-进程概念、进程管理、信号处理

DS小龙哥

2月月更

微信朋友圈的高性能复杂度

Geek_16d2b8

#架构训练营

最全总结 | Android 系统抓包喂饭教程!

星安果

android 抓包

如何用 Python 实现一个单链表

宇宙之一粟

Python 数据结构 单向链表 2月月更

微信朋友圈复杂度分析与设计

刘帅

重磅消息·OpenMLDB官方网站 今日正式上线!

第四范式开发者社区

人工智能 机器学习 开源项目 AI Studio 特征平台

Linux系统编程-Shell脚本基本使用(数组、函数、字符串处理)

DS小龙哥

Shell 2月月更

WebRTC 如何在安卓系统上采集音频数据 | 社区征文

liuzhen007

音视频 WebRTC 新春征文 2月月更

《MySQL入门很轻松》第3章:数据库的创建与操作

乌龟哥哥

:MySQL 数据库 2月月更

国内外最顶级的十大敏捷项目开发管理工具盘点

爱吃小舅的鱼

Linux系统编程-进程创建(fork)、外部程序调用(exec)

DS小龙哥

进程 fork 2月月更

Redis 在 vivo 推送平台的应用与优化实践

vivo互联网技术

服务器 消息推送 redis'

[架构实战营]-朋友圈的高性能架构设计

邹玉麒

「架构实战营」

微信朋友圈复杂度分析&架构设计

AragornYang

架构训练营 架构实战营

微信朋友圈高性能复杂度分析

浪飞

六年安卓开发的技术回顾和展望 | 社区征文

拭心

android 程序员人生 shixinzhang 新春征文 2月月更

微信朋友圈的高性能复杂度分析

石小天

架构实战营

计算机毕业设计安卓疫苗预约APP源码,后台java springboot

清风

安卓 计算机毕业设计

Kotlin语法手册(二)

寻找生命中的美好

android kotlin 安卓

微信朋友圈高性能复杂度分析

Bear

「架构实战营」

react源码解析6.legacy模式和concurrent模式

buchila11

React

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