理解Linux高性能网络架构的那些事

Egress 控制在现代网络架构 技术总结 在计算机网络中,“Egress” 指的是从一个网络或设备发送出去的数据流量。它与 “Ingress”(进入网络或设备的数据流量)相对。Egress 控制和管理在现代网络架构中至关重要,特别是在安全性、合规性和性能优化方面。以下是对 Egress 技术的详细总结和使用指南。在计算机网络中,“Egress” 指的是从一个网络或设备发送出去的数据流量。它与 “Ingress”(进入网络或设备的数据流量)相对。Egress 控制和管理在现代网络架构中至关重要,特别是在安全性、合规性和性能优化方面。 阅读详情

通过本文你将会了解到以下内容:

  • IO事件和IO复用

  • 线程模型和事件驱动模型的架构

  • 基于事件驱动的Reactor模式详解

  • 同步IO和异步IO简介

1. IO事件和IO复用

1.1 什么是IO事件

IO指的是输入Input/输出Output,但是从汉语角度来说,出和入是相对的,所以我们需要个参照物。

这里我们的参照物选择为程序运行时的主存储空间,外部通常包括网卡、磁盘等。

有了上述的设定理解起来就方便多了,我们来一起看下:

IO的本质是数据的流动,数据可以从网卡到程序内存,也可以从程序内存写到网卡,磁盘操作也是如此。

所以可以把常见的IO分为:

  • 网络IO:内存和网卡的数据交互

  • 文件IO:内存和磁盘的数据交互

图片

那什么又是IO事件呢?

事件可以理解为一种状态或者动作,也就是状态的迁移会触发一种相应的动作。

网络IO的事件通常包括:

  • 可读事件

  • 可写事件

  • 异常事件

理解可读可写事件是非常有必要的,一般来说一个socket大部分时候是可写的,但是并不是都可读。

可读一般代表是一个新连接或者原有连接有新数据交互,对于服务端程序来说也是重点关注的事件。

图片

1.2 什么是IO复用

设想假如有几万个IO事件,那么应用程序该如何管理呢?这就要提到IO复用了。

IO复用从本质上来说就是应用程序借助于IO复用函数向内核注册很多类型的IO事件,当这些注册的IO事件发生变化时内核就通过IO复用函数来通知应用程序。

图片

从图中可以看到,IO复用中复用的就是一个负责监听管理这些IO事件的线程。

之所以可以实现一个线程管理成百上千个IO事件,是因为大部分时间里某个时刻只有少量IO事件被触发。

图片

大概就像这样:草原上的一只大狗可以看管几十只绵羊,因为大部分时候只有个别绵羊不守规矩乱跑,其他的都是乖乖吃草。

2. 网络框架设计要素

要理解网络框架有哪些,必须要清楚网络框架完成了哪些事情。

图片

大致描述下这个请求处理的流程:

  • 远端的机器A发送了一个HTTP请求到服务器B,此时服务器B网卡接收到数据并产生一个IO可读事件;

  • 我们以同步IO为例,此时内核将该可读事件通知到应用程序的Listen线程;

  • Listen线程将任务甩给Handler线程,由Handler将数据从内核读缓冲区拷贝到用户空间读缓冲区;

  • 请求数据包在应用程序内部进行计算和处理并封装响应包;

  • Handler线程等待可写事件的到来;

  • 当这个连接可写时将数据从用户态写缓冲区拷贝到内核缓冲区,并通过网卡发送出去;

备注:上述例子是以同步IO为例,并且将线程中的角色分为Listen线程、Handler线程、Worker线程,分别完成不同的工作,后续会详细展开。

所以我们可以知道,要完成一个数据交互,涉及了几大块内容:

  • IO事件监听

  • 数据拷贝

  • 数据处理和计算

大白认为,这三大块内容,不论什么形式的框架都绕不开,也是理解网络架构的关键所在。

图片

3. 高性能网络框架实践

3.1 基于线程模型

在早期并发数不多的场景中,有一种One Request One Thread的架构模式。

该模式下每次接收一个新请求就创建一个处理线程,线程虽然消耗资源并不多,但是成千上万请求打过来,性能也是扛不住的。

图片

这是一种比较原始的架构,思路也非常清晰,创建多个线程来提供处理能力,但在高并发生产环境中几乎没有应用,本文不再展开。

3.2 基于事件驱动模型

当前流行的是基于事件驱动的IO复用模型,相比多线程模型优势很明显。

图片

在此我们先理解一下什么是事件驱动Event-Drive-Model。

事件驱动编程是一种编程范式,程序的执行流由外部事件来决定,它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。

