Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
Cloudstriff opened this issue Jul 12, 2022 · 6 comments
Open

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

Cloudstriff opened this issue Jul 12, 2022 · 6 comments

Comments

@Cloudstriff
Copy link

但是在 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的并发模型没有什么关系

@Iceber
Copy link
Owner

Iceber commented Jul 12, 2022

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

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

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

@Cloudstriff
Copy link
Author

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

@Iceber
Copy link
Owner

Iceber commented Jul 18, 2022

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

@Cloudstriff
Copy link
Author

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

@Iceber
Copy link
Owner

Iceber commented Jul 18, 2022

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

@Cloudstriff
Copy link
Author

Cloudstriff commented Jul 18, 2022

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants