Linux v5.0 では、一部のタイプの非同期 IO は cgroup IO コントローラーをバイパスしますか?
編集: バッファリングされた write() と fsync() は、分析するのが比較的複雑かもしれません。バッファリングされた書き込みの制御に関する興味深い投稿をここで見つけました:https://andrestc.com/post/cgroups-io/この質問が複雑すぎると思われる場合は、 を使用した buffered read() について質問することから始めるのが最も簡単かもしれませんio_uring
。
新しい AIO インターフェイスには、io_uring
read()、write()、および fsync() に相当する AIO が含まれています。これを「バッファリングされた IO」(通常のキャッシュ可能なファイル IO) に使用する場合、ページ キャッシュによって IO がすぐに満たされない場合は、ワークキューを使用して非同期的に実行されます。
io_submit()
また、最近ではオリジナルのAIOシステムコールも支持を得たIOCB_CMD_FSYNC
この新しいコマンドはワークキューを使用してvfs_fsync()を呼び出します。(Dave Chinnerは強く示唆していますIOCB_CMD_FSYNC
通常の「バッファリングされたIO」で動作しますなので、 と非常によく似た発音になりますio_uring
。
IOCB_CMD_FSYNC
カーネルのデフォルトのワークキューを使用します。 io_uring
少し異なります。それぞれがio_uring
独自の同時実行管理ワークキューを作成します(センチワット)。
私は自分のシステムで を確認しましたps -eo pid,user,args,cgroup|grep [[]
。cgroup 内の唯一のカーネルスレッドは でした[vhost-nnn]
。カーネルはこれらの vhost_worker スレッドを、それらを作成したユーザープロセスの cgroup 内に明示的に配置していることがわかりました。vhost_attach_cgroups_work()。
cgroup
対照的に、fs/io_uring.c、また、カーネル/ワークキュー.c。
構造体ファイル特定のcgroupを直接指しているわけではありません。構造体iノードが設定されている場合は、「関連付けられている cgroup wb」を指しますCONFIG_CGROUP_WRITEBACK
。