通俗来说就是:有一个循环装置在一直等待各种事件的到来,并将到达的事件放到队列中,再由一个分拣装置来调用对应的处理装置来响应。

图片

3.3 Reactor反应堆模式

第一次听到这个模式的时候很困惑,究竟反应堆是个啥?

研究了一下发现,反应堆是个核物理的概念,大致是这个样子的:

核反应堆是核电站的心脏 ,它的工作原理是这样的:原子由原子核与核外电子组成,原子核由质子与中子组成。

当铀235的原子核受到外来中子轰击时,一个原子核会吸收一个中子分裂成两个质量较小的原子核,同时放出2-3个中子。

这裂变产生的中子又去轰击另外的铀235原子核,引起新的裂变,如此持续进行就是裂变的链式反应。

图片

结合这种核裂变的图,好像是一个请求打过来,服务器内部瞬间延伸出很多分支来完成响应,一变二,二变四,甚至更多,确实有种反应堆的感觉。

接下来我们看看究竟反应堆模式是如何构建高性能网络框架的。

4.反应堆模式详解

反应堆模式是一种思想,形式却有很多种。

4.1 反应堆模式的本质是什么

从本质上理解,无论什么网络框架都要完成两部分操作:

  • IO操作:数据包的读取和写入

  • CPU操作:数据请求的处理和封装

所以上述这些问题由谁来做以及多少线程来做,就衍生出了很多形式,所以不要被表面现象迷惑,出现必有原因,追溯之后我们才能真正掌握它。

图片

反应堆模式根据处理IO环节和处理数据环节的数量差异分为如下几种:

  • 单Reactor线程

  • 单Reactor线程和线程池

  • 多Reactor线程和线程池

图片

我们来看看这三种常见模式的特点、原理、优缺点、应用场景等。

4.2 单Reactor线程模式

这种模式最为简洁,一个线程完成了连接的监听、接收新连接、处理连接、读取数据、写入数据全套工作。

由于只使用了一个线程,对于多核利用率偏低,但是编程简单。

是不是觉得这个种单线程的模式没有市场?那可未必,不信你看Redis。

图片

在这种模式种IO操作和CPU操作是没有分开的,都是由1个线程来完成的,显然如果在Handler处理某个请求超时了将会阻塞客户端的正常连接。

在Redis中由于都是内存操作,速度很快,这种瓶颈虽然存在但是不够明显。

4.3 单Reactor线程和线程池模式

为了解决IO操作和CPU操作的不匹配,也就是IO操作和CPU操作是在一个线程内部串行执行的,这样就拉低了CPU操作效率。

图片

一种解决方法就是将IO操作和CPU操作分别由单独的线程来完成,各玩各的互不影响。

单Reactor线程完成IO操作、复用工作线程池来完成CPU操作就是一种解决思路。

图片

在这种模式种由Reactor线程完成连接的管理和数据读取&写回,完全掌管IO操作。

工作线程池处理来自上游分发的任务,对其中的数据进行解码、计算、编码再返回给Reactor线程和客户端完成交互。

这种模式有效利用了多核,但是单Reactor线程来完成IO操作在高并发场景中仍然会出现瓶颈。

换句话说,连接实在太多了,一个Reactor线程忙不过来建立新连接和响应旧连接这些事情,因此Reactor线程也需要几个帮手。

图片

4.4 多Reactor线程和线程池模式

水平扩展往往是提供性能的有效方法。

图片

我们将Reactor线程进行扩展,一个Reactor线程负责处理新连接,多个Reactor线程负责处理连接成功的IO数据读写。

也就是进一步将监听&创建连接 和 处理连接 分别由两个及以上的线程来完成,进一步提高了IO操作部分的效率。

图片

这种模式算是比较高配的版本了,在实际生产环境也有使用。

4.5 拓展:同步IO和异步IO

我们可以轻易区分什么是阻塞IO和非阻塞IO,那么什么是同步IO和异步IO呢?

前面提到Reactor模式其中非常重要的一环就是调用read/write函数来完成数据拷贝,这部分是应用程序自己完成的,内核只负责通知监控的事件到来了,所以本质上Reactor模式属于非阻塞同步IO。

还有一种Preactor模式,借助于系统本身的异步IO特性,由操作系统进行数据拷贝,在完成之后来通知应用程序来取就可以,效率更高一些,但是底层需要借助于内核的异步IO机制来实现。

图片

底层的异步IO机制可能借助于DMA和Zero-Copy技术来实现,理论上性能更高。

