iouring-go
iouring-go copied to clipboard
无法支持SQPOLL的原因是什么呢?
但是在 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的并发模型没有什么关系
当时对于这个问题的判断是因为只设置了 SQPOLL,忽视了 IOPOLL,所以没有正常运行,考虑到 Go 相比 C 来说比较特殊的就是他的 gmp 模型,没有深究就暂时感觉也许是这个问题引起的。
我也试了一下 SQPOLL 和 IOPOLL 同时开启后,的确可以正常运行,但是 IOPOLL 和 SQPOLL 应该是两个单独的功能,不太应该有很深的互相影响,而且在 C 中好像单独使用 SQPOLL 是没有问题的,可能还需要再研究一下。
@Cloudstriff 请教一下,对于 go 中必须同时开启 SQPOLL + IOPOLL 有什么思路吗
@Iceber 你好,我这边对Go程序的实际测试,只开启SQPOLL或者IOPOLL都是能work的,无论nvme设备io_poll是否开启,都能正常提交和收割IO结果。只是设备io_poll打开时,走poll模式相比中断请求整体时延会更低。但没有遇到你说的只设置SQPOLL无法正常运行的问题
@Cloudstriff 我的测试方法是修改 https://github.com/Iceber/iouring-go/tree/main/examples/mv,开启 SQPOLL,你的测试方法是什么呢,你的环境可以试一下修改 mv ,观察是否可以正常运行吗
@Iceber 我这边是用的向量读readv直接操作nvme设备,没有试过mv操作是否可行,我试下
注意到 mv 执行时使用的不是 ./mv,是否是使用了 PATH 中的 mv 命令呢
@Iceber 我测试了下,用上面的例子和iouring-go的库确实会阻塞住,但是我自己改造的uring库是可以执行成功的:
不知道这样测试是否符合预期?