Linux
kernel
docker
cgroups
namespace

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 割り当てだったりリソースの割り当てが
どのように行われているかの概要だけでもつかめたので個人的には満足。

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