当前Windows系统通过IOCP实现了真正的异步I/O,而在Linux 系统的异步I/O还不完善,比如Linux中的boost.asio模块就是异步IO的支持,但是目前Linux系统还是以基于Reactor模式的非阻塞同步IO为主。

5. 小结

本文从IO事件和IO复用出发,阐述了网络架构最底层的组成。

继续展开了基于线程模型和基于事件驱动模型的网络框架特点及其设计要素。

之后重点描述了反应堆模式的核心本质,以及生产环境中的多种形式。

最后简单介绍了同步IO和异步IO的区别,以及Preactor模式的优势。

希望读者朋友可以摒弃专业术语和表述,抓住问题的本质和重点,找到一个适合自己思维方法去理解和掌握高性能网络架构的设计之道。

或许,高性能网络框架只是一个纸老虎。

深入解析Linux网络架构:XDP、Netfilter与tc/qdisc的协同工作流 本文深入解析Linux网络架构中XDP、Netfilter与tc/qdisc三大核心组件的协同工作流。通过实际案例和性能对比,详细介绍了XDP在网卡层的高效数据处理、Netfilter的五链三表机制以及tc/qdisc的流量控制策略,帮助开发者优化网络性能,提升服务器吞吐量。 阅读详情

相关推荐

Docker网络架构解析:核心模式与生产实践

容器网络是云原生技术的核心基础设施,其本质是通过Linux网络命名空间实现隔离,配合虚拟网络设备(veth pair)和iptables规则构建的虚拟化网络层。Docker作为主流容器运行时,提供了bridge、host、none和overlay四种网络模式,分别适用于开发测试、高性能计算、安全隔离和集群部署等场景。在微服务架构下,容器网络需要解决东西向流量管理、服务发现和跨主机通信等挑战。通过理解Docker网络驱动原理和Linux内核机制,可以优化生产环境中的网络性能,实现多网卡绑定、负载均衡等高级功能

weixin_31309419的博客 306

IO复用(Reactor模式和Preactor模式)——用epoll来提高服务器并发能力

文章来源:http://www.cnblogs.com/binchen-china/p/5487795.html 上篇线程/进程并发服务器中提到,提高服务器性能在IO层需要关注两个地方,一个是文件描述符处理,一个是线程调度。 IO复用是什么?IO即Input/Output,在网络编程中,文件描述符就是一种IO操作。 为什么要IO复用? 1.网络编程中非常多函数是阻塞的,如c

$firecat利白的代码足迹$ 6520

VSCode终端打不开?3分钟搞定Windows下Terminal配置(附最新JSON设置方法)

本文针对Windows系统下VSCode终端无法启动的常见问题,提供了详细的诊断与解决方案。核心在于更新已弃用的旧配置,采用最新的JSON设置方法,通过定义`terminal.integrated.profiles.windows`和指定`terminal.integrated.defaultProfile.windows`,快速修复并优化终端配置,实现三分钟内恢复正常使用。

flower的专栏 741

从io模型到ppc,tpc,reactor,preactor

nio sendfile 零拷贝 1.网络io模型 这是我们常见的一张图. 1.传统的bio,就是同步阻塞的.当调用socket.read的时候.会阻塞. 知道系统可读/写,当真正去执行读的时候(内核-->用户),还是阻塞. 2.非阻塞io,当调用read时,如果不可读,那么直接返回一个标识,告诉你等会再来问.现在不可读嘞.那么好的,你就过一会问一下.当可读时,去调用recvFrom系统调用.不过此时还是阻塞....

小小李的博客 1316

微信取证不求人:最新免费DAT解码工具使用指南(含闪退解决方案)

本文提供了一份详细的微信DAT文件免费解码工具使用指南。针对用户常见的图片无法查看问题,手把手教学如何安全获取并操作开源图形化工具,将加密的DAT文件一键还原为JPG/PNG图片。文章重点剖析了DAT文件的加密原理,并给出了详细的步骤解决工具运行中最常见的“程序闪退”等疑难杂症,帮助普通用户轻松完成微信取证。

m0n1o2p的博客 479

基于rms包的限制性立方样条回归(RCS)R代码实现

RCS

2301_79584199的博客 2万+

linux asio网络编程理论及实现

在本篇博文中,主要梳理了asio多线程网络编程其中一种方案的实现及理论。在写的时候发现了一点问题,就是说server管理了session节点,但是我看析构的时候,并没有将所有节点删除。而是在main函数捕获信号,然后通过io_context池子来stop了所有的io_context,让io_context.run()立即返回,并且回收了所有的线程.但是io_context.run()返回了也就是内部的epoll不在epolll_wait了是否就可可以使管理的session是否不用移除,回头再看一下代码吧。

