返回顶部
首页 > 资讯 > 精选 >怎么用DPDK GRO和GSO来提高网络应用性能
  • 911
分享到

怎么用DPDK GRO和GSO来提高网络应用性能

2023-06-05 10:06:26 911人浏览 泡泡鱼
摘要

怎么用DPDK GRO和GSO来提高网络应用性能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  目前,有大量的网络应用在处理数据包的时候只需要处理数据包头,而不会操作数据负载

怎么用DPDK GRO和GSO来提高网络应用性能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

  目前,有大量的网络应用在处理数据包的时候只需要处理数据包头,而不会操作数据负载部分,例如防火墙、tcp/IP协议栈和软件交换机。对这类网络应用而言, 包头处理产生的开销(称为“per-packet overhead”)占了整体开销的大部分。因此,如何减少包头处理开销是优化这类应用性能的关键。

  减少包头处理开销最直接的方法:减少数据包数量

  如何减少包数量?

  ●增大Maximum Transmission Unit (MTU)。在数据量一定的情况下,使用大MTU的数据包可携带更多数据,从而减少了包的总量。但MTU值依赖于物理链路,我们无法保证数据包经过的所有链路均使用大MTU。

  ●利用网卡特性:Large Receive Offload (LRO),UDP Fragmentation Offload (UFO)和TCP Segmentation Offload (TSO)。如图1所示,LRO将从物理链路收到的TCP包(如1500B)合并为长度更长的TCP包(如64KB);UFO和TSO将上层应用发送的长数据负载的UDP和TCP包(如64KB)拆分成长度更短的数据包(如1500B),以满足物理链路的MTU限制。通过在网卡上进行包合并和拆分,在不需要任何CPU开销的情况下,上层应用就可以处理数量大大减少的大包。然而,LRO、TSO和UFO通常只能处理TCP和UDP包,而且并非所有的网卡都支持这些特性。

  ●软件包合并 (Generic Receive Offload,GRO)和包拆分 (Generic Segmentation Offload,GSO)。与前两种方法相比,GRO和GSO有两个优点:第一,不依赖于物理链路和网卡;第二,能够支持更多的协议类型,如VxLAN和GRE。

怎么用DPDK GRO和GSO来提高网络应用性能

  图1. LRO、UFO和TSO工作原理

  为了帮助基于DPDK的应用程序(如Open vSwitch)减少包头处理开销,DPDK分别于17.08和17.11支持了GRO和GSO。如图2所示, GRO和GSO是DPDK中的两个用户库,应用程序直接调用它们进行包合并和分片。

怎么用DPDK GRO和GSO来提高网络应用性能

  图2. DPDK GRO和DPDK GSO

  1、GRO库和GSO库结构

  图3描绘了GRO库和GSO库的结构。根据数据包类型,GRO库定义了不同的GRO类型。每一种GRO类型负责合并一种类型的数据包,如TCP/IPv4 GRO处理TCP/IPv4数据包。同样的,GSO库也定义了不同的GSO类型。GRO库和GSO库分别根据MBUF的packet_type域和ol_flags域将输入的数据包交给对应的GRO和GSO类型处理。

怎么用DPDK GRO和GSO来提高网络应用性能

  图3. GRO库和GSO库的框架

  2、如何使用GRO库和GSO库?

  使用GRO和GSO库十分简单。如图4所示,只需要调用一个函数便可以对包进行合并和分片。

怎么用DPDK GRO和GSO来提高网络应用性能

  图4. 代码示例

  为了支持不同的用户场景,GRO库提供了两组api:轻量模式API和重量模式API,如图5所示。轻量模式API应用于需要快速合并少量数据包的场景,而重量模式API则用于需要细粒度地控制合包并需要合并大量数据包的场景。

怎么用DPDK GRO和GSO来提高网络应用性能

  图5. 轻量模式API和重量模式API

  3、DPDK GRO的合包算法

  算法挑战

  ●在高速的网络环境下,高开销的合包算法很可能会导致网卡丢包。

  ●包乱序(“Packet Reordering”)增加了合包难度。例如linux GRO无法合并乱序的数据包。

  这就要求DPDK GRO的合包算法:

  足够轻量以适应高速的网络环境

  能够合并乱序包

  基于Key的合包算法

  为解决上述两点挑战,DPDK GRO采用基于Key的合包算法,其流程如图6所示。对新到的数据包,首先按照流(“flow”)对其进行分类,再在其所在的流中寻找相邻的数据包(“neighbor”)进行合并。若无法找到匹配的流,就插入一条新流并将数据包存储到新流中。若无法找到邻居,则将数据包存储到对应的流中。

  基于Key的合包算法有两个特点。首先,通过流分类来加速数据包的合并是十分轻量的一种做法;其次,保存无法合并的数据包(如乱序包)使得之后对其进行合并成为可能,故减轻了包乱序对合包带来的影响。

