はじめに
Dockerはコンテナのリソース管理をするためにLinuxカーネルの機能であるcgroupを用いています。今回はcgroupについて解説しつつ、Dockerでどのように用いられているか確認します。
cgroupとは
cgroup(Control Group)は、Linuxカーネルの機能の1つで、システムリソース(CPU、メモリ、ディスクIO、ネットワークなど)を使用するプロセスをグループ化し、それぞれのグループに対してリソース使用量を制限することができるものです。
cgroupのコントローラー
cgroupはリソースごとにコントローラーが存在し、コントローラーはcgroupfsという特別なファイルシステムを介して使います。Ubuntu20.04では /sys/fs/cgroup
ディレクトリ以下に、各コントローラーに対応するcgroupファイルシステムがマウントされています。ファイルシステムは、ストレージデバイス上に存在するわけではなく、メモリ上にだけ存在し、アクセスするとカーネルのcgroup機能を使えるという仕組みになっています。
$ ls /sys/fs/cgroup
blkio cpu cpu,cpuacct cpuacct cpuset devices freezer hugetlb memory misc net_cls net_cls,net_prio net_prio perf_event pids rdma systemd unified
Dockerでの利用
Dockerでどのようにcgroupが使用されているか確認します。
CPU制限付きのコンテナの起動
CPU使用率が30%に制限付きのNginxコンテナを立ち上げます。
docker run --cpus 0.3 --name nginx -d -p 80:80 nginx
先ほど立ち上げたNginxコンテナのプロセスを確認します。docker top
コマンドを使いました。
$ docker top 109f9220afcc(CONTAINER ID)
UID PID PPID C STIME TTY TIME CMD
root 12199 12175 0 17:47 ? 00:00:00 nginx: master process nginx -g daemon off;
systemd+ 12248 12199 0 17:47 ? 00:00:00 nginx: worker process
Dockerが作成したcpuコントローラーのグループ
Dockerが新たにグループが作成していることが分かります。
$ ls /sys/fs/cgroup/cpu/docker
109f9220afcceff3245cb227beb164c21a25093c7f5300ca34b35d8474f66688
cpu.cfs_quota_us
ファイルの中身を確認すると30000となっておりCPU使用率が30%に制限するように設定しています。
$ cat /sys/fs/cgroup/cpu/docker/109f9220afcceff3245cb227beb164c21a25093c7f5300ca34b35d8474f66688/cpu.cfs_quota_us
30000
また、tasks
ファイルには立ち上げたNginxコンテナ関連のPIDが記述されています。これによってコンテナのCPU使用率を制限することができます。
$ cat /sys/fs/cgroup/cpu/docker/109f9220afcceff3245cb227beb164c21a25093c7f5300ca34b35d8474f66688/tasks
12199
12248
CPU使用率が制限されるのか
Nginxコンテナ内に入ってCPU使用率を上げてみます。
$ docker exec -it nginx bash
yesを連続で出力することでCPU負荷をかけます。
# yes > /dev/null
別でターミナルを開き、ホストOSにてtop
コマンドを使うと コンテナで実行しているプロセスのCPU使用率が制限されていることが分かります。
$ top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12725 root 20 0 2388 556 496 R 29.9 0.1 0:36.08 yes
さいごに
DockerはLinuxカーネルの機能であるcgroupを利用していることを確認できました。もっとDockerに詳しくなりたいです。
参考文献