《理解了实现再谈网络性能》读书笔记

news2024/11/27 1:46:10

文章目录

  • 内核是如何接收网络包的
    • 1.1 Linux⽹络收包总览
    • 1.2 linux 启动
      • 创建ksoftirqd进程
      • 网络子系统初始化
      • 协议栈注册
      • 网卡驱动初始化
      • 启动网卡
    • 1.3 迎接数据的到来
      • 硬中断处理
      • ksoftirqd 内核线程处理软中断
      • 网络协议栈处理
      • IP协议层处理
  • 完整流程

内核是如何接收网络包的

1.1 Linux⽹络收包总览

内核和⽹络设备驱动是通过中断的⽅式来处理的。当设备上有数据到达的时候,会给 CPU 的相关引脚上触发⼀个电压变化,以通知 CPU 来处理数据。对于⽹络模块来说,由于处理过程⽐较复杂和耗时,如果在中断函数中完成所有的处理,将会导致中断处理函数(优先级过⾼)将过度占据 CPU ,将导致 CPU ⽆法响应其它设备,例如⿏标和键盘的消息。因此Linux 中断处理函数是分上半部和下半部的

上半部是只进⾏最简单的⼯作,快速处理然后释放CPU ,接着 CPU 就可以允许其它中断进来。剩下将绝⼤部分的⼯作都放到下半部中,可以慢慢从容处理。2.4 以后的内核版本采⽤的下半部实现⽅式是软中断由 ksoftirqd 内核线程全权处理。和硬中断不同的是,硬中断是通过给 CPU 物理引脚施加电压变化,⽽软中断是通过给内存中的⼀个变量的⼆进制值以通知软中断处理程序

下面是内核收包路径示意图
在这里插入图片描述

当⽹卡上收到数据以后,Linux 中第⼀个⼯作的模块是⽹络驱动。⽹络驱动会以 DMA(Direct Memory Access) 的⽅式把⽹卡上收到的帧写到内存⾥。再向 CPU 发起⼀个中断,以通知 CPU 有数据到达。第⼆,当 CPU 收到中断请求后,会去调⽤⽹络驱动注册的中断处理函数。⽹卡的中断处理函数并不做过多⼯作,发出软中断请求,然后尽快释放 CPU。ksoftirqd 检测到有软中断请求到达,调⽤ poll 开始轮询收包,收到后交由各级协议栈处理。对于 udp 包来说,会被放到⽤户socket 的接收队列中

1.2 linux 启动

创建ksoftirqd进程

Linux 的软中断都是在专⻔的内核线程(ksoftirqd)中进⾏的,因此我们⾮常有必要看⼀下这些进程是怎么初始化的,这样我们才能在后⾯更准确地了解收包过程。该进程数量不是 1个,⽽是 N 个,其中 N 等于你的机器的核数

尝试执行一下指令,可以加深理解

ps -ef | grep ksoftirqd

网络子系统初始化

协议栈注册

网卡驱动初始化

每⼀个驱动程序(不仅仅只是⽹卡驱动)会使⽤ module_init 向内核注册⼀个初始化函数,当驱动被加载时,内核会调⽤这个函数,所以 MODULE_INIT() 包起来的函数可以认为是 网卡驱动的入口函数

启动网卡

当上⾯的初始化都完成以后,就可以启动⽹卡了。回忆前⾯⽹卡驱动初始化时,我们提到了驱动向内核注册了 structure net_device_ops 变量,它包含着⽹卡启⽤、发包、设置mac 地址等回调函数(函数指针)

当启⽤⼀个⽹卡时(例如,通过 ifconfig eth0 up),
net_device_ops 中的 open ⽅法会被调⽤。它通常会做以下事情

在这里插入图片描述

  • 分配RX、TX队列内存
分配RingBuffer,并建⽴内存和Rx队列的映射关系
  • 注册中断函数