怎么用DPDK GRO和GSO来提高网络应用性能

  图6. 基于Key的合包算法流程

  4、DPDK GSO的分片策略

  分片流程

  如图7所示,将一个数据包分片有3个步骤。首先,将包的数据负载分成许多长度更小的部分;其次,为每一个数据负载部分添加包头(新形成的数据包称为GSO Segment);最后,为每个GSO segment更新包头(如TCP Sequence Number)。

怎么用DPDK GRO和GSO来提高网络应用性能

  图7. GSO分片流程

  GSO Segment的结构

  生成一个GSO Segment的最简单方法就是拷贝包头和数据负载部分。但频繁的数据拷贝会降低GSO性能,因此,DPDK GSO采用了一种基于零拷贝的数据结构——Two-part MBUF——来组织GSO Segment。如图8所示,一个Two-part MBUF由一个Direct MBUF和多个Indirect MBUF组成。Direct MBUF用来存储包头,Indirect MBUF则类似于指针,指向数据负载部分。利用Two-part MBUF,生成一个GSO Segment仅需拷贝长度较短的包头,而不需要拷贝较长的数据负载部分。

怎么用DPDK GRO和GSO来提高网络应用性能

  图8. Two-part MBUF的结构

  GRO库和GSO库的状态

  目前,GRO库还处于一个初期阶段,仅对使用最广泛的TCP/IPv4数据包提供了合包支持。GSO库则支持更丰富的包类型,包括TCP/IPv4、VxLAN和GRE。

看完上述内容,你们掌握怎么用DPDK GRO和GSO来提高网络应用性能的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 怎么用DPDK GRO和GSO来提高网络应用性能

