目次
6. Docker が占有しているディスク領域をクリアします。
1. cgroup の概要
Cgroups は Linux カーネルによって提供されるメカニズムで、単一プロセスまたは複数のプロセスによって使用されるリソースを制限できます。CPU やメモリなどのリソースをきめ細かく制御できます。現在、人気が高まっている軽量コンテナ Docker は cgroups を使用します。 CPU、メモリ、その他の部分のリソース制御を完了するための制限機能が提供されます。
さらに、開発者は、cgroup によって提供されるきめ細かい制御機能を使用して、特定のプロセスまたは特定のプロセス グループのリソース使用量を制限することもできます。たとえば、フロントエンド Web サービスとバックエンド コンピューティング モジュールの両方を展開する 8 コアのサーバーでは、cgroup を使用して、Web サーバーがコアのうち 6 つだけを使用するように制限し、残りの 2 つのコアをバックエンド用に残すことができます。コンピューティングモジュール。
cgroup の 4 つの主な機能:
- リソース制限: タスクで使用されるリソースの合計量を制限できます。
- 優先順位の割り当て: 割り当てられた CPU タイム スライスの数とディスク IO 帯域幅のサイズによって、実際にはタスク実行の優先順位を制御するのと同等になります。
- リソース統計: CPU 使用時間、メモリ使用量など、システムのリソース使用量をカウントできます。
- タスク制御: cgroup はタスクの一時停止や再開などの操作を実行できます。
2. CPUタイムスライスの概念
タイム スライスは CPU によって各プログラムに割り当てられる時間であり、各スレッドにはタイム スライスと呼ばれる期間、つまりプロセスの実行が許可される時間が割り当てられるため、さまざまなプログラムが実行されているように見えます。同じ時間です。タイム スライスの終了時にプロセスがまだ実行中の場合、CPU は奪われ、別のプロセスに割り当てられます。タイム スライスが終了する前にプロセスがブロックまたは終了した場合、CPU はすぐに切り替わります。CPU リソースを無駄に消費することはありません。
巨視的: 複数のアプリケーションを同時に開くことができ、各プログラムは並行して実行され、同時に実行されます。しかし、ミクロレベルでは: CPU は 1 つしかないため、一度にプログラムの要件の一部しか処理できません。公平性をどのように処理するかというと、1 つの方法はタイム スライスを導入し、各プログラムを順番に実行することです。
3. CPU使用量の制限
1. CPU使用率の上限を設定する
Linux は CFS (Completely Fair Scheduler、Completely Fair Scheduler) を使用して、各プロセスによる CPU の使用をスケジュールします。CFS のデフォルトのスケジューリング期間は 100ms です。
各コンテナー プロセスのスケジューリング サイクルと、このサイクル中に各コンテナーが最大で使用できる CPU 時間を設定できます。
ノート:
--cpu-period を使用してスケジューリング期間を設定し、 --cpu-quota を使用してコンテナが各期間で使用できる CPU 時間を設定します。この 2 つは一緒に使用できます。
CFS 周期の有効範囲は 1ms ~ 1s で、--cpu-period の対応する値の範囲は 1000 ~ 1000000 (マイクロ秒単位) です。
コンテナーの CPU クォータは 1ms 未満であってはなりません。つまり、--cpu-quota の値は 1000 以上である必要があります。
コンテナーのデフォルトの CPU 使用量制限を表示する
ストレステストを行う
コンテナ作成時のCPU使用時間制限を設定する
既存のコンテナの CPU 制限
/sys/fs/cgroup/cpu/docker/container id/cpu.cfs_quota_us ファイルを直接変更するだけです
2. CPUリソース使用率を設定する
コンテナを2つ作成し、CPUリソース使用率を設定する
注: Docker は --cpu-shares を通じて CPU シェアを指定します。デフォルト値は 1024 で、値は 1024 の倍数です。
圧力試験のために2つの容器を別々に入れてください
コンテナの実行ステータスを表示し、CPU 使用率を観察します。
4. メモリ使用量の制限
1. コンテナが使用できる最大メモリを制限する
docker run -itd --name tan3 -m 512m centos:7 /bin/bash
#-m(--memory=)选项用于限制容器可以使用的最大内存
2. コンテナーで使用できるスワップ サイズを制限する
docker run -itd --name tan3 -m 512m --memory-swap=1g centos:7 bash
#限制可用的swap 大小,--memory-swap
注:--memory-swap是必须要与 --memory(或-m)一起使用的
正常情况下, --memory-swap 的值包含容器可用内存和可用swap
所以 -m 512m --memory-swap=1g 的含义为:容器可以使用512M 的物理内存,并且可以使用512M (1G - 512M)的swap
设置为0或者不设置,则容器可以使用的 swap 大小为 -m 值的两倍。
如果 --memory-swap 的值和 -m 值相同,则容器不能使用swap。
如果 --memory-swap 值为 -1,它表示容器程序使用的内存受限,而可以使用的swap空间使用不受限制(宿主机有多少swap 容器就可以使用多少)
5. ディスクIO構成制御(blkio)の制限事項
--device-read-bps: デバイスの読み取り速度 bps (データ量) を制限します。単位は kb、mb (M)、または gb です。
--device-write-bps : 特定のデバイスの書き込み速度 bps (データ量) を制限します。単位は kb、mb (M)、または gb です。
--device-read-iops : デバイスを読み取るための iops (回数) を制限します。
--device-write-iops : 特定のデバイスに書き込まれる iops (回数) を制限します。
1.書き込み速度を制限せずにコンテナを作成する
docker run -it --name tt1 centos:7 /bin/bash
#创建容器tt1,不限制写入速度
dd if=/dev/zero of=/opt/test.out bs=10M count=5 oflag=direct
#通过dd来验证写速度,拷贝50M的数据
2. コンテナを作成し、書き込み速度を制限する
docker run -it --name tt2 --device-write-bps /dev/sda:1mb centos:7 bash
#创建容器,并限制写入速度为1MB/s
6. Docker が占有しているディスク領域をクリアします。
docker system prune -a
#用于清理磁盘,删除关闭的容器、无用的数据卷和网络
7. まとめ
1. CPUのパラメータを制限する
docker run -cpu-period #设置调度周期时间1000~1000000
-cpu-quota #设置容器进程的CPU占用时间,要与调度周期时间成比例
--cpu-shares #设置多个容器之间的CPU资源占用比
--cpuset-cpus #绑核(第一个CPU编号从0开始)
2. メモリの制限
-m 物理内存 [--memory-swap=总值]
3. ディスク IO の制限
--device-read-bps 设备文件:1mb/1M #限制读速度
--device-write-bps 设备文件:1mb/1M #限制写速度
--device-read-iops #限制读次数
--device-write-iops #限制写次数
docker system prune -a #清理磁盘,删除关闭的容器、无用的数据卷和网络。