写点什么

如何用 Nginx 实现百万并发连接?| 极客时间

  • 2019-05-24
  • 本文字数:2358 字

    阅读完需:约 8 分钟

如何用Nginx实现百万并发连接?| 极客时间

大家好,我是《Nginx核心知识100讲》课程讲师–陶辉,有幸能借这个文章的机会,和大家分享 Nginx 的重难点:Nginx 究竟是如何支持百万并发连接的?


其实,大家学习 Nginx,最大的动力是想让自己的产品在支持高并发请求的同时保持高效的服务。那除了掌握 Nginx,可能没有其他更好的选择。


在学习 Nginx 路上,你可能会遇到很多阻碍,比如:


  • 当你在做扩展功能时发现新增的指令 Nginx 不支持,不知道如何增加 Nginx 模块,如何分析 access 日志

  • Nginx 里的 Master 进程和 Worker 进程到底是怎样的?

  • Nginx 是如何在高并发下使用户无感知的热部署?

  • cache 的缓存问题

  • 不清楚 OpenResty 的 Lua 模块如何与 Nginx 结合使用,以及这个对 Nginx 性能的影响

  • ……


其实,这些问题我在课程里都有做系统性的讲解,有些是用 3-4 个视频来完整地讲解一个知识点,有些疑惑你单看目录就能找到答案。不过我还是希望大家能从 0 开始,跟着我系统性地把这套视频学完,那么百万并发下的 Nginx 性能优化之道,你基本就掌握了。


今天,我们就直达要点,来看看 Nginx 究竟是如何支持百万并发连接的?

1、搞清楚 TCP 连接的并发

首先是对于 TCP 连接并发的掌握。不少同学认为,由于端口最大范围是 65535,所以 Nginx 的最大并发连接数就是 65535。实际上,Nginx 的并发连接可以达到百万或者千万级,原因是 TCP 连接是个四元组,它包括(源 IP、源端口、目的 IP、目的端口)。


我们以 32 位的 IPv4 地址为例,如果不考虑资源限制,理论上它的最大并发连接数是 2^(32+16+32+16)个(因为 IP 为 32 位,端口号为 16 位),远远大于 65535。


显然,在如此巨大的并发连接数下,再细小的问题都可能会被放大很多倍。所以,我们要精细化配置 Linux 中的 TCP 选项(TCP 层由操作系统内核实现),优化建立连接的速度,防御针对建立连接过程的种种恶意攻击。



必看知识点:


第123讲 | 控制TCP三次握手参数


第124讲 | 建立TCP连接优化

2、掌握磁盘 IO 优化

众所周知,磁盘是计算机体系中最慢的设备,它远远慢于 CPU 计算速度、内存的存取、网络的传输等。正如我们所熟悉的短板理论,最慢的磁盘,很容易成为服务器性能的瓶颈。


因此,虽然在很多场景下,Nginx 最主要的工作是协议解析与网络传输(如反向代理),但少量的磁盘操作,却也可能大幅度降低 Nginx 性能。


所以,我们要在了解磁盘特点及操作系统 API 的基础上,尝试减少磁盘操作,或者优化磁盘操作。比如,在每次工作前,你可以先问一下自己:


  • access.log 是不是可以批量写入磁盘?

  • 是不是可以压缩后再写入,以减少传输字节数?

  • 或者是,干脆使用 syslog 协议,走网络写入其他服务器?



当 Nginx 用于 CDN 或者静态资源服务器时,大量的读操作下,我们需要考虑,对大文件采用 DirectIO 以减少无谓的高速缓存操作;而在 AIO 失效时,还要考虑基于线程池来应对阻塞等问题。


必看知识点:


第132讲 | 磁盘IO的优化

3、弄懂优化内存分配

Nginx 会确保每一个连接消耗的内存最小化,这也是 Nginx 支持高并发的关键。由于内存资源有限,并发数却数以百万计,这就要求在 Nginx 用户态下,每个连接所用的内存都应遵循以下几个原则:


  • 够用就好;

  • 延迟分配;

  • 减少内存碎片等等。


所以,弄清楚优化内存分配,首先你就得明白内存工作原理。在「第二章:Nginx 架构基础」的「第36讲 | 内存池对性能的影响」中我介绍过内存池的意义,在「第三章:详解 HTTP 模块」的「第45讲 | 处理HTTP请求头部的流程」中提及过处理请求过程中基于内存池分配的内存大小。


不过,TCP 是由操作系统内核实现的,所以 TCP 协议处理相关的内存,需要通过配置内核参数来控制,「第五章:Nginx 的系统层性能优化」对此有深入介绍。


推荐你看看以下的内容,看你是否已掌握 Nginx 性能优化中的重要部分:TCP 协议。


第120讲 | 性能优化方法论


第128讲 | TCP协议的keepalive功能


当然,分配内存的速度也非常重要。googleperftool 提供的 tcmalloc,就是为了替代默认的 glibc 库,用来分配内存的工具。它在多线程分配小块内存的速度上有很大优势。


必看知识点:


第135讲 | 用tcmalloc优化内存分配

4、高效使用 CPU 的负载均衡

