Edited at

Dockerの実装確認 - cgroups編 -

Q9jiI1pL_400x400.jpg


背景

カーネルにはコンテナという機能はなく、

Dockerはカーネルの機能の組み合わせで実装されている。

その中でも主要なものが「cgroups」と「namespace」である。

今回はcgroupsについて調べてみたことを記載します。


cgroupsって?

cgroupsは control groups の略でタスクをグループ化したり、

そのグループ内のタスクに対して様々なリソース制御を行うための仕組みです。

namespaceとの違いは名前空間の制御ではなくCPUやメモリといった物理的なリソースを

制御する機能である点。

具体的には各コンテナに対するCPU時間の割り当て優先度や、メモリ使用量、

データ転送に伴う帯域などを調整している。


大正義wikipedia様より引用

ちょっと正確に知りたい方用へcgroupsについて引用


cgroups (control groups) とは、プロセスグループのリソース(CPU、メモリ、ディスクI/Oなど)の利用を制限・隔離するLinuxカーネルの機能。"process containers" という名称で Rohit Seth が2006年9月から開発を開始し[1]、2007年に cgroups と名称変更され、2008年1月に Linux カーネル 2.6.24 にマージされた[2]。それ以来、多くの機能とコントローラが追加された。



実際に制御可能なリソース

/sys/fs/cgroup 以下に仮想的なファイルシステムとしてのインタフェースが提供されています.

ここでファイル/ディレクトリ操作をすることで様々なリソース制御を行います。

$ ls -l /sys/fs/cgroup/

total 0
dr-xr-xr-x 6 root root 0 Nov 3 2016 blkio
lrwxrwxrwx 1 root root 11 Nov 3 2016 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 Nov 3 2016 cpuacct -> cpu,cpuacct
dr-xr-xr-x 6 root root 0 Nov 3 2016 cpu,cpuacct
dr-xr-xr-x 3 root root 0 Nov 3 2016 cpuset
dr-xr-xr-x 6 root root 0 Nov 3 2016 devices
dr-xr-xr-x 3 root root 0 Nov 3 2016 freezer
dr-xr-xr-x 6 root root 0 Nov 3 2016 memory
dr-xr-xr-x 3 root root 0 Nov 3 2016 net_cls
dr-xr-xr-x 6 root root 0 Nov 3 2016 systemd

これらはサブシステムと呼ばれています。

それぞれについては下記をご参照ください。

サブシステム
概要

blkio
ブロックデバイスの入出力

cpu
CPUリソースの割り当て・制限

cpuacct
タスクが消費するCPU時間をレポート

cpuset
グループへのCPU,メモリノードの割り当て

devices
デバイスへのアクセス制限

freezer
グループに属するプロセスの一時停止/再開

hugetlb
cgroupからのhugetlbの使用

memory
タスクが消費するメモリリソースのレポートと制限

perf_event
cgroup単位でのperfツールの使用


cgroupの実装

実際にコードを読もう!って思ったのですが特にやる気が起きませんでしたので割愛

読むとしたら


  • kernel/cgroup/cgroup.c

  • security/device_cgroup.c

  • mm/hugetlb_cgroup.c

あたりでしょうか(詳しい方教えてください)


ちょっとだけ詳しく

Linux のプロセスは、task_struct 構造体というデータ構造で表現されている。

その構造体のメンバである「css_set」がcgroupを管理するための構造体。


include/linux/sched.h

#ifdef CONFIG_CGROUPS

/* Control Group info protected by css_set_lock */
struct css_set __rcu *cgroups;
/* cg_list protected by css_set_lock and tsk->alloc_lock */
struct list_head cg_list;
#endif

この構造体を追っていけば処理は見えそうです。(追いませんが)


まとめ

dockerで実装されているcpu 割り当てだったりリソースの割り当てが

どのように行われているかの概要だけでもつかめたので個人的には満足。

これ以上は深入りしない(できない)