在 Linux v5.0 中,某些类型的异步 IO 是否绕过 cgroup IO 控制器?
编辑:缓冲 write() 和 fsync() 分析起来可能相对复杂。我在这里发现了一篇关于控制缓冲写入的有趣帖子:https://andrestc.com/post/cgroups-io/。如果这个问题看起来太复杂,也许最简单的方法是首先询问有关io_uring
.
新的 AIO 接口io_uring
包括 read()、write() 和 fsync() 的 AIO 等效项。当您将其用于“缓冲 IO”(普通可缓存文件 IO),并且页面缓存无法立即满足 IO 时,它会使用工作队列异步运行。
io_submit()
最近还有原来的AIO系统调用获得了支持IOCB_CMD_FSYNC
。这个新命令使用工作队列来调用 vfs_fsync()。 (戴夫·钦纳强烈暗示IOCB_CMD_FSYNC
适用于正常的“缓冲 IO”,所以听起来与io_uring
) 非常相似。
IOCB_CMD_FSYNC
使用内核默认工作队列。 io_uring
略有不同。每个io_uring
创建自己的并发管理工作队列(CMWQ)。
我查看了ps -eo pid,user,args,cgroup|grep [[]
我的系统。 cgroup 中唯一的内核线程恰好是[vhost-nnn]
.我发现内核明确地将这些 vhost_worker 线程放置在创建它们的用户进程的 cgroup 中。看vhost_attach_cgroups_work()。
相比之下,没有提到cgroup
's文件系统/io_uring.c,也不在内核/工作队列.c。
结构文件不直接指向特定的cgroup。虽然它确实指出了一个结构索引节点CONFIG_CGROUP_WRITEBACK
,如果设置的话则指向“关联的cgroup wb” 。