Upgrade to Pro — share decks privately, control downloads, hide ads and more …

cgroup の歩き方 / TechFeed Experts Night #19

cgroup の歩き方 / TechFeed Experts Night #19

「TechFeed Experts Night #19 〜 達人に聞く、Linuxカーネルコードの歩き方」の講演資料です。
参考となる情報にはPDF中からリンクをしていますが、資料中のリンクは Speaker Deck 上ではクリックできないので PDF をダウンロードしてご覧ください。

tenforward

May 24, 2023
Tweet

More Decks by tenforward

Other Decks in Technology

Transcript

  1. 自己紹介(1)   加藤泰文(かとうやすふみ) • Twitter: @ten_forward • LXC で学ぶコンテナ入門 -軽量仮想化環境を実現

    する技術 (gihyo.jp, 2014 年〜) • 技術書典で lxc-jp から「Linux Container Book」 という同人本を出しています(現在第 2 巻まで 刊行) • LXC/LXD 方面翻訳(lxc-jp Project) • 趣味でコンテナやってます。コンテナの主にカーネ ル周辺の実装に興味があります • Kubernetes 知りません。コンテナといえば LXC/LXD です 2/14
  2. 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
  3. cgroup の構造 cgroup は内部的に 2 つの部分に分けて考えることができます(v1, v2 共通) 。 •

    コア 実装は cgroup 自身の知識以外の前提知識なく理解できる • cgroup ファイルシステムの操作 • プロセスをグループ化する機能 • グループ(cgroup)とコントローラーとタスクのひもづけ • コントローラ 実装の理解には対象となるリソースの知識が必要(例えば memory コントローラーの実 装を読むにはメモリー管理の知識が必要) • 対象となるリソースの管理(リソース制限)についての実装 5/14
  4. cgroup のコード cgroup のコードは kernel コードツリーのどこにあるか? コア kernel/cgroup 以下に存在 •

    cgroup-internal.h • cgroup-v1.c • cgroup.c コントローラ 機能ごとに色々なところに存在 • いくつかのコントローラは kernel/cgroup 以下 • その他はコードツリー内で struct cgroup_subsys を探してくださ い。コントローラは cgroup_subsys 構造体として実装します 6/14
  5. カーネル起動時の処理 カーネル起動時に cgroup に関係する初期化処理が 2 度ほど走ります。しかし、そこで行わ れる処理のほとんどは cgroup v2 用の処理です。

    v1 一部の変数の初期化程度で、実際使用する際のマウント時に初期化される • cgroup を使うかどうかはわからないため(昔は cgroup 必須ではな かった) • ほとんどの初期化はマウント時に行われる v2 様々な初期化が走る • cgroup を使うことが当たり前の世の中になった 7/14
  6. 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
  7. cgroup のコア構造や実際の処理を追う これを話す時間はありません。cgroup は v1 が自由度が非常に高かったため、非常に複雑な 構造をしていると思います。次のような順で進めるのが良いと思います。 1. cgroup の操作方法を学ぶ

    cgroup がどういう操作でどう動くかがわからないとコードを追ってもわかりません (当たり前) 2. 構造を見る 関係する構造体を見て、それぞれの関係性を理解する 3. 実際の処理を追う 構造を頭に入れ(or 参照しながら)処理を追う 9/14
  8. 詳しくは 私が書いた資料にもう少し詳しく書いています。 • 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
  9. とにかくなんでもコントローラーの実装を見たい なかには非常に簡単に実装されたコントローラーがあります。そのようなコントローラーの パッチから、どのようにリソース制御を行っているのかを追っかけてみるのは面白いと思い ます。マージされたときのパッチを見るとわかりやすいでしょう。 例えば、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