使用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的队列大小重复整个实验 。
文章插图
文章插图
文章插图
请注意 , 这是 io_uring 不轮询的基本模式 , 在这种情况下 , 结果可能更高 。
结论这是一篇相当长的文章 , 非常感谢您阅读本文!
io_uring 仍处于起步阶段 , 但很快就吸引了很多人 。许多知名人士(例如libuv和RocksDB)已经支持它 。甚至有一个补丁可以 nginx 增加 io_uring 支持 。
作者:秃头大哥
出处:
- 会员|美容院使用会员管理软件给顾客更好的消费体验!
- 桌面|日常使用的软件及网站分享 篇一:几个动态壁纸软件和静态壁纸网站:助你美化你的桌面
- QuestMobile|QuestMobile:百度智能小程序月人均使用个数达9.6个
- 轻松|使用 GIMP 轻松地设置图片透明度
- 电池容量|Windows 自带功能查看笔记本电脑电池使用情况,你的容量还好吗?
- 信服|深信服何朝曦:安全不能只面向静态风险进行建设,应该从"面向风险"转向"面向能力"
- 撕破脸|使用华为设备就罚款87万,英政府果真要和中国“撕破脸”?
- 冲突|智能互联汽车:通过数据托管模式解决数据使用方面的冲突
- 鼓励|(经济)商务部:鼓励引导商务领域减少使用塑料袋等一次性塑料制品
- 机身|轻松使用一整天,OPPO K7x给你不断电体验