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 main
import (
"github.com/y001j/UringNet"
socket "github.com/y001j/UringNet/sockets"
"os"
"sync"
)
type testServer struct {
UringNet.BuiltinEventEngine
testloop \*UringNet.Ringloop
//ring \*uring\_net.URingNet
addr string
multicore 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.Buffer
return 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.WaitGroup
waitgroup.Add(1)
loop.RunMany()
waitgroup.Wait()
}
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
*](https://bbs.csdn.net/topics/618654289)
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!