新一代网络框架UringNet,基于最新的异步I/O

介绍

在这里插入图片描述

在去年的一篇文章中,笔者曾经提到了最新一代的网络I/O框架UringNet。具体内容可以参考Rings’ Power,性能“世界第一”的Web I/O框架。这是基于最新Linux内核的异步I/O组件io_uring开发的网络框架。由于采用了最新的异步框架,因此在同等硬件配置条件下,UringNet比目前性能最好的基于select/epoll的框架的网络I/O的峰值数据还要高10%以上。目前,已经将该框架开源https://github.com/y001j/UringNet,有兴趣的读者可以进行尝试,如果有任何问题也可以联系作者进行讨论。

io_uring是一个全新设计的Linux异步I/O框架,通过合理设计并对参数进行合理调整,能够达到非常高的性能,尤其在不需要缓存的硬件和磁盘I/O中有非常好的表现,例如RockDB中就加入了对于io_uring的支持。但是将io_uring应用到高性能的网络框架中确实一个比较有挑战的领域。这是由于网络访问通常需要依赖操作系统的网络栈,以及读写缓存,而缓存机制又会涉及到内核态和有用户态的切换。此前和其他开发者交流,往往认为在高性能网络I/O领域可能并不适合采用io_uring。不过通过UringNet的实践来看,io_uring的不但适合用于网络I/O,而且还能够获得非常不错的性能。

对于io_uring的介绍,在这里就不再进行详细介绍了,下面列出了对这个技术的参考文档:

  • Lord of the io_uring
  • Ringing in a new asynchronous I/O API
  • An Introduction to the io_uring Asynchronous I/O Framework (oracle.com)
  • io_uring.pdf (kernel.dk)
  • Linux高性能异步I/O接口io_uring

为什么我创建了这个项目?

UringNet是一个高性能和轻量级的网络I/O框架。使用Golang语言开发。UringNet是基于Linux内核版本5.1引入的最新新异步I/O接口io_uring开发的。这个项目最初来自于我在边缘计算和物联网研究中的实验性项目。我最初想找到一种方法来构建一个简单但高性能的网络数据传输工具,用于物联网网关。我开始的时候尝试传统的select/epoll,然后测试了io_uring在物联网数据传输的表现,发现io_uring性能更好。

是否应该在你的项目中?

尽管UringNet最初是为物联网平台设计的,但它也提供了基本的TCP和UDP网络功能。如果你的项目确实需要处理超大的数据流量,你可以尝试使用它。
在大多数情况下,你可能只需使用更成熟的网络框架,例如Go的net/http、Netty或libuv。

入门指南

UringNet参考了现有的网络框架,如gnet和Netty等,某些使用模式与gnet非常相似。请注意,UringNet基于io_uring,因此需要在运行在内核版本高于或等于5.1的Linux操作系统中。
如何使用这个框架,简单的echo程序:

package mainimport ("github.com/y001j/UringNet"socket "github.com/y001j/UringNet/sockets""os""sync"
)type testServer struct {UringNet.BuiltinEventEnginetestloop *UringNet.Ringloop//ring      *uring_net.URingNetaddr      stringmulticore bool
}// OnTraffic 
//  
//	@Description: OnTraffic is a hook function that runs every read event completed
//	@receiver ts
//	@param data
//	@return uring_net.Action
func (ts *testServer) OnTraffic(data *UringNet.UserData, ringnet UringNet.URingNet) UringNet.Action {data.WriteBuf = data.Bufferreturn UringNet.Echo
}func (ts *testServer) OnWritten(data UringNet.UserData) UringNet.Action {return UringNet.None
}func (ts *testServer) OnOpen(data *UringNet.UserData) ([]byte, UringNet.Action) {return nil, UringNet.None
}func main() {addr := os.Args[1]options := socket.SocketOptions{TCPNoDelay: socket.TCPNoDelay, ReusePort: true}ringNets, _ := UringNet.NewMany(UringNet.NetAddress{socket.Tcp4, addr}, 3200, true, runtime.NumCPU(), options, &testServer{}) //runtime.NumCPU()loop := UringNet.SetLoops(ringNets, 3000)var waitgroup sync.WaitGroupwaitgroup.Add(1)loop.RunMany()waitgroup.Wait()
}

警告:该项目仍在开发中,可能存在一些bug和性能问题。如果您发现任何错误或有任何建议,请随时提出问题。邮箱rocky@yangjian.co