本文链接: https://lsjlt.com/news/242375.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么用DPDK GRO和GSO来提高网络应用性能
    怎么用DPDK GRO和GSO来提高网络应用性能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  目前,有大量的网络应用在处理数据包的时候只需要处理数据包头,而不会操作数据负载...
    99+
    2023-06-05
  • 利用Golang开发高性能网络应用
    标题:利用Golang开发高性能网络应用 近年来,随着互联网的飞速发展,网络应用的需求也变得越来越复杂和庞大。而在这个背景下,利用高性能的编程语言来开发网络应用变得尤为重要。Golan...
    99+
    2024-03-05
    golang 高性能 网络应用 并发请求 golang开发 标准库
  • PHP和NumPy:如何使用响应函数来提高性能?
    PHP和NumPy是两个流行的编程语言,它们都有着非常不错的性能。但是在某些情况下,我们需要更高的性能,比如处理大量数据时。在这种情况下,我们可以使用响应函数来提高性能。 响应函数是一个函数,它接收一个或多个参数并返回一个值。在PHP中,我...
    99+
    2023-09-15
    numpy 响应 函数
  • Python HTTP请求与缓存:提高你网络应用的性能和效率
    HTTP请求、缓存、Python、网络应用性能、并发、稳定性 一、理解HTTP请求和缓存机制 HTTP请求: HTTP请求是客户端向服务器发送的数据请求。 HTTP缓存: HTTP缓存机制将经常访问的数据存储在客户端或代理服务器上。 当...
    99+
    2024-02-23
    Python HTTP请求缓存:提升性能与效率
  • 怎么使用Redis的管道来提高性能
    在Redis中使用管道可以显著提高性能,因为它允许客户端在一次网络往返中发送多个命令,而不是每个命令都需要单独的网络往返。这样可以减...
    99+
    2024-05-07
    Redis
  • Python HTTP请求优化指南:提高你的网络应用性能
    优化Python HTTP请求的性能对于提高网络应用的速度和响应能力至关重要。本指南将介绍一些优化Python HTTP请求的技巧和最佳实践,帮助你提高网络应用的性能。 1. 使用连接池 连接池是一种管理HTTP连接的机制,它可以减少创...
    99+
    2024-02-23
    Python HTTP请求 性能优化 网络应用
  • 图片该怎么优化来提高网站性能
    这篇文章主要介绍了图片该怎么优化来提高网站性能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。概述图像是web上提供的最基本的内容类型之一。他们说一张图片胜过千言万语。但是如果...
    99+
    2023-06-14
  • ASP网站如何利用并发来提高性能?
    随着互联网的不断发展,越来越多的企业和个人开始使用ASP网站来展示自己的业务和产品。然而,在用户量增加的情况下,ASP网站的性能往往会受到影响,导致网站响应缓慢、访问速度变慢等问题。而并发技术可以帮助ASP网站提高性能,使其更好地服务于用...
    99+
    2023-09-26
    并发 关键字 索引
  • 如何使用 PHP 缓存来提高网站性能?
    随着互联网的不断发展,网站性能越来越受到关注。其中,缓存技术是提高网站性能的重要手段之一。在 PHP 中,我们可以使用缓存来减少数据库查询和文件读写操作,从而提高网站的响应速度和并发性能。本文将介绍如何使用 PHP 缓存来提高网站性能,并且...
    99+
    2023-10-04
    缓存 npm git
  • 使用PHP-FPM的技巧来提高网站性能
    随着Web应用程序的复杂性和用户量的增加,优化网站性能变得越来越重要。PHP-FPM(FastCGI Process Manager)是一个用于管理PHP进程的工具,它可以帮助我们有效地提升网站的性能和吞吐量。在本文中,我们将介绍一些使用P...
    99+
    2023-10-21
    技巧 php-fpm 网站性能
  • Python 构建的高性能网络应用实战
    使用 asyncio 构建异步服务器 asyncio 是 Python 3.4 中引入的异步 I/O 库,它允许您编写高性能的网络应用,而无需使用线程或多进程。asyncio 的基本思想是使用事件循环来处理 I/O 请求,事件循环是一种...
    99+
    2024-02-13
    Python 异步编程 asyncio uWSGI Nginx。
  • Laravel 和 Bash:如何通过它们来提高 Web 应用的性能?
    随着 Web 应用的不断发展,对性能的要求也越来越高。为了提高 Web 应用的性能,我们可以使用 Laravel 和 Bash 这两个工具。Laravel 是一个流行的 PHP Web 应用框架,而 Bash 是一个 Unix shell...
    99+
    2023-06-14
    numpy laravel bash
  • 利用Golang构建高性能网络应用的技巧
    利用Golang构建高性能网络应用的技巧 随着互联网的发展,网络应用的需求也越来越大。如何构建高性能的网络应用成为许多开发者关注的焦点。而Golang作为一种高效的编程语言,其并发性能...
    99+
    2024-02-24
    golang 高性能 网络应用 网络编程 标准库
  • 如何使用 ASP IDE 缓存来提高网站性能?
    ASP IDE 缓存是一种强大的工具,可以帮助我们提高网站性能。在这篇文章中,我们将讨论如何使用 ASP IDE 缓存来优化网站性能。 什么是 ASP IDE 缓存? ASP IDE 缓存是一种用于存储和管理 ASP 网站数据的技术。它可以...
    99+
    2023-06-09
    ide 响应 缓存
  • 如何使用ASP响应索引框架来提高你的网站性能?
    ASP响应索引框架是一种用于提高网站性能的技术,它可以极大地减少页面加载时间,提高用户体验。在本文中,我们将介绍如何使用ASP响应索引框架来提高你的网站性能。 ASP响应索引框架的原理是将网站中的静态资源(例如图片、CSS、JavaScri...
    99+
    2023-11-08
    响应 索引 框架
  • 如何使用 PHP 和 Django 的加载程序来提高网站性能?
    在今天的互联网时代,网站的性能是非常重要的。如果您的网站速度慢,那么您的用户将不会在您的网站上停留太久,这会影响您的网站流量和销售。因此,提高网站性能是每个网站开发人员需要关注的问题。在本文中,我们将介绍如何使用 PHP 和 Django ...
    99+
    2023-08-28
    npm django load
  • PHP和Bash:如何使用日志记录来提高应用程序的性能?
    在开发和维护应用程序时,日志记录是一个非常重要的方面。它可以帮助我们了解应用程序的行为、问题和性能瓶颈。在本文中,我们将介绍如何使用PHP和Bash来记录应用程序的日志,以提高应用程序的性能。 PHP中的日志记录 在PHP中,我们可以使用...
    99+
    2023-09-01
    bash 日志 http
  • PHP、JavaScript 和 Apache:如何使用对象来提高 Web 应用程序的性能?
    在当今的 Web 开发中,性能是至关重要的。为了提高 Web 应用程序的性能,我们需要使用一些技术和工具。其中,对象是一个非常有效的技术,可以帮助我们提高 Web 应用程序的性能。在本文中,我们将介绍如何使用对象来提高 Web 应用程序的...
    99+
    2023-08-19
    javascript 对象 apache
  • 基于HTTP的Web应用开发:如何使用PHP和NPM来提高性能?
    在当今互联网时代,Web应用的开发已经成为了一个极具挑战性和创造性的行业。在这个领域中,性能一直是一个非常重要的因素,因为用户期望能够快速地访问和使用Web应用程序。因此,开发人员需要采取一些措施来优化Web应用程序的性能。在本文中,我们...
    99+
    2023-08-07
    索引 http npm
  • ASP和JavaScript:如何利用数组和函数来提高你的应用程序性能?
    在现代软件开发中,性能是一个非常重要的问题。好的性能可以让你的应用程序更加快速和高效,而不好的性能则可能导致用户体验不佳,甚至无法使用。因此,开发人员需要不断寻找新的方法来提高应用程序的性能。在本文中,我们将介绍如何使用数组和函数来提高A...
    99+
    2023-11-13
    javascript 函数 数组
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作