iouring-go icon indicating copy to clipboard operation
iouring-go copied to clipboard

无法支持SQPOLL的原因是什么呢?

Open Cloudstriff opened this issue 3 years ago • 6 comments

但是在 Go 简单的设置 io_uring_params 并不能正常的工作,可能是由于 Go 的 GMP 模型导致的一些问题。暂时还在思考解决方案

这里我有些疑惑,我在5.18.10-1.el7.elrepo.x86_64 + INTEL SSDPE2KX040T8 的环境下,SQPOLL+IOPOLL同时开启时能正常work,并没有遇到所谓的因为CMP模型导致的一些问题。 查看iouring.c的实现,开启SQPOLL后也只是简单的创建和开启后台worker线程而已,这里似乎跟go的并发模型没有什么关系

Cloudstriff avatar Jul 12 '22 07:07 Cloudstriff

当时对于这个问题的判断是因为只设置了 SQPOLL,忽视了 IOPOLL,所以没有正常运行,考虑到 Go 相比 C 来说比较特殊的就是他的 gmp 模型,没有深究就暂时感觉也许是这个问题引起的。

我也试了一下 SQPOLL 和 IOPOLL 同时开启后,的确可以正常运行,但是 IOPOLL 和 SQPOLL 应该是两个单独的功能,不太应该有很深的互相影响,而且在 C 中好像单独使用 SQPOLL 是没有问题的,可能还需要再研究一下。

@Cloudstriff 请教一下,对于 go 中必须同时开启 SQPOLL + IOPOLL 有什么思路吗

Iceber avatar Jul 12 '22 12:07 Iceber

@Iceber 你好,我这边对Go程序的实际测试,只开启SQPOLL或者IOPOLL都是能work的,无论nvme设备io_poll是否开启,都能正常提交和收割IO结果。只是设备io_poll打开时,走poll模式相比中断请求整体时延会更低。但没有遇到你说的只设置SQPOLL无法正常运行的问题

Cloudstriff avatar Jul 18 '22 02:07 Cloudstriff

@Cloudstriff 我的测试方法是修改 https://github.com/Iceber/iouring-go/tree/main/examples/mv,开启 SQPOLL,你的测试方法是什么呢,你的环境可以试一下修改 mv ,观察是否可以正常运行吗

Iceber avatar Jul 18 '22 02:07 Iceber

@Iceber 我这边是用的向量读readv直接操作nvme设备,没有试过mv操作是否可行,我试下

Cloudstriff avatar Jul 18 '22 03:07 Cloudstriff

注意到 mv 执行时使用的不是 ./mv,是否是使用了 PATH 中的 mv 命令呢

Iceber avatar Jul 18 '22 03:07 Iceber

@Iceber 我测试了下,用上面的例子和iouring-go的库确实会阻塞住,但是我自己改造的uring库是可以执行成功的: image 不知道这样测试是否符合预期?

Cloudstriff avatar Jul 18 '22 04:07 Cloudstriff