「TechFeed Experts Night #19 〜 達人に聞く、Linuxカーネルコードの歩き方」の講演資料です。 参考となる情報にはPDF中からリンクをしていますが、資料中のリンクは Speaker Deck 上ではクリックできないので PDF をダウンロードしてご覧ください。
cgroup の歩き方TechFeed Experts Night#19 〜 達人に聞く、Linux カーネルコードの歩き方加藤泰文2023-05-241/14
View Slide
自己紹介(1) 加藤泰文(かとうやすふみ)• Twitter: @ten_forward• LXC で学ぶコンテナ入門 -軽量仮想化環境を実現する技術 (gihyo.jp, 2014 年〜)• 技術書典で lxc-jp から「Linux Container Book」という同人本を出しています(現在第 2 巻まで刊行)• LXC/LXD 方面翻訳(lxc-jp Project)• 趣味でコンテナやってます。コンテナの主にカーネル周辺の実装に興味があります• Kubernetes 知りません。コンテナといえばLXC/LXD です2/14
本日の内容cgroup とはcgroup の初期化を追うcgroup コアの処理を追うコントローラーの処理を追うまとめ3/14
cgroup とは
cgroup とは• タスク(プロセス・スレッド)をグループ化して、グループ内のタスクに対して共通の管理(リソース制限)を行う• 専用のファイルシステムをマウントして使用する(/sys/fs/cgroup)• 通常のファイルシステムのようにツリー構造• ディレクトリーでグループ(cgroup)を表す• ディレクトリー内に自動的に出現するファイルを操作して色々な制御をする• コンテナ専用の機能ではない• 最近は systemd がシステム上のタスクを管理するために cgroup を使っている• 2.6.24 カーネル以来の v1 と、4.5 カーネル以来の v2 がある• 詳しくは、私の連載もしくは “Linux Container Book (2)” をご覧ください• LXC で学ぶコンテナ入門 -軽量仮想化環境を実現する技術(gihyo.jp)• Linux Container Book (2) cgroup v1 編4/14
cgroup の構造cgroup は内部的に 2 つの部分に分けて考えることができます(v1, v2 共通)。• コア実装は cgroup 自身の知識以外の前提知識なく理解できる• cgroup ファイルシステムの操作• プロセスをグループ化する機能• グループ(cgroup)とコントローラーとタスクのひもづけ• コントローラ実装の理解には対象となるリソースの知識が必要(例えば memory コントローラーの実装を読むにはメモリー管理の知識が必要)• 対象となるリソースの管理(リソース制限)についての実装5/14
cgroup のコードcgroup のコードは kernel コードツリーのどこにあるか?コアkernel/cgroup 以下に存在• cgroup-internal.h• cgroup-v1.c• cgroup.cコントローラ機能ごとに色々なところに存在• いくつかのコントローラは kernel/cgroup 以下• その他はコードツリー内で struct cgroup_subsys を探してください。コントローラは cgroup_subsys 構造体として実装します6/14
cgroup の初期化を追う
カーネル起動時の処理カーネル起動時に cgroup に関係する初期化処理が 2 度ほど走ります。しかし、そこで行われる処理のほとんどは cgroup v2 用の処理です。v1一部の変数の初期化程度で、実際使用する際のマウント時に初期化される• cgroup を使うかどうかはわからないため(昔は cgroup 必須ではなかった)• ほとんどの初期化はマウント時に行われるv2様々な初期化が走る• cgroup を使うことが当たり前の世の中になった7/14
cgroup コアの処理を追う
cgroup コアの各種処理を追う入り口cgroup は kernfs の機能を使用します。cgroup の各種操作を行う関数はkernfs_syscall_ops 構造体の各メンバに登録されています(kernel/cgroup/cgroup-v1.c)(cgroup v1 の場合)。 struct kernfs_syscall_ops cgroup1_kf_syscall_ops = {.rename = cgroup1_rename,.show_options = cgroup1_show_options,.remount_fs = cgroup1_remount,.mkdir = cgroup_mkdir,.rmdir = cgroup_rmdir,.show_path = cgroup_show_path,}; マウント時の処理を追うのであれば、kernel/cgroup/cgroup.c 内でファイルシステムの定義を行っている部分、struct file_system_type で定義されている関数が入り口になります。8/14
cgroup のコア構造や実際の処理を追うこれを話す時間はありません。cgroup は v1 が自由度が非常に高かったため、非常に複雑な構造をしていると思います。次のような順で進めるのが良いと思います。1. cgroup の操作方法を学ぶcgroup がどういう操作でどう動くかがわからないとコードを追ってもわかりません(当たり前)2. 構造を見る関係する構造体を見て、それぞれの関係性を理解する3. 実際の処理を追う構造を頭に入れ(or 参照しながら)処理を追う9/14
詳しくは私が書いた資料にもう少し詳しく書いています。• LXC で学ぶコンテナ入門 -軽量仮想化環境を実現する技術(gihyo.jp)• Linux Container Book (2) cgroup v1 編(cgroup の基本、操作方法など)• cgroup v1 概要(内部構造を学ぶ入り口)• cgroup v1 の内部構造(少し詳しい内部構造の話)(ご参考)cgroup の構造体でキーとなる重要な構造体は、cgroup 構造体 cgroup のツリー構造などの操作(リソース制限やタスクの情報はない)css_set 構造体 タスクとコントローラー(リソース制限などの情報)をひもづけるcgrp_cset_link 構造体 m:n な関係の cgroup 構造体と css_set 構造体を結びつける10/14
コントローラーの処理を追う
コントローラーの処理を追うコントローラーの実装を追うには、各コントローラーが扱うリソースの専門知識が必要なので、それがない場合は非常に難しいと思います。11/14
とにかくなんでもコントローラーの実装を見たいなかには非常に簡単に実装されたコントローラーがあります。そのようなコントローラーのパッチから、どのようにリソース制御を行っているのかを追っかけてみるのは面白いと思います。マージされたときのパッチを見るとわかりやすいでしょう。例えば、pids コントローラー(cgroup 内で生成できるタスクの数を制限する)。たった 2 つのパッチで実装されています。• cgroup: implement the PIDs subsystem(コントローラーを定義する際にはどのような処理を書けばよいかがわかる)• cgroup: allow a cgroup subsystem to reject a fork(実際の制限処理が見れる)もうひとつ、net_prio コントローラー。これも 2 つのパッチで実装されています。しかも 1つはドキュメント。• net: add network priority cgroup infrastructure (v4)(非常にシンプルに新しい機能を実現している例。このコントローラーは v2 にはないけど…)12/14
まとめ
まとめ• cgroup を歩く際の入り口を案内しました。ほんのさわりしか話してないので、これだけで cgroup を自在に歩くのは難しいかもしれませんが、きっかけになればうれしいです• パッチを追いながら自分の興味ある機能を追うというのは、入り口としては良いかもしれません13/14
以上ご清聴ありがとうございました14/14