写点什么

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

评论

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

DevOps下测试的生存之道

嘉为蓝鲸

DevOps 测试

云原生时代的应用端到端可观测体系如何构建?

嘉为蓝鲸

运维 监控 可观测性 告警

重磅,无需特殊工具,直接访问网站!

八点半的Bruce.D

学C++的以后都能从事哪些岗位?

C++后台开发

c++ 后端开发 客户端开发 linux开发 C++开发

面向复杂业务场景下的低代码平台组件设计与实践分享

Baidu AICLOUD

组件化 低代码开发平台 数据映射

2022年最新数据库经典面试题及答案汇总(含PostgreSQL、Oracle、MySQL)

墨天轮

MySQL 数据库 oracle postgresql 面试题

一文浅析人工智能领域相关概念之间的关系

九章云极DataCanvas

人工智能 神经网络 机器学习

浅谈Python中的生成器

何极光

Python 生成器 10月月更

TOGAF认证考试开启“主线+支线+副本”模式!

涛哥 数字产品和业务架构

Go语言入门10—Map

良猿

Go golang 后端 Go web

千锋武汉分校前端学员走访英志软件,并开展现场面试

千锋IT教育

浅谈 Python 中的迭代器

何极光

Python 迭代器 10月月更

Zepoch已售出500+,Zebec Chain受到市场追捧

西柚子

敢承诺安全效果?IT人竟能如此省心

科技热闻

2022年汽车品牌智能网联竞争力指数(ICVCI)

易观分析

汽车 ICVCI 智能网联

OneFlow源码解析:Global Tensor

OneFlow

人工智能 深度学习 源码解析

Sanitizers 系列之 address sanitizer 原理篇

网易云信

数据库 算法 系统

Spring Boot「18」使用 JDBC 连接数据库

Samson

Java spring 学习笔记 spring-boot 10月月更

SSH的工作原理、加密方式以及配置多个ssh key

甜点cc

前端 学习笔记 加密 SSH 10月月更

精盾信息莅临千锋教育武汉校区招聘前端开发工程师

千锋IT教育

实时数据湖 Flink Hudi 实践探索

阿里云大数据AI技术

大数据 flink 企业号十月 PK 榜

uniapp 提示 打包时未添加 push模块

源字节1号

软件开发 前端开发 后端开发 小程序开发

WhaleDI自助建模实践与探索

鲸品堂

AI Codec 建模

阿里云注册集群+Prometheus 解决多云容器集群运维痛点

阿里巴巴云原生

阿里云 云原生 Grafana Prometheus

开源代码安全 | 微软是如何应对开源代码安全问题的?

龙智—DevSecOps解决方案

开源 开源代码

【FAQ】关于华为地图服务定位存在偏差的原因及解决办法

HarmonyOS SDK

地图

澜舟科技推出【熊猫小说家】小程序,用 AI 书写你的故事

澜舟孟子开源社区

人工智能 nlp AIGC

使用Docker部署软件运行环境

源字节1号

软件开发 前端开发 后端开发 小程序开发

千锋教育走访人才合作企业数式科技 深度了解企业人才需求

千锋IT教育

嘉为蓝鲸可观测性产品获Gartner Toolkit 推荐

嘉为蓝鲸

运维 监控 Gartner 可观测

如何让 SAP Spartacus 访问 navigation node 的上下文,暴露更多的字段

阿英

typescript angular SAP Spartacus 10月月更

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