m0_64060063的博客 1513

图像拼接(Image Stitching)

图像拼接(Image Stitching):是一项计算机视觉技术,它将多张重叠的图像合并为一张更大、无缝的全景图或广角视图。该技术广泛应用于全景摄影、地图制作、医学影像处理、计算机视觉及增强现实(AR)等领域。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2505

高并发系统设计

作者:周顺利 注:本文大多数观点和代码都是从网上或者开源代码中抄来的,为了疏理和组织这片文章,作者也费了不少心血,为了表示对我劳动的尊重,请转载时注明作者和出处。 一、     引子 最近失业在家,闲来无事。通过网上查找资料和查看开源代码,研究了一下互联网高并发系统的一些设计。这里主要从服务器内部设计和整个系统设计两个方面讨论,更多的是从互联网大型网站设计方面考虑,高性能计算之类系统没有

厚积薄发的博客 2074

如何在 SAPGUI 里显示上传到 ABAP 服务器的 PDF 文件

在 SAPGUI 里显示 PDF 文件是实际项目中一个很有用的需求。因为在 SAP 实际业务场景中,有大量的流程会生成 PDF 格式的数据。把这种类型的数据输出显示在 SAPGUI 里,方便最终用户查看。本教程后续步骤,还会向大家介绍如何使用 ABAP 代码生成 PDF 格式的数据。本步骤只是简单的将本地 PDF 文件,上传到 ABAP 系统并显示在 SAPGUI 里。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2687

【ComfyUI】Z-Image 基础文生图 + 单LoRA

本文介绍了一个基于ComfyUI的Z-Image Turbo基础文生图工作流,采用轻量化UNet模型配合Qwen Image文本理解模型与LoRA风格注入,实现从文本到图像的快速生成。工作流结构清晰,包含模型加载、文本编码、采样解码等标准节点,在人物生成、构图稳定性和出图速度方面表现均衡。通过调整Prompt可控制生成内容,适合日常创作、教学演示及扩展进阶应用。

Mr数据杨 925

Reactor,Proactor,Actor

Actor proactor reactor

jjyy2333的博客 595

打开.nc降水气象数据制作年降水量地图

图层的单位为度,在反距离插值中也是以度为单位,比较麻烦,还是想用以m为单位的投影,这里是个bug,后续调整一下。该彩色部分是以2021年1月、2月、3月的降水数据分别作为RGB得到。因为该栅格的分辨率还是太大了,一个栅格就能覆盖一个县,若想要进行降尺度,可以做插值处理。下载的数据集为2021-2022年,因此有12+12=24个月,24个波段。想要得到廊坊市周围的数据,需要裁剪范围,在降水数据图层上导出数据。打开数据管理工具-投影和变换-定义投影。在降水数据图层上右击属性,添加投影。得到了降尺度的插值图。

所有专家都曾始于新手 4520

深入理解Linux高性能网络架构的那些事!

1. 落寞的小黑 上周北京很冷,周五晚上大白下班奔地铁站,收到了好基友小黑的微信: 于是大白掉头扫了个单车奔五道口了,小黑靠谱地选了个不错的位置。 小黑: 你今天下班挺早呀! 大白: 就咱这觉悟,心里有工作,哪里都是办公桌,不要拘泥于形式嘛。 明显能感觉得到小黑哥最近好像比较累,之前眼里bulingbuling闪的光是看不到了。 大白: 下午去面的哪家?啥岗位?咋样? 小黑: 是一家做自动驾驶的创业公司,网站是看团队介绍还不错,就去看看了,这次没咋准备,很多问题其实都熟悉,但

wubaohu1314的博客 296

PCL 提取两片点云的非重叠部分【2025最新版】

PCL 提取两片点云的非重叠部分。博客长期更新,本文最近一次更新时间为:2025年9月1日。

点云侠的博客 36万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

图解|深入理解Linux高性能网络架构的那些事

1. 落寞的小黑上周北京很冷,周五晚上大白下班奔地铁站,收到了好基友小黑的微信:于是大白掉头扫了个单车奔五道口了,小黑靠谱地选了个不错的位置。小黑: 你今天下班挺早呀!大白: 就咱这觉悟...

架构师小秘圈 709

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

boost asio 性能_图解|深入理解Linux高性能网络架构的那些事