对于多队列的网卡,对每一个队列都注册中断
msix ⽅式下,每个RX 队列有独⽴的 MSI-X 中断,从⽹卡硬件中断的层⾯就可以设置让收到的包被不同的 CPU 处理(可以通过 irqbalance ,或者修改 /proc/irq/IRQ_NUMBER/smp_affinity 能够修改和CPU的绑定⾏为

  • 打开硬中断,等待包进来

1.3 迎接数据的到来

硬中断处理

⾸先当数据帧从⽹线到达⽹卡上的时候,第⼀站是⽹卡的接收队列
⽹卡在分配给⾃⼰的 RingBuffer 中寻找可⽤的内存位置,找到后 DMA 引擎会把数据 DMA 到⽹卡之前关联的内存⾥,这个时候 CPU 都是⽆感的。当 DMA 操作完成以后,⽹卡会向 CPU 发起⼀个硬中断,通知 CPU 有数据到达。

在这里插入图片描述

注意:当RingBuffer满的时候,新来的数据包将给丢弃。ifconfig查看⽹卡的时候,可以⾥⾯有个overruns,表示因为环形队列满被丢弃的包。如果发现有丢包,可能需要通过ethtool命令来加⼤环形队列的⻓度

ksoftirqd 内核线程处理软中断

在这里插入图片描述

igb_fetch_rx_buffer 和 igb_is_non_eop 的作⽤就是把数据帧从 RingBuffer 上取下来, 为什么需要两个函数呢?
因为有可能帧要占多个 RingBuffer,所以是在⼀个循环中获取的,直到帧尾部。获取下来的⼀个数据帧⽤⼀个 sk_buff 来表示。收取完数据以后,对其进⾏⼀些校验,然后开始设置 sbk 变量的 timestamp, VLAN id, protocol 等字段。接下来进⼊到 napi_gro_receive 中

dev_gro_receive 这个函数代表的是⽹卡 GRO 特性,可以简单理解成把相关的⼩包合并成⼀个⼤包就⾏,⽬的是减少传送给⽹络栈的包数,这有助于减少 CPU 的使⽤量

在 netif_receive_skb 中, 数据包将被送到协议栈中

网络协议栈处理

netif_receive_skb 函数会根据包的协议,假如是 udp 包,会将包依次送到 ip_rcv(), udp_rcv() 协议处理函数中进⾏处理

IP协议层处理


完整流程

准备工作

  1. 创建ksoftirqd线程,为它设置好它⾃⼰的线程函数,后⾯就指望着它来处理软中断呢
  2. 协议栈注册,linux要实现许多协议,⽐如arp,icmp,ip,udp,tcp,每⼀个协议都会将⾃⼰的处理函数注册⼀下,⽅便包来了迅速找到对应的处理函数
  3. ⽹卡驱动初始化,每个驱动都有⼀个初始化函数,内核会让驱动也初始化⼀下。在这个初始化过程中,把⾃⼰的DMA准备好,把NAPI的poll函数地址告诉内核
  4. 启动⽹卡,分配RX,TX队列,注册中断对应的处理函数

数据到来后

  1. ⽹卡将数据帧 DMA 到内存的 RingBuffer 中,然后向 CPU 发起中断通知
  2. CPU 响应中断请求,调⽤⽹卡启动时注册的中断处理函数
  3. 中断处理函数⼏乎没⼲啥,就发起了软中断请求
  4. 内核线程 ksoftirqd 线程发现有软中断请求到来,先关闭硬中断
  5. ksoftirqd 线程开始调⽤驱动的 poll 函数收包
  6. poll 函数将收到的包送到协议栈注册的 ip_rcv 函数中
  7. ip_rcv 函数再将包送到 udp_rcv 函数中(对于 tcp 包就送到 tcp_rcv )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用阿里云服务器建站WordPress博客网站上线全流程

使用阿里云服务器快速搭建网站教程,先为云服务器安装宝塔面板,然后在宝塔面板上新建站点,阿里云服务器网以搭建WordPress网站博客为例,来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流程: …

常见概率分布及图像

概率分布 文章目录 概率分布[toc]1 离散概率分布1.1 伯努利分布1.2 二项分布1.3 泊松分布 2 连续概率分布2.1 均匀分布2.2 指数分布2.3 正态分布2.4 卡方分布2.5 Student分布3.5 F分布 1 离散概率分布 1.1 伯努利分布 随机变量 X X X仅取两个值, X 0 , 1 X0,1 X0…

【2023 年第三届长三角高校数学建模竞赛】C 题 考研难度知多少 考研情况相关数据下载

【2023 年第三届长三角高校数学建模竞赛】C 题 考研难度知多少 1 题目 C 题 考研难度知多少 据相关媒体报道,2023 年考研可以称得上是“最难”的一年,全国研究生报考人数突破新高达到 474 万人、部分考研学生感染新冠带病赴考、保研名额增多 挤压考研…

依次判断数组a1中的每个元素是否小于数组a2中对应位置的每个元素numpy.less()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 依次判断数组a1中的每个元素 是否小于数组a2中对应位置的每个元素 numpy.less() 选择题 以下程序的运行结果是? import numpy as np a1np.array([1,2,3]) a2np.array([3,2,1]) print("【…

消息推送平台的实时数仓?flink消费kafka消息入到hive

上一次比较大的更新是做了austin的预览地址,把企业微信的应用和机器人消息各种的消息类型和功能给完善了。上一篇文章也提到了,austin常规的功能已经更新得差不多了,剩下的就是各种细节的完善。 不知道大家还记不记得我当时规划austin时&…

免费使用的在线Axure原型工具找到了!

在线 Axure 工具替代即时设计,不需要安装插件,直接在浏览器中打开 Axure 原型文件,操作更加便捷。除了支持 Axure,即时设计还兼容 Figma、Sketch、AdobeXD 等更多文件类型,可用于线框设计、UI/UX 设计、原型交互、免切…

linux内核:笔记3-网络数据包收发流程

1.网络分层中,内核协议栈负责实现网络层和传输层 2.内核对用户进程提供socket接口用以调用 3.Linux内核包含链路层驱动用来驱动网络设备 4.内核网络层用来实现IP、ICMP以及IGMP 5.内核层传输层用来实现TCP和udp协议 6.内核源码中网络设备驱动对应的代码位于dri…

KDZD-100A触摸屏回路电阻测试仪

一、简介 测试仪是根据电力执行标准DL/T845.4-2004,采用高频开关电源技术和数字电路技术相结合设计而成。它适用于开关控制设备回路电阻的测量。其测试电流采用国家标准推荐的直流100A。可在电流100A的情况下直接测得回路电阻,并用数字显示出来。测量准确…

劝你们不要去外包,两年外包生涯做完,感觉自己废了一半....

先说一下自己的情况。大专生,17年通过校招进入湖南某软件公司,干了接近5年的点点点,今年年上旬,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了五年的功能测试…

​TPAMI 2023 | 无监督域适应语义分割新视角:统一图像和特征层次的对齐

©PaperWeekly 原创 作者 | 陈超奇 单位 | 香港大学 研究方向 | 迁移学习 论文标题: I2F: A Unified Image-to-Feature Approach for Domain Adaptive Semantic Segmentation 论文链接: https://arxiv.org/abs/2301.01149(预印版&#x…

了解微服务技术栈

在了解微服务技术栈之前,我们先通过图片去了解微服务技术的类别。 微服务技术体系 技术栈模块图 微服务技术对比 服务框架 用JAVA技术开发微服务,比较主流的选择有:Spring Cloud 和 Dubbo。 Spring Cloud是在Spring基础上构建的,…

机器学习之朴素贝叶斯二、情感分析实践

目录标题 一、什么是朴素贝叶斯?二、利用朴素贝叶斯进行情感分析1. 数据类别说明2. 什么是词袋模型3. 数据展示4. 利用词袋模型进行词表构建5. 到了这一步,我们的前期工作都已经准备好了,有了样本的向量化数据,开始进行 朴素贝叶斯…

2023年北京.NET线下技术沙龙来了!大咖分享,还有精品好礼等你

MASA技术团队来北京啦! 为了与北京的.NET开发者们更深入的交流学习,我们将在北京市举办一场.NET线下技术沙龙。同时也是希望通过举办这样的线下沙龙,让更多的.NET开发者了解我们,加入.NET开源技术生态,向更多的.NET开…

SpringCloud-服务间通信OpenFeignRibbon

服务间通信&OpenFeign&Ribbon 一、服务间通信1.创建两个服务并注册到服务中心1.1.服务添加相关依赖1.2.编写配置文件application.yml1.3.入口类加上注解启动Eureka Client 2.Product服务中提供调用方法3.User服务中使用RestTemplate调用 二、负载均衡及Ribbon组件1.负载…

《三》包管理工具

包管理工具 npm: npm:Node Package Manager,Node 包管理器,目前已经不仅仅作为 Node 的包管理工具,也作为前端的包管理工具来管理包。 npm 管理的包是存放在一个名为 registry 的仓库中的,发布一个包时是…

AI歌手——超简单一键运用ACE Studio来训练模拟真人唱歌

目录 1.安装ACE Studio 2.打开ACE Studio 3.导入midi或音频 4.调试音频 5.调整人物音色音高 6.调整歌词 7.自动添加呼吸​编辑 8.成品演示(周杰伦の稻香——鲤阮) 1.安装ACE Studio 安装地址 ACE Studio | Create Limitless Vocals with AI (t…

如何用AI画56个民族的女孩!

大家好,我是菜鸟哥! 目前在带领600多个小伙伴一起玩AI!Chatgpt现在是最火最出圈的产品,而一旦文字和图像,声音,视频结合可以演化出很多很多的需求。前面我们公众号已经分享了很多很多关于chatgpt的使用和技…

大势智慧软硬件技术答疑第二期

1. 编辑模型视图为什么是空的呢?工程这里也选了obj数据位置。 答:CtrlT选择下瓦块就可以,或者点这个图标。 2. 支持编辑DSM 生成正射吗? 答:重建大师,模方,和dasview均支持直接生产正射和DSM&a…

idea-properties文件编码为iso-8859-1修改为utf-8

一、现状 idea中properties文件编码为iso-8859-1并且为灰色不可修改 二、修改成utf-8 command,打开preferences 如下图操作即可

机器学习——logit正则化

机器学习——logit正则化 文章目录 机器学习——logit正则化[toc]1 logit模型正则化2 logit回归求解器2.1 ℓ 1 \ell_1 ℓ1​和 ℓ 2 \ell_2 ℓ2​正则化2.2 e l a s t i c − n e t elastic-net elastic−net正则化 1 logit模型正则化 logit模型能实现分类,识别…