我想检查Linux机器是否支持io_uring。如何才能做到这一点?
是否有一些内核文件描述了对此的支持,或者所有 Linux 5.1+ 内核都支持吗?
答案1
io_uring
不暴露任何用户可见的功能,例如作为一个sysctl
;它只公开新的系统调用。它从内核 5.1 起就可用,但可以编译出对它的支持,并且它可能会向后移植到某些系统中的旧内核。
因此,检查支持的最安全方法是检查io_uring
系统调用是否可用。如果你有/proc/kallsyms
,你可以在那里查看:
grep io_uring_setup /proc/kallsyms
检查系统调用的另一种方法是尝试安全但格式错误的调用,并检查生成的错误是否为ENOSYS
,例如:
#include <errno.h>
#include <linux/io_uring.h>
#include <stddef.h>
#include <sys/syscall.h>
#include <unistd.h>
int main(int argc, char **argv) {
if (syscall(__NR_io_uring_register, 0, IORING_UNREGISTER_BUFFERS, NULL, 0) && errno == ENOSYS) {
// No io_uring
} else {
// io_uring
}
}
在支持 的内核上io_uring
,可用的操作会随着新内核版本引入新功能而变化;确定支持的操作,使用io_uring_get_probe
。
答案2
它在 Linux 5.1 及更高版本中可用,并且可以在编译过程中启用。在 Debian 及其衍生版本中,您可以在 file 中找到编译期间使用的内核选项/boot/config-{kernel version}-{arch}
。在 UEFI 机器中,此路径可能有所不同。
因此输入,
grep -i uring /boot/config-$(uname -r)
输出应包括CONFIG_IO_URING
、y 或 n、启用或禁用。