1. 落寞的小黑上周北京很冷,周五晚上大白下班奔地铁站,收到了好基友小黑的微信:于是大白掉头扫了个单车奔五道口了,小黑靠谱地选了个不错的位置。小黑: 你今天下班挺早呀!大白: 就咱这觉悟,心里有工作,哪里都是办公桌,不要拘泥于形式嘛。明显能感觉得到小黑哥最近好像比较累,之前眼里bulingbuling闪的光是看不到了。大白: 下午去面的哪家?啥岗位?咋样?小黑: 是一家做自动驾驶的创业公司,网站是...

weixin_29767773的博客 594

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

嵌入式网络那些事_图解|深入理解Linux高性能网络架构的那些事

1. 落寞的小黑上周北京很冷,周五晚上大白下班奔地铁站,收到了好基友小黑的微信:于是大白掉头扫了个单车奔五道口了,小黑靠谱地选了个不错的位置。小黑: 你今天下班挺早呀!大白: 就咱这觉悟,心里有工作,哪里都是办公桌,不要拘泥于形式嘛。明显能感觉得到小黑哥最近好像比较累,之前眼里bulingbuling闪的光是看不到了。大白: 下午去面的哪家?啥岗位?咋样?小黑: 是一家做自动驾驶的创业公...

weixin_39966602的博客 247

图解|深入理解Linux高性能网络架构的那些事(并发消息处理模型)

1. 落寞的小黑 上周北京很冷,周五晚上大白下班奔地铁站,收到了好基友小黑的微信: 于是大白掉头扫了个单车奔五道口了,小黑靠谱地选了个不错的位置。 小黑: 你今天下班挺早呀! 大白: 就咱这觉悟,心里有工作,哪里都是办公桌,不要拘泥于形式嘛。 明显能感觉得到小黑哥最近好像比较累,之前眼里bulingbuling闪的光是看不到了。 大白: 下午去面的哪家?啥岗位?咋样? 小黑: 是一家做自动驾驶的创业公司,网站是看团队介绍还不错,就去看看了,这次没咋准备,很多问题其实都熟.

WXXGoodJob的博客 1111

boost asio 性能_图说 Linux 高性能网络架构的那些事

1. 落寞的小黑上周北京很冷,周五晚上大白下班奔地铁站,收到了好基友小黑的微信:于是大白掉头扫了个单车奔五道口了,小黑靠谱地选了个不错的位置。小黑: 你今天下班挺早呀!大白: 就咱这觉悟,心里有工作,哪里都是办公桌,不要拘泥于形式嘛。明显能感觉得到小黑哥最近好像比较累,之前眼里bulingbuling闪的光是看不到了。大白: 下午去面的哪家?啥岗位?咋样?小黑: 是一家做自动驾驶的创业公...

weixin_39842744的博客 156

解析Linux网络模型与Redis的高性能网络架构

基于Linux网络模型,解析Redis的高性能实现

BUPTZhanggg的博客 708

【免费下载】 探索Linux内核网络世界的神秘面纱 ——《深入理解Linux网络技术内幕(中文版)》

探索Linux内核网络世界的神秘面纱 ——《深入理解Linux网络技术内幕(中文版)》 【下载地址】深入理解Linux网络技术内幕中文版资源下载 本仓库提供了一份名为《深入理解Linux网络技术内幕(中文版)》的资源文件下载。该文件详细介绍了Linux网络技术的内部工作原理,并附带了完整的目录标签,方便读者快速定位和查阅...

gitblog_09737的博客 640

DockerLabs项目:深入理解Linux网络命名空间

在现代容器化技术中,网络隔离是确保应用安全性和稳定性的关键技术。你是否曾经遇到过这样的场景: - 多个容器需要使用相同的端口但互不干扰? - 需要为不同应用创建独立的网络环境? - 希望模拟复杂的网络拓扑进行测试? 这些问题的核心解决方案就是**Linux网络命名空间(Network Namespace)**——Docker等容器技术的网络隔离基石。 通过本文,你将获得: - ???? 网络命名...

gitblog_00631的博客 383

InfiniBand协议深度解析:RDMA的原生网络架构

本文深度解析InfiniBand(IB)协议栈,揭秘其作为RDMA原生网络架构的核心机制。从六层网络模型到三段式报文结构,详细剖析链路层的基于信用流控与传输层的QP机制,并探讨子网管理器(SM)在全局路由中的“大脑”作用。结合实战命令,带你全面掌握IB网络配置与调优,助力构建高性能算力集群。

专注分享DPU、RDMA智能网卡/SSD(固态硬盘)产品测试与优化 485
上一篇: TCP/IP拥塞控制总结...
下一篇: 深入理解Linux socket
废言Pro
博客等级 码龄16年 1093粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值