使用Go进行io_uring的动手实践( 四 )

在 read_callback 与 write_callback 从刚刚得到的条目 cbMap 与传递 fd 和调用所需的回调函数最初发出 ReadFile / WriteFile 电话 。
//export read_callbackfunc read_callback(iovecs *C.struct_iovec, length C.int, fd C.int) {var buf bytes.Buffer// Populate the buffer with the data passed.cbMut.Lock()cbMap[uintptr(fd)].close()cbMap[uintptr(fd)].readCb(buf.Bytes())cbMut.Unlock()}//export write_callbackfunc write_callback(written C.int, fd C.int) {cbMut.Lock()cbMap[uintptr(fd)].close()cbMap[uintptr(fd)].writeCb(int(written))cbMut.Unlock()}基本上就是这样! 如何使用该库的示例如下:
err := frodo.ReadFile("shire.html", func(buf []byte) {// handle buf})if err != nil {// handle err}随时检查 源代码: ,以深入了解实现的细节 。
性能没有一些性能数字 , 没有任何博客文章是完整的 。但是 , 对I / O引擎进行适当的基准测试比较可能会需要另外一篇博客文章 。为了完整起见 , 我将简短而科学的测试结果发布到笔记本电脑上 。不要过多地阅读它 , 因为任何基准测试都高度依赖于工作负载 , 队列参数 , 硬件 , 一天中的时间以及衬衫的颜色 。
我们将使用 fio 由Jens自己编写的漂亮工具 来对具有不同工作负载的多个I / O引擎进行基准测试 , 同时支持 io_uring 和 libaio。旋钮太多 , 无法更改 。但是 , 我们将使用比率为75/25的随机读/写工作量 , 使用1GiB文件以及16KiB , 32KiB和1MiB的不同块大小来执行一个非常简单的实验 。然后 , 我们以8、16和32的队列大小重复整个实验 。
使用Go进行io_uring的动手实践文章插图
使用Go进行io_uring的动手实践文章插图
使用Go进行io_uring的动手实践文章插图
请注意 , 这是 io_uring 不轮询的基本模式 , 在这种情况下 , 结果可能更高 。
结论这是一篇相当长的文章 , 非常感谢您阅读本文!
io_uring 仍处于起步阶段 , 但很快就吸引了很多人 。许多知名人士(例如libuv和RocksDB)已经支持它 。甚至有一个补丁可以 nginx 增加 io_uring 支持 。
作者:秃头大哥
出处: