8
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

プログラミング研究会Tech.UniAdvent Calendar 2022

Day 12

Dockerでのcgroupの利用について

Last updated at Posted at 2022-12-30

はじめに

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に詳しくなりたいです。

参考文献

8
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?