提升性能工作中,最重要的一环,就是提升 CPU 的计算速度。不过,在如今动则 32 核、64 核等的多核 CPU 架构下,提升 CPU 效率便复杂了很多。比如下面这几个方面的问题:


  • 由于 CPU 有 1 级、2 级、3 级缓存之分,并且每级缓存的存取速度相差很大。所以,我们需要提升 CPU 缓存的利用率,例如需要绑定进程与 CPU。

  • 新版本的内核通过 reuseport,高效地解决了“惊群”问题。但这一选项,却需要我们显式配置。

  • NUMA 架构解决了总线带宽的束缚问题,但又引入了访问部分主存过慢的问题。

  • 多队列网卡可以提升 CPU 处理网络 packet 的效率,但它并不是万能的,只在其适用场景下发挥作用。


总的来说,多核确实意味着更强大的计算力,但真正的银弹并不存在。若想基于增加 CPU 核数获得接近线性提升的计算力,我们还有许多工作要做。


必看知识点:


第121讲 | 如何高效使用CPU

完结寄语

《Nginx核心知识100讲》已经完结,从预计 100 讲的内容扩充到了 155 讲,历经 3 个月的课程录制,才把我想交付给大家的知识点尽数讲完。


虽然网上关于 Nginx 的使用介绍非常多,但存在着“仅从使用层面介绍,未深入原理未”、“未体系化的性能优化知识”等问题。抱着想解决以上两个问题,及让大家系统化掌握 Nginx 的心,我从 HTTP 应用层、分布式集群到硬件及操作系统内核优化等等层面,把 Nginx 的知识点体系化地解读给大家。


大家若能跟着这一整套视频完整地学下来,必然能从 Nginx 的初级使用者成长为高阶使用者,搭建起自己的 Nginx 知识全景图。

学完课程后,你将获得:

  1. 基础知识详解及核心架构剖析

  2. 搭建支持百万高并发的 Nginx 服务

  3. 从内核优化到源码解读的全方位拆解

  4. OpenResty + Nginx 开发实战


戳此订阅/试看


2019-05-24 17:2931955

评论

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

C++ 动态新闻推送 第36期

很水

c++

Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索

数据库

Python代码阅读(第57篇):倒序字符串

Felix

Python 编程 string 阅读代码 Python初学者

终于有人把“元宇宙”说清楚了

CECBC

12 K8S之应用容器及Pod资源

穿过生命散发芬芳

k8s 11月日更

送给正在入行的小白:最全最有用的网络安全学习路线已经安排上了

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

质量基础设施一站式云服务平台搭建,NQI一站式服务平台

电微13828808271

【得物技术】得物直播秒开体验提升

得物技术

体验 直播 视频 优化 卡顿

互联网大厂考点(阿里+百度+腾讯+字节跳动+美团+京东)

Java高级开发

Java 程序员 架构 面试 大厂

Alibaba Druid 源码阅读(四) 数据库连接池中连接获取探索

数据库

2021年10月券商App行情刷新及交易体验评测报告,兴业证券荣登榜首!

博睿数据

Prometheus HTTP API 查询(六)Prometheus Server 状态和 TSDB 状态

耳东@Erdong

Prometheus PromQL HTTP API 11月日更

区块链符号理论:符号方案和符号系统

CECBC

接口调用的链路

卢卡多多

接口 11月日更

Alibaba Druid 源码阅读(一) 数据库连接池初步

数据库

Alibaba Druid 源码阅读(二) 数据库连接池实现初步探索

数据库

ZGC在合合信息HBase平台中的实践

合合信息大数据团队

大数据 性能优化 ZGC HBase 合合信息

网易云信携手“瑶台”,打造元宇宙商业化实践标杆案例

网易云信

人工智能 虚拟化 虚拟人 元宇宙

鸿蒙的绿野仙踪

脑极体

Alibaba Druid 源码阅读(三) 数据库连接池初始化探索

数据库

模块三作业

panxiaochun

架构实战营

投资元宇宙,如何开启混合现实开发

龙智—DevSecOps解决方案

游戏开发 元宇宙 混合现实

模块三-学生管理系统架构设计文档

迪马

研发提效:通过设计稿自动生成前端代码。

石云升

大前端 自动生成 11月日更 研发提效

自定义View:如何实现手动拖动的图片控件

Changing Lin

11月日更

当一名科技女性,决定不再做月亮

脑极体

GrowingIO Design 图标库:从原理到实现

GrowingIO技术专栏

SVG 图标库 Sprites Icon Font GrowingIO Design

四大研究成果入选 百度安全在Black Hat Europe 2021再创历史

百度安全

应用安全 百度安全 Black Hat 漏洞利用 恶意软件

阿里灵杰产品全面拥抱云原生,双11优惠让企业体会上云便利

阿里云大数据AI技术

大数据 AI 云原生 阿里灵杰

区块链之共识算法系列——PoW(二)

Regan Yue

区块链 11月日更 趣讲区块链

详解低延时高音质:回声消除与降噪篇

RTE开发者社区

回声消除 音频体验 RTE技术详解

如何用Nginx实现百万并发连接?| 极客时间_语言 & 开发_陶辉_InfoQ精选文章