困ったこと
- Docker コンテナの監視を設定したら Memory 使用量の監視が行われない
経緯
- Debian 8.1 に dd-agent をインストールした
- ホスト自体の CPU やメモリ等の基本的な監視を開始した
- docker integration を有効にした
- コンテナ数、コンテナの CPU 使用率のリソースは取得出来るが Memory 使用量が取れないことに気づく
- datadog のログには以下のようなログが吐かれていた
2015-08-21 10:47:38 JST | INFO | dd.collector | checks.docker(docker.py:466) | Can't open None/system.slice/docker-f54f5d40ae8190ed4c84c6007c801be8caf83ad26737a9ca376a1a850c7557c6.scope/memory.stat. Metrics for this container are skipped. 2015-08-21 10:47:38 JST | INFO | dd.collector | checks.docker(docker.py:466) | Can't open None/system.slice/docker-85bfb90a711c7ae491686e8731f43a1d3ca64e2baf5f813d5759cfeb3408305f.scope/memory.stat. Metrics for this container are skipped. 2015-08-21 10:47:57 JST | INFO | dd.collector | checks.docker(docker.py:466) | Can't open None/system.slice/docker-288bfe1cd050eef71eaab989d7b8cf1db077507e302bc59ab014de9b43e4274d.scope/memory.stat. Metrics for this container are skipped.
原因と対処
原因
- /sys/fs/cgroup 以下に memory がマウントされていない
- Ubuntu / Debian の場合にはデフォルトで memory controller はマウントされない FAQ でした
対処
- https://wiki.debian.org/LXC
- https://docs.docker.com/installation/ubuntulinux/#adjust-memory-and-swap-accounting
# /etc/default/grub を修正 $ diff -u /etc/default/grub.original /etc/default/grub --- /etc/default/grub.original 2015-08-21 10:46:41.828000000 +0900 +++ /etc/default/grub 2015-08-21 10:46:50.968000000 +0900 @@ -7,7 +7,7 @@ GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="quiet console=tty0 console=ttyS0,115200n8r" -GRUB_CMDLINE_LINUX="" +GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1" # Uncomment to enable BadRAM filtering, modify to suit your needs # This works with Linux (no patch required) and with any kernel that obtains # update-grub を実行 $ sudo update-grub # 再起動 $ sudo shutdown -r now
しばらくするとメモリの使用量も取得出来るようになった。
メモ
メモリコントローラを有効にするデメリット
Docker のドキュメントに以下のように記載されているのが気になる。
To prevent these messages, enable memory and swap accounting on your system. Enabling memory and swap accounting does induce both a memory overhead and a performance degradation even when Docker is not in use. The memory overhead is about 1% of the total available memory. The performance degradation is roughly 10%.
ざっくり意訳すると...
- Memory と Swap を計上する機能を有効にする必要がある
- 機能を有効にした場合にはメモリのオーバーヘッドとパフォーマンス低下が発生する
- オーバーヘッドはメモリ容量(使用可能な)の約 1 %
- 性能低下は約 10 %
とのこと。
なぜ...
- デフォルトでメモリコントローラが無効になっているのかが気になる
以上。