70+专家分享实战经验,2024年度AI最佳实践都在AICon北京 了解详情
写点什么

如何用 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:2931152

评论

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

【Doris全面解析】存储层设计介绍1——存储结构设计解析

ApacheDoris

【Doris全面解析】存储层设计介绍2——写入流程、删除流程分析

ApacheDoris

同样做软件测试,和月收入3W的学弟聊了一晚上,我崩溃了

程序员阿沐

程序员 软件测试 测试开发 测试工程师

【遇见Doris】Apache Doris 在百度商业大规模微服务全链路监控的实践

ApacheDoris

【遇见Doris】

RUOYI 框架教程 2 |小白都能学会的 3 分钟搭建框架教程

Java_若依框架教程

Java 技术 Ruoyi 框架 若依

【遇见Doris】 Apache Doris 基于 Bitmap的精确去重和用户行为分析

ApacheDoris

【遇见Doris】

RUOYI 框架教程 11 | 若依主页面调用类目表,写入主表相关信息,居然这么简单!(第九篇~)

Java_若依框架教程

Java 技术 Ruoyi 框架 若依

有趣的技术知识1 | 为什么这些网站电脑打不开,手机却可以访问?(附智能追剧解决方案)

Java_若依框架教程

有趣的技术知识

[C++总结记录]构造函数与析构函数注意点

图解AI

【遇见Doris】寒冷冬日的一次温暖相聚 · Doris开发者沙龙

ApacheDoris

【遇见Doris】

RUOYI 框架教程 3 | 操作小技巧,快看看你掌握了多少!

Java_若依框架教程

Java 技术 Ruoyi 框架 若依

RUOYI 框架教程 7 |若依js设置高度及自适应居然这么简单,你敢信么!

Java_若依框架教程

Java 技术 Ruoyi 框架 若依

维特斯交易所系统开发详情丨维特斯交易所源码案例

系统开发咨询1357O98O718

[C++总结记录]对象内存占用情况及this指针注意点

图解AI

c++

[C++总结记录]构造函数初始化注意点

图解AI

c++

RUOYI 框架教程 10 |若依Excell数据导出小数处理,你会么!

Java_若依框架教程

Java 技术 Ruoyi 框架 若依

[C++总结记录]构造函数与析构函数调用时机

图解AI

c++

【遇见Doris】Doris核心功能介绍——数据模型和物化视图

ApacheDoris

RUOYI 框架教程 4 | 若依操作小技巧,快看看你学"废"了吗!(第二篇~)

Java_若依框架教程

Java 技术 Ruoyi 框架 若依

RUOYI 框架教程 9|若依数据权限这样控制到个人,你是这么用的么!

Java_若依框架教程

Java 技术 Ruoyi 框架 若依

有趣的技术知识 2 | 来了,阿里云网盘公测!

Java_若依框架教程

有趣的技术知识

一篇文章带你熟知:软件公司的分类及人员构成

程序员阿沐

互联网 面试 职业规划 软件测试 测试工程师

TouChain系统开发案例介绍

系统开发咨询1357O98O718

【实践分享】ProxySQL实现Doris FE高可用

ApacheDoris

RUOYI 框架教程 5 |若依Excell导入这么做,0经验小白都能写!

Java_若依框架教程

Java 技术 Ruoyi 框架 若依

RUOYI 框架教程 6 |若依日期操作居然这么多写法,你敢信么!

Java_若依框架教程

Java Ruoyi 教程 框架 若依

RUOYI 框架教程 8 | 若依给页面加水印这么简单,你见过么!

Java_若依框架教程

Java 技术 Ruoyi 框架 若依

时间管理的三个版本

三界

时间管理 职场经验

【遇见Doris】Apache Doris在京东双十一大促中的实践

ApacheDoris

【遇见Doirs】

【遇见Doris】Doris基于Hive表的全局字典设计与实现

ApacheDoris

【遇见Doris】

【遇见Doris】Spark Doris Sink的设计和实现

ApacheDoris

【遇见Doris】

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