[Linux] Cgroups リソースの制限

1. Cgroup の概要

Cgroup とは何ですか?

Cgroupsとはコントロールグループの略で、プロセスグループ(プロセスグループ)が使用する物理リソース(CPU、メモリ、IOなど)を制限、記録、隔離できるLinuxカーネルが提供する仕組みです。これはもともと Google のエンジニアによって提案され、後に Linux カーネルに統合されました。cgroup は、LXC が仮想化を実装するために使用するリソース管理方法でもあり、cgroup なしでは LXC は存在しないと言えます。

Cgroups では何ができるのでしょうか?

Cgroups の最初の目標は、リソース管理のための統一フレームワークを提供することです。これは、cpuset などの既存のサブシステムを統合するだけでなく、将来の新しいサブシステムの開発のためのインターフェイスも提供します。今日の cgroups は、単一プロセスのリソース制御からオペレーティング システム レベルの仮想化 (OS レベルの仮想化) の実現まで、さまざまなアプリケーション シナリオに適しています。Docker は、コンテナーによって使用されるリソース クォータの制御にも Cgroups を使用します。Cgroup は次の機能を提供します。

  • プロセスグループが使用できるリソースの数を制限します(リソース制限)。例: メモリ サブシステムはプロセス グループのメモリ使用量制限を設定できますが、プロセス グループによって使用されるメモリが制限に達し、メモリが適用されると、OOM (メモリ不足) が発生します。
  • プロセスグループの優先制御(Prioritization)。たとえば、CPU サブシステムを使用して、特定の CPU 共有をプロセス グループに割り当てることができます。
  • プロセス グループ (アカウンティング) によって使用されるリソースの数を記録します。例: cpuacct サブシステムを使用して、プロセス グループによって使用された CPU 時間を記録できます。
  • プロセスグループの分離 (Isolation)。たとえば、ns サブシステムを使用すると、異なるプロセス グループが異なる名前空間を使用して分離を実現でき、異なるプロセス グループには独自のプロセス、ネットワーク、およびファイル システムのマウント スペースがあります。
  • プロセスグループ制御(Control)。たとえば、フリーザー サブシステムを使用してプロセス グループを一時停止および再開できます。

Cgroups 関連の概念とその関係

  • 関連概念
    1. タスク。cgroups では、タスクはシステムのプロセスです。
    2. 対照群。コントロール グループは、特定の基準に従って分割されたプロセスのグループです。Cgroups におけるリソース制御はコントロールグループ単位で実現されます。プロセスはコントロール グループに参加し、あるプロセス グループから別のコントロール グループに移行できます。プロセスグループ内のプロセスは、cgroups によって制御グループ単位で割り当てられたリソースを使用でき、cgroups によって制御グループ単位で設定された制限に従います。
    3. 階層。コントロール グループは、コントロール グループ ツリーである階層形式に編成できます。コントロール グループ ツリー上の子ノード コントロール グループは、親ノード コントロール グループの子であり、親コントロール グループの特定の属性を継承します。
    4. サブシステム(サブシステム)。サブシステムはリソース コントローラーであり、たとえば、CPU サブシステムは CPU 時間の割り当てを制御するコントローラーです。サブシステムが機能するには、レベルに接続する必要があります。サブシステムが特定のレベルに接続されると、このレベルのすべての制御グループがこのサブシステムによって制御されます。
  • 相互関係
    1. システムに新しいレベルが作成されるたびに、システム内のすべてのタスクがそのレベルのデフォルトの cgroup (ルート cgroup と呼びます) になります。この cgroup はレベルの作成時に自動的に作成され、後で で作成されます。レベル。cgroup はすべてこの cgroup の子孫です) が初期メンバーです。
    2. サブシステムは最大 1 つのレベルにのみ接続できます。
    3. 複数のサブシステムを 1 つのレベルに接続できます
    4. タスクは複数の cgroup のメンバーになることができますが、これらの cgroup は異なるレベルにある必要があります。
    5. システム内のプロセス (タスク) が子プロセス (タスク) を作成すると、子タスクは自動的に親プロセスが存在する cgroup のメンバーになります。サブタスクは必要に応じて別の cgroup に移動できますが、最初は常に親タスクの cgroup を継承します。

2. Cgroups サブシステムの概要

blkio このサブシステムは、物理デバイス (ディスク、SSD、USB など) などのブロック デバイスの入出力制限を設定します。
cpu このサブシステムは、スケジューラを使用して cgroup タスクから CPU へのアクセスを提供します。
cpuacct このサブシステムは、cgroup 内のタスクによって使用される CPU に関するレポートを自動的に生成します。
cpuset このサブシステムは、独立した CPU (マルチコア システム上) とメモリ ノードを cgroup 内のタスクに割り当てます。
devices このサブシステムは、cgroup 内のタスクによるデバイスへのアクセスを許可または拒否します。
フリーザー このサブシステムは、cgroup 内のタスクを一時停止または再開します。
このサブシステムは、cgroup 内のタスクによって使用されるメモリに制限を設定し、それらのタスクによって使用されるメモリ リソースに関するレポートを自動的に生成します。
net_cls このサブシステムは、ネットワーク パケットにクラス識別子 (classid) をマークし、Linux フロー制御プログラム (tc) が特定の cgroup から生成されたパケットを識別できるようにします。
ns 名前空間サブシステム。

