web-dev-qa-db-ja.com

Dockerの総リソースを制限する方法は?

Dockerからアクセスできるリソースの合計を制限しようとしています(たとえば、RAMとCPUの1500%のみ)。CPUとRAMコンテナを起動するときに制限をかけます。そのため、Dockerコンテナで使用できるリソースの合計を制限する必要があります。

最大のCPUとメモリを消費できるが、同時には使用できない約20のコンテナがあるため、CPUを設定できず、RAM=制限です。そのため、ドッカー

まず、スライスを作成しました。上記の手順を試しましたが、RAMとCPU使用率の両方を制限することは不可能です。

# /etc/systemd/system/docker_limit.slice
[Unit]
Description=Slice that limits docker resources
Before=slices.target

[Slice]
CPUAccounting=true
CPUQuota=700%
#Memory Management
MemoryAccounting=true
MemoryHigh=20G
MemoryMax=25G
MemoryMaxSwap=10G

そして私のdaemon.json

{
  "insecure-registries" : [ "url1", "url2"],
  "cgroup-parent": "docker_limit.slice"
}

しかし、私がコンテナからしようとすると:

stress --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1

Ramの111Go(サーバーの全容量)を使用しているdocker statsから確認できます

stress --cpu 16

私はそれが1600%近くを使用しているDocker統計から見ることができます(私のサーバーの全容量)

私は何かを逃したと思いますが、私は何を知りません

8
Leletir

cgroup_parent/etc/docker/daemon.jsonの前に/を付けると、cgroup名は絶対名になります。それ以外の場合、dockerはコンテナーをデーモンのcgroupのサブcgroupに配置します。

{
    "cgroup-parent": "/docker_limit.slice"
}

/がない場合、システムによっては、コンテナが/system.slice/containerd.service/docker_limit.sliceまたは同様の形式になる可能性があります。

systemd-cgtopまたはsystemd-cglsは、物事がどこで実行されたかを確認するために使用できます。

3
rwos

この質問に対する完全な回答が必要な他の人のために、私は完全な要約をしています:

まず、docker_limitというスライスを作成しました。

  1. /etc/systemd/system/docker_limit.sliceにファイルを作成します
Description=Slice that limits docker resources
Before=slices.target

[Slice]
CPUAccounting=true
CPUQuota=700%
#Memory Management
MemoryAccounting=true
MemoryLimit=25G
  1. 開始単位:systemctl start docker_limit

  2. 編集/etc/docker/daemon.json

{
  "cgroup-parent": "/docker_limit.slice"
}
  1. Dockerデーモンを再起動します:systemctl restart docker

すべての作品が期待どおりに動作することを確認するために、systemd-cgtopのプロセスが次のように表示されます:/ docker_slice

@rwosへのクレジット

1
Leletir

私はVM 1 CPUおよび2GBを使用していますRAM(スワップ無効)。
そのため、次のパラメータでスライスを作成しました:

# cat /etc/systemd/system/docker_limit.slice
[Unit]
Description=Slice that limits docker resources
Before=slices.target

[Slice]
CPUAccounting=true
CPUQuota=90%
MemoryAccounting=true
MemoryHigh=1G
MemoryMax=1.2G

そして、デーモンのネイティブcgroupdriverを除いて、文字通りあなたと同じものを作りました:

# cat /etc/docker/daemon.json 
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "cgroup-parent": "docker_limit.slice"
}

それから私はドッカーコンテナを実行しました:

docker run --name stress-test -d ubuntu:18.04 sleep 10000

2つのウィンドウでVMを開きました。最初のウィンドウではstressを実行しました。2番目のウィンドウではdocker stats commandを実行しました。CPUは約90%でした。 +-(htopはこれを確認し、最大91%のスパイクを確認しました)、RAMが1.2Gに近づいたとき、このプロセスは次のメッセージで終了しました:

# stress --cpu 1 --vm 1 --vm-bytes 1300M
stress: info: [334] dispatching hogs: 1 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [334] (415) <-- worker 336 got signal 9
stress: WARN: [334] (417) now reaping child worker processes
stress: FAIL: [334] (451) failed run completed in 4s
1
Artem Matyhin