カーネル内の強力なツール cgroup は、NameSpace によって分離されたリソースを制限できるだけでなく、リソースの重みを設定したり、使用量を計算したりすることもできます。 cgroupとはcgroupのフルネームはコントロールグループです コントロール グループ: コントロール グループは Linux カーネルに統合されています。コントロール グループはプロセス (タスク) をグループにまとめ、グループの権限を設定し、プロセスを制御します。これは、ユーザーとグループの概念として理解できます。ユーザーは、所属するグループの権限を継承します。 cgroupsはLinuxカーネルのメカニズムです。このメカニズムは、特定の動作に応じて一連のタスクとサブタスクを統合または分離し、さまざまなレベルのリソース分割に応じて統一されたリソース制御のフレームワークを実装できます。cgroupは、CPU、メモリ、IOなど、プロセスに必要な物理リソースを制御、制限、分離することができ、コンテナ仮想化の最も基本的な保証を提供します。これは、一連のdocker仮想化を構築するための管理ツールです。 開発中のcgroupの特徴
cgroupの役割cgroup カーネルはフックを通じてプロセス リソースを管理し、単一プロセスのリソース制御からオペレーティング システム レベルの仮想カードへの移行のための統一されたインターフェイスを提供します。 Cgroup は次の 4 つの機能を提供します。
用語集
関係: cgroup には複数のタスクを含めることができ、サブシステムは cgroup 制限を制御するタイプに相当し、階層内に複数の cgroup を含めることができ、システムには複数の階層を含めることができます。 階層ツリーの4つのルール従来のプロセス起動では、init をルート ノード (親プロセスとも呼ばれます) として使用し、子プロセスを子ノードとして作成します。また、各子ノードも新しい子ノードを作成できるため、ツリー構造が形成されます。 cgroup の構造はこれに似ています。子ノードは親ノードのプロパティを継承します。両者の最大の違いは、システムの cgroup で構成される階層ツリーが複数の存在を許容することです。プロセス モデルが init をルート ノードとして形成されるツリーである場合、cgroup モデルは複数の階層ツリーで構成されます。 階層ツリーが 1 つしかない場合、すべてのタスクがサブシステムの同じ制約を受けることになり、そのような制約を必要としないタスクに問題が生じます。 1. 1つまたは複数のサブシステムを同じ階層に接続できる
2. サブシステムは複数の階層に接続できますが、サブシステムが存在しない階層にのみ接続できます。 図に示すように、cpu サブシステムは最初に階層ツリー A に接続されますが、B にはすでに mem サブシステムがあるため、同時に階層ツリー B に接続することはできません。B と A の両方にサブシステムがない場合、cpu サブシステムは A と B の両方の階層ツリーに同時に接続できます。 つまり、複数の階層ツリーにサブシステムがない場合、CPU サブシステムをこれらの階層ツリーに順番に接続できます。 3. プロセス(タスク)は同じ階層内の異なるcgroupに属することはできない システムが新しい階層を作成するたびに、新しい階層の初期化を構成するデフォルトの cgroup はルート cgroup と呼ばれます。独自の正常な階層では、タスクはこの階層の 1 つの cgroup にのみ存在できます。つまり、階層内に 2 つの同一のタスクが存在することはできませんが、異なる階層内の他の cgroup には存在できます。 階層ツリー cgroup 内のタスクを階層ツリー内の別の cgroup に追加する場合は、以前のタスクが配置されている cgroup から削除されます。 上記の例に示すように: 階層 A の cg1 に httpd が追加され、その pid は 58950 です。この時点では、この httpd プロセスを cg2 に配置することはできません。そうしないと、cg1 の httpd プロセスが削除されます。ただし、階層 B の cg3 コントロール グループに配置することはできます。 実は、これはプロセスの競合を防ぐためです。例えば、階層ツリー A の cg1 に httpd プロセスがあります。このとき、cg1 の CPU 使用率制限は 30%、cg2 の CPU 使用率制限は 50% です。cg2 に httpd プロセスを追加すると、httpd の CPU 使用率制限に競合が発生します。 4. 新しくフォークされた子プロセスは、初期状態では親プロセスと同じcgroupに属します。 プロセス タスクによって開かれた新しい子プロセス (child_task) は、デフォルトでは元のタスクと同じ cgroup にありますが、child_task は階層ツリー内の他の異なる cgroup に移動できます。 フォークが完了した時点では、親プロセスと子プロセスは完全に独立している。 図に示すように、誰かが httpd58950 プロセスにアクセスすると、別の子プロセス httpd58951 がフォークされます。このとき、デフォルトでは、httpd58951 と httpd58950 は両方とも cg1 にあり、それらの関係も親子プロセスです。httpd58951 は cg2 に移動することができ、この時点でそれらの関係が変更され、両方とも独立したプロセスになります。 サブシステムサブシステムは具体的に何を制御できるのでしょうか? 以下の手順で確認します [root@localhost ~]# yum -y libcgroup-toolsをインストールします このツールをインストールした後、cgroupコマンドを使用して表示できます。 システム内のすべてのcgroupコントロールグループを一覧表示します [root@localhost ~]# lscgroup ネット_cls、ネット_prio:/ 冷凍庫:/ ヒューゲットlb:/ CPU、CPUacct:/ cpu、cpuacct:/マシン.スライス cpu、cpuacct:/user.slice cpu、cpuacct:/system.slice cpu、cpuacct:/system.slice/network.service cpu、cpuacct:/system.slice/docker.service ... サブシステムが制御できるハードウェアを表示する [root@localhost ~]# lssubsys -a CPUセット CPU、CPUacct メモリ デバイス 冷凍庫 ネット_cls、ネット_prio ブルキオ パフォーマンスイベント 巨大LB ピッド 上記のように、対応するディレクトリ [root@localhost ~]# ll /sys/fs/cgroup/ 合計 0 drwxr-xr-x. 5 ルート ルート 0 3月25日 04:50 blkio lrwxrwxrwx. 1 ルート ルート 11 3月 25 04:50 cpu -> cpu,cpuacct lrwxrwxrwx. 1 ルート ルート 11 3月 25 04:50 cpuacct -> cpu,cpuacct drwxr-xr-x. 5 ルート ルート 0 3月25日 04:50 cpu,cpuacct drwxr-xr-x. 2 ルート ルート 0 3月25日 04:50 cpuset drwxr-xr-x. 5 ルート ルート 0 3月 25 04:50 デバイス drwxr-xr-x. 2 ルート ルート 0 3月25日 04:50 フリーザー drwxr-xr-x. 2 ルート ルート 0 3月25日 04:50 hugetlb drwxr-xr-x. 5 ルート ルート 0 3月25日 04:50 メモリ lrwxrwxrwx. 1 ルート ルート 16 3月 25 04:50 net_cls -> net_cls、net_prio drwxr-xr-x. 2 ルート ルート 0 3月25日 04:50 net_cls、net_prio lrwxrwxrwx. 1 ルート ルート 16 3月 25 04:50 net_prio -> net_cls、net_prio drwxr-xr-x. 2 ルート ルート 0 3月25日 04:50 perf_event drwxr-xr-x. 5 ルート ルート 0 3月25日 04:50 pids drwxr-xr-x. 5 ルート ルート 0 3月25日 04:50 systemd ディレクトリの内容はコマンドで表示されるものよりも多いことがわかります。これは、いくつかのソフトリンクファイルがあるためです。 # 次の 3 つはすべて cpu、cpuacct に属します CPU -> CPU、CPUacct cpuacct -> cpu、cpuacct CPU、CPUacct # 次の3つはすべてnet_cls、net_prioに属します net_cls -> net_cls、net_prio net_prio -> net_cls、net_prio ネット_cls、ネット_prio サブシステムが制御できるコンテンツは何を表していますか?
注意: 今のところ、コンテナ ハード ディスクのサイズを制限できるツールはありません。ハード ディスクの読み取りと書き込みの頻度のみを制限できます。 cgroupsの仕組みcgroup の CPU 制御のタスク ファイルを確認します。このファイルには、プロセスの CPU の制御が保存されています。CPU を制御するプロセスを追加する場合は、他のハードウェア リソースの制御も含めて、プロセスの pid をタスク ファイルに追加するだけです。 [root@localhost ~]# cat /sys/fs/cgroup/cpu/tasks 1 2 4 5 6 7 8 9 ... 68469 68508 68526 68567 実稼働環境では、カーネル内にあるため自動的に増加します。 cgroup の実際の動作原理はフックです。cgroup の実装は、基本的にシステム プロセスをフックすることです。タスク プロセスの実行中に特定のリソースが設計されると、フックに接続されたサブシステムがトリガーされ、リソース検出が実行されます。最後に、対応するテクノロジを使用して、さまざまなリソース カテゴリに応じてリソースを制限し、優先順位を割り当てます。 フックはどのように実装されていますか? 簡単に言うと、Linux でタスク プロセスを管理するためのデータ構造は、cgroup 内の各タスクにキーワードを設定し、そのキーワードをポインターと呼ばれるフックにポイントします。 タスクが 1 つのポインタ構造のみに対応する場合、ポインタ構造は複数のタスクで使用できます。 ポインタが固有のポインタ データの内容を読み取ると、タスクがトリガーされ、リソース制御を実行できるようになります。 実際の使用では、ユーザーはマウントを使用してcgroupコントロールグループをマウントする必要があります。 ディレクトリでは、例えばhttpdプログラムのpid番号が69060であることがわかります。 [root@localhost ~]# yum -y httpd^C をインストールします [root@localhost ~]# systemctl start httpd^C [root@localhost ~]# netstat -anput | grep 80 tcp6 0 0 :::80 :::* 69060/httpdをリッスン pid ディレクトリ内のマウント ファイルを確認します。このファイルには、多数の cgroup マウントが含まれています。 各 cgoup の背後にあるディレクトリ ( [root@localhost ~]# cat /proc/69060/mounts ルートfs / ルートfs rw 0 0 /dev/mapper/centos-root / xfs rw、seclabel、relatime、attr2、inode64、noquota 0 0 devtmpfs /dev devtmpfs rw、seclabel、nosuid、サイズ=914476k、nr_inodes=228619、モード=755 0 0 tmpfs /dev/shm tmpfs rw、seclabel、nosuid、nodev 0 0 devpts /dev/pts devpts rw、seclabel、nosuid、noexec、relatime、gid=5、mode=620、ptmxmode=000 0 0 mqueue /dev/mqueue mqueue rw、seclabel、relatime 0 0 hugetlbfs /dev/hugepages hugetlbfs rw、seclabel、relatime 0 0 ... cgroup /sys/fs/cgroup/systemd cgroup rw、seclabel、nosuid、nodev、noexec、relatime、xattr、release_agent=/usr/lib/systemd/systemd-cgroups-agent、name=systemd 0 0 cgroup /sys/fs/cgroup/net_cls、net_prio cgroup rw、seclabel、nosuid、nodev、noexec、relatime、net_prio、net_cls 0 0 cgroup /sys/fs/cgroup/freezer cgroup rw、seclabel、nosuid、nodev、noexec、relatime、freezer 0 0 cgroup /sys/fs/cgroup/hugetlb cgroup rw、seclabel、nosuid、nodev、noexec、relatime、hugetlb 0 0 cgroup /sys/fs/cgroup/cpu、cpuacct cgroup rw、seclabel、nosuid、nodev、noexec、relatime、cpuacct、cpu 0 0 cgroup /sys/fs/cgroup/cpuset cgroup rw、seclabel、nosuid、nodev、noexec、relatime、cpuset 0 0 cgroup /sys/fs/cgroup/devices cgroup rw、seclabel、nosuid、nodev、noexec、relatime、devices 0 0 cgroup /sys/fs/cgroup/memory cgroup rw、seclabel、nosuid、nodev、noexec、relatime、memory 0 0 cgroup /sys/fs/cgroup/blkio cgroup rw、seclabel、nosuid、nodev、noexec、relatime、blkio 0 0 cgroup /sys/fs/cgroup/pids cgroup rw、seclabel、nosuid、nodev、noexec、relatime、pids 0 0 cgroup /sys/fs/cgroup/perf_event cgroup rw、seclabel、nosuid、nodev、noexec、relatime、perf_event 0 0 ... これは、cgroup が mount によって制御される方法です。すべてのプログラムがこのようになっています。サブシステム上のすべてのシステムがファイルをマウントした後、権限管理やサブファイルシステムなど、オペレーティングシステムのように cgroup と階層ツリーを管理できます。cgroup ファイルシステムに加えて、カーネルは cgroup アクセスに対して他の操作を提供しません。cgroup を操作する場合は、mount を使用して cgroup 制御グループにハングする必要があります。 リソース制御操作各ハードウェア リソースを制御する方法を知る必要があります。 のように: cgroupグループのcpuディレクトリ内の各項目の具体的な意味は、cpuの具体的な制御の詳細です。 [root@localhost ~]# cd /sys/fs/cgroup/cpu [root@localhost cpu]# ls cgroup.clone_children cpuacct.stat cpu.cfs_quota_us cpu.stat system.slice cgroup.event_control cpuacct.usage cpu.rt_period_us machine.slice タスク cgroup.procs cpuacct.usage_percpu cpu.rt_runtime_us notification_on_release user.slice cgroup.sane_behavior cpu.cfs_period_us cpu.shares リリースエージェント これらの具体的な使用方法については、次の記事で一つずつ説明します。 Docker コマンドラインの制限-c/--cpu-shares: CPU 優先度を制限 -m/--memory: メモリ使用量を制限 --memory-swap: メモリ + スワップのサイズを制限 --blkil-weight bps/iops --デバイス読み取りbps --デバイス書き込みbps --デバイス読み取りIOPS --デバイス書き込みIOPS 具体的な使用法: CPU、メモリ、blkio cgroupのディレクトリ構造は次のようになります 特定のハードウェアリソースのデフォルトの非Dockerプロセス制御は dockerによって生成されたコンテナの制御は Docker のコア原則である Cgroup の詳細説明はこれで終了です。Docker のコア原則についてさらに詳しく知りたい方は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: CSSを使用して複数の画像を中央に水平に表示する方法
基本構造:コードをコピーコードは次のとおりです。 <ダウンロード> <dt>...
PS: 最近、nginx を詳細に紹介している <<High-Performance ...
上の境界線のみを表示する <table frame=above>下の境界線のみを表示する...
目次テクノロジースタックバックエンドビルドAPIフロントエンドウェブ構築ゲートウェイ建設ゲートウェイ...
目次背景質問問題分析と解決策新たな問題問題分析と解決策背景node-schedule スケジュール ...
タイマー効果: <div> <font id='timeCount'...
操作については、こちらの公式ドキュメントを参照してください。インストール1. 古いバージョンの do...
目次1. はじめに2. Viteプロジェクトを作成する1. viteをインストールする2. プロジェ...
WeChatアプレットの簡単な計算機は参考用です。具体的な内容は次のとおりです。 1. はじめに1....
Linux ヘルプ ドキュメントでの echo の説明は、Python や Java などのプログラ...
書き順の重要性ブラウザのリフローを減らし、ブラウザのDOMレンダリングパフォーマンスを向上させる①:...
Linux で最も一般的に使用される重要なユーティリティの 1 つである Sudo は、ほぼすべての...
1. 記事タイトルリストの右側に日付を表示する方法:コードをコピーコードは次のとおりです。 &l...
目次1. 元の値と参照値2. インスタンス3. 範囲1. 元の値と参照値6 つの単純なデータ型の値は...
#docker ps チェック、すべてのポートがマップされています コンテナID イメージ コマンド...