3 つの文を理解する
1) 単一のサブシステムは最大 1 つのレベルに接続できます。
2) 単一のレベルを 1 つ以上のサブシステムに接続できます。例: cpuset cpu メモリは cpu_and_memory 層に接続されます。 3)
新しいレベルが作成されるたびに、システム内のすべてのプロセスがデフォルトの CGroup の初期メンバーになります。そのレベルの。作成された単一の階層では、システム内の各プロセスは、その階層内の唯一の CGroup のメンバーになることができます。1 つのプロセスが複数の CGroup に存在できる場合は、各 CGroup が同じレベルに存在しないことを確認してください。同じレベルで競合が発生した場合、プロセスは 2 番目の CGroup のメンバーとして、最初の CGroup から自身を削除します。

3.cgroupsのインストール

1.cgroupをインストールする

[root@localhost ~]# yum -y install libcgroup

2. 開始する前に cgroup の階層マウントを確認します。

[root@localhost ~]# lssubsys           #显示为空

3.cgroupを起動します

[root@localhost ~]# /etc/init.d/cgconfig start
Starting cgconfig service:                                 [确定]

4. インストールの確認

#启动成功后再次执行
[root@localhost ~]# lssubsys
cpuset
cpu
cpuacct
memory
devices
freezer
net_cls
blkio

#查看挂载情况
[root@localhost ~]# lssubsys -am   显示挂载情况
ns
perf_event
net_prio
cpuset /cgroup/cpuset
cpu /cgroup/cpu
cpuacct /cgroup/cpuacct
memory /cgroup/memory
devices /cgroup/devices
freezer /cgroup/freezer
net_cls /cgroup/net_cls
blkio /cgroup/blkio

#cgroup 目录不在为空
[root@localhost ~]# ls /cgroup/
blkio  cpu  cpuacct  cpuset  devices  freezer  memory  net_cls

5. 設定ファイル

/etc/cgconfig.conf   定义挂载子系统

3. プロセスリソースの使用を制限する

1. cgroupグループ管理

新しいグループを作成します。
mkdir /cgroup/cpu/baism_test
または
[root@localhost opt]# cgcreate -g memory:/baism_test コマンドを使用して、メモリ グループの下にグループ baism_test を作成します。

グループの削除
[root@localhost opt]# cgdelete -r cpu:/baism_test グループの削除 cpu/baism_test

2. グループリソース適用閾値を設定する

2.1. プロセスによる CPU の使用を制限する
[root@localhost opt]# echo 50000 > /cgroup/cpu/baism_test/cpu.cfs_quota_us    设置进程使用CPU的百分比是50%

CPU設定を確認する

#方法一
创建一个跑CPU的进程 use_cpu.sh
#!/bin/bash
x=0
echo "current_process_number is : $$"

while [ True ];do
    x=$x+1
done

将该进程的进程号加入资源分组baism_test
[root@localhost cgroup]# echo 5398 > /cgroup/cpu/baism_test/tasks     将运行的程序的进程号输入到task中就行   

#通过TOP查看进程使用CPU在合理范围内 结束程序后 进程从tasks中消失


#方法二 
使用cgexec命令对新启动的程序设置 限制
[root@localhost opt]# cgexec -g cpu:/baism_test /opt/use_cpu.sh
2.2. プログラムが使用するメモリを最大 1M 1048676 バイトに制限します。
[root@localhost cgroup]# echo 1048576 > memory/baism_test/memory.limit_in_bytes

メモリ制限を確認する

##将进程号加入资源分组
[root@localhost cgroup]# echo 5584 > memory/baism_test/tasks
or
开启任务的时候直接加入资源分组
[root@localhost opt]# cgexec -g memory:/baism_test /opt/use_memory.sh

可以看出 程序使用到最大的时候 就会被Kill掉
测试的时候  先运行程序在运行限制  就不会上来就是杀死状态了
2.3. プロセスの IO 使用制限を 1M に制限する

#リソースグループのIO制限を設定する

[root@localhost opt]# cgcreate -g blkio:/baism_test
[root@localhost opt]# echo '8:0 1048676' > /cgroup/blkio/baism_test/blkio.throttle.read_bps_device

IO制限を確認する

[root@localhost opt]#  dd if=/dev/sda of=/dev/null &
[1] 5615
[root@localhost opt]# echo 5615 > /cgroup/blkio/baism_test/tasks
[root@localhost opt]#

通过iotop可以看出 读取下降到了1M

おすすめ

転載: blog.csdn.net/qq_45277554/article/details/132025862