提示:

  1. 在我们使用wrk进行性能测试时,我们观察到UringNet在进行HTTP压力测试时需要一个预热时间。通常情况下,需要约5分钟的预热(用wrk预先压测5分钟),以确保UringNet测试代码达到其性能峰值。目前还不太清楚为什么io_uring需要预热才能够达到压测峰值性,该问题任然在研究中。
  2. UringNet的性能表现和参数设置密切相关,主要影响的参数有,
    1. 线程数num,用于设定启用的io_uring实例数量,一般设置为(CPU总数±1)。
    2. sqpoll这个参数通常设置为true能够达到更好的性能,不过CPU占用会上升。
    3. size指的是SQ的大小,也就是输入队列的大小,如果这个值过小,有可能会报错。
// NewMany Create multiple uring instances
//
//	@Description:
//	@param addr
//	@param size set SQ size
//	@param sqpoll if set sqpoll to true, io_uring submit SQs automatically  without enter syscall.
//	@param num number of io_uring instances need to be created
//	@return *[]URingNet
//	@return error
UringNet.NewMany(UringNet.NetAddress{socket.Tcp4, addr}, 3200, true, runtime.NumCPU(), options, &testServer{})

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

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

相关文章

RabbitMQ的基本介绍

什么是MQ 本质是一个队列,只不过队列中存放的信息是message罢了,还是一种跨进程的通信机制,用于上下游传递信息。在互联网架构中,MQ是一种非常常见的上下游“逻辑解耦物理解耦”的消息通信服务。使用了MQ之后,信息发送…

【简单的留言墙】HTML+CSS+JavaScript

目标&#xff1a;做一个简单的留言墙 1.首先我们用HTML的一些标签&#xff0c;初步构造区域 样式。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>留言墙</title><style>/* ...... */ …

STM32HAL库CRC学习及测试记录

STM32HAL库CRC学习及测试记录 1.CRC的校验原理2.基本原理3.几个基本概念13.1.1 CRC检验码的计算13.1.2 错误检测13.2 STM32中的CRC 4.CRC功能描述5.STM32Cube生成工程6.看官方说如何使用这个驱动程序7.实验现象 1.CRC的校验原理 循环冗余校验(CRC)计算单元是根据固定的生成多项…

pycharm 中的一个非常好使用的智能提示tabnine(大大提高代码的书写效率)

一. pycharm 中的代码智能提示插件 有时候,我们总是在写代码的时候,敲全部的代码,太过于麻烦了,如果有一个软件可以预知你的后续的操作,提前将代码给你写出来,你只需要检查对错,就可以了,这样就大大提高了工作的效率. 上面的一个插件是汉化pycharm的软件包,也是非常好用的一款…

Kafka收发消息核心参数详解

文章目录 1、从基础的客户端说起1.1、消息发送者主流程1.2、消息消费者主流程 2、从客户端属性来梳理客户端工作机制2.1、消费者分组消费机制 1、从基础的客户端说起 Kafka提供了非常简单的客户端API。只需要引入一个Maven依赖即可&#xff1a; <dependency><groupId…

lv7 嵌入式开发-网络编程开发 02OSI七层结构

目录 1 计算机网络体系结构的形成 1.1 提出了不同体系结构 1.2 国际标准&#xff1a;开放系统互连参考模型 OSI/RM 1.3 存在两种国际标准 2 协议与划分层次 2.1 网络协议 2.2 协议的两种形式 2.3 层次式协议结构 2.4 各层完成的主要功能 2.5 计算机网络的体系结构 …

大规模语言模型--训练成本

目前&#xff0c;基于 Transformers 架构的大型语言模型 (LLM)&#xff0c;如 GPT、T5 和 BERT&#xff0c;已经在各种自然语言处理 (NLP) 任务中取得了 SOTA 结果。将预训练好的语言模型(LM) 在下游任务上进行微调已成为处理 NLP 任务的一种 范式。与使用开箱即用的预训练 LLM…

jenkins联动显示或隐藏参数

1. 添加组件 Active Choices Plug-in 如jenkins无法联网&#xff0c;可在以下两个地址中下载插件&#xff0c;然后放到/home/jenkins/.jenkins/plugin下面重启jenkins即可 Active Choices Active Choices | Jenkins plugin 2. 效果如下&#xff1a; sharding为空时&#xf…

