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. cgroup の歩き方
    TechFeed Experts Night#19 〜 達人に聞く、Linux カーネルコードの歩き方
    加藤泰文
    2023-05-24
    1/14

    View full-size slide

  2. 自己紹介(1)
     
    加藤泰文(かとうやすふみ)
    • Twitter: @ten_forward
    • LXC で学ぶコンテナ入門 -軽量仮想化環境を実現
    する技術 (gihyo.jp, 2014 年〜)
    • 技術書典で lxc-jp から「Linux Container Book」
    という同人本を出しています(現在第 2 巻まで
    刊行)
    • LXC/LXD 方面翻訳(lxc-jp Project)
    • 趣味でコンテナやってます。コンテナの主にカーネ
    ル周辺の実装に興味があります
    • Kubernetes 知りません。コンテナといえば
    LXC/LXD です
    2/14

    View full-size slide

  3. 本日の内容
    cgroup とは
    cgroup の初期化を追う
    cgroup コアの処理を追う
    コントローラーの処理を追う
    まとめ
    3/14

    View full-size slide

  4. cgroup とは

    View full-size slide

  5. 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

    View full-size slide

  6. cgroup の構造
    cgroup は内部的に 2 つの部分に分けて考えることができます(v1, v2 共通)

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

    View full-size slide

  7. cgroup のコード
    cgroup のコードは kernel コードツリーのどこにあるか?
    コア
    kernel/cgroup 以下に存在
    • cgroup-internal.h
    • cgroup-v1.c
    • cgroup.c
    コントローラ
    機能ごとに色々なところに存在
    • いくつかのコントローラは kernel/cgroup 以下
    • その他はコードツリー内で struct cgroup_subsys を探してくださ
    い。コントローラは cgroup_subsys 構造体として実装します
    6/14

    View full-size slide

  8. cgroup の初期化を追う

    View full-size slide

  9. カーネル起動時の処理
    カーネル起動時に cgroup に関係する初期化処理が 2 度ほど走ります。しかし、そこで行わ
    れる処理のほとんどは cgroup v2 用の処理です。
    v1
    一部の変数の初期化程度で、実際使用する際のマウント時に初期化される
    • cgroup を使うかどうかはわからないため(昔は cgroup 必須ではな
    かった)
    • ほとんどの初期化はマウント時に行われる
    v2
    様々な初期化が走る
    • cgroup を使うことが当たり前の世の中になった
    7/14

    View full-size slide

  10. cgroup コアの処理を追う

    View full-size slide

  11. 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

    View full-size slide

  12. cgroup のコア構造や実際の処理を追う
    これを話す時間はありません。cgroup は v1 が自由度が非常に高かったため、非常に複雑な
    構造をしていると思います。次のような順で進めるのが良いと思います。
    1. cgroup の操作方法を学ぶ
    cgroup がどういう操作でどう動くかがわからないとコードを追ってもわかりません
    (当たり前)
    2. 構造を見る
    関係する構造体を見て、それぞれの関係性を理解する
    3. 実際の処理を追う
    構造を頭に入れ(or 参照しながら)処理を追う
    9/14

    View full-size slide

  13. 詳しくは
    私が書いた資料にもう少し詳しく書いています。
    • 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

    View full-size slide

  14. コントローラーの処理を追う

    View full-size slide

  15. コントローラーの処理を追う
    コントローラーの実装を追うには、各コントローラーが扱うリソースの専門知識が必要なの
    で、それがない場合は非常に難しいと思います。
    11/14

    View full-size slide

  16. とにかくなんでもコントローラーの実装を見たい
    なかには非常に簡単に実装されたコントローラーがあります。そのようなコントローラーの
    パッチから、どのようにリソース制御を行っているのかを追っかけてみるのは面白いと思い
    ます。マージされたときのパッチを見るとわかりやすいでしょう。
    例えば、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

    View full-size slide

  17. まとめ
    • cgroup を歩く際の入り口を案内しました。ほんのさわりしか話してないので、これだけ
    で cgroup を自在に歩くのは難しいかもしれませんが、きっかけになればうれしいです
    • パッチを追いながら自分の興味ある機能を追うというのは、入り口としては良いかもし
    れません
    13/14

    View full-size slide

  18. 以上
    ご清聴ありがとうございました
    14/14

    View full-size slide