GEE15:获取不同遥感指数的时间序列及不同指数间的关系

GEE 1. 不同遥感指数间的时间序列分析2. 不同指数之间的关系 1. 不同遥感指数间的时间序列分析 GPP数据在一定程度上和植被指数&#xff08;如NDVI和EVI&#xff09;有着显著的相关性&#xff0c;那么其相关性如何&#xff1f;如何从时间序列的角度来思考呢&#xff1f;下面我将…

自动驾驶中的感知模型:实现安全与智能驾驶的关键

自动驾驶中的感知模型&#xff1a;实现安全与智能驾驶的关键 文章目录 引言感知模型的作用感知模型的技术安全与挑战结论 2023星火培训【专项营】Apollo开发者社区布道师倾力打造&#xff0c;包含PnC、新感知等的全新专项课程上线了。理论与实践相结合&#xff0c;全新的PnC培训…

大语言模型之十四-PEFT的LoRA

在《大语言模型之七- Llama-2单GPU微调SFT》和《大语言模型之十三 LLama2中文推理》中我们都提到了LoRA&#xff08;低秩分解&#xff09;方法&#xff0c;之所以用低秩分解进行参数的优化的原因是为了减少计算资源。 我们以《大语言模型之四-LlaMA-2从模型到应用》一文中的图…

vscode 打开后 默认terminal power shell 报错 名为“.C”的驱动器不存在。

这是 默认terminal power shell 打开报的错 Test-Path : 找不到驱动器。名为“.C”的驱动器不存在。 所在位置 C:\Users\HUAWEI\Documents\WindowsPowerShell\profile.ps1:4 字符: 5 If (Test-Path "C:\Users\HUAWEI\AppData\Local\Temp\_MEI319962\Scripts\ ... …

RabbitMQ核心总结

AMQP协议核心概念 RabbitMQ是基于AMQP协议的&#xff0c;通过使用通用协议就可以做到在不同语言之间传递。 server&#xff1a;又称broker&#xff0c;接受客户端连接&#xff0c;实现AMQP实体服务。 connection&#xff1a;连接和具体broker网络连接。 channel&#xff1a…

leetCode 45.跳跃游戏 II 贪心算法

45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 &…

Django之ORM操作初了解

文章开篇&#xff0c;我们首先复习下Django架构中的MTV模式&#xff0c;分别以字母来翻译就是&#xff1a; Views-代码的核心逻辑Tamplates-展示在页面上的html代码Models-对数据库的操作 那么Models中最为核心的便是本篇所介绍的ORM。 一&#xff09;基本知识 ORM&#xf…

react 网页/app复制分享链接到剪切板,分享到国外各大社交平台,通过WhatsApp方式分享以及SMS短信方式分享链接内容

1.需求 最近在做一个国际网站app,需要把app中某个页面的图文链接分享到国外各大社交平台上(facebook,whatapp,telegram,twitter等),以及通过WhatApp聊天方式分享&#xff0c;和SMS短信方式分享链接内容&#xff0c;该怎么做呢&#xff1f;图示如下: 分享到国外各大社交平台&am…

DS线性表之链表

前言 我们上一期介绍了顺序表&#xff0c;它的底层就是数组&#xff0c;我们也分别对顺序表的动态版本和静态版本进行了实现&#xff01;并且分析了顺序表的优缺点&#xff0c;优点是&#xff1a;尾插、尾删效率很高&#xff0c;其时间复杂度是O(1)&#xff1b;缺点是&#xff…

代码随想录算法训练营第五十五天 | 动态规划 part 12 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

目录 300.最长递增子序列思路代码 674. 最长连续递增序列思路代码 718. 最长重复子数组思路代码 300.最长递增子序列 Leetcode 思路 dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度递推公式&#xff1a;if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1)初…

格点数据可视化(美国站点的日降雨数据)

获取美国站点的日降雨量的格点数据&#xff0c;并且可视化 导入模块 from datetime import datetime, timedelta from urllib.request import urlopenimport cartopy.crs as ccrs import cartopy.feature as cfeature import matplotlib.colors as mcolors import matplotli…

解决u盘在我的电脑中重复显示两个

删除注册表&#xff1a; [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\DelegateFolders\{F5FB2C77-0E2F-4A16-A381-3E560C68BC83}]