自宅の NAS で 98 本のコンテナを動かしています。
「そんなに動かしてメモリは大丈夫なのか」とよく聞かれるので、実際に測りました。
結論
- 1 本あたりのメモリは中央値 39.3 MB / 平均 272.3 MB。
6.9 倍ずれます - 98 本のうち 89 本が 128MB 未満
- 合計 26.1 GB のうち、上位 3 本だけで 20.3 GB(77.8%)
つまり「本数を減らす」はほぼ効きません。効くのは特定の 3 本だけです。
平均が中央値の 6.9 倍になるのは、上位数本が桁違いに大きいからです。
平均で語ると判断を間違えます。「100 本動かしている」と聞いて想像するのは平均のほうですが、
実際は大半が数十 MB で、重いのはいつも同じ数本です。
メモリの上限を掛けていないコンテナが 67 本ある
98 本のうち 67 本は上限を設定していません。
それでも破綻していないのは、上限なしのコンテナが実際には数十 MB しか使っていないからです。
上限は「危ない数本」に掛ければ足りる、というのが実測から言えることです。
詰まり具合は「たまに重い」ではなく常態
この機体で効いているのはメモリより I/O でした。
/proc/pressure/io の full は「全タスクが I/O 待ちで完全に止まっていた割合」です。
直近で 13.9%。体感の「たまに固まる」ではなく、常時この割合で止まっています。
測り方(自分のサーバーでもできます)
特別な権限は要りませんでした。
-
コンテナの中からホストの
/proc/pressureと/proc/meminfoがそのまま見えます。
--privilegedも/procのマウントも要りません - コンテナごとの数字は Docker API の
/containers/<id>/stats?stream=false&one-shot=true。
one-shotを付けないと Docker が 1 本ごとに約 1 秒待つので、98 本で 98 秒かかります。
付ければ待たない代わりに CPU 割合が空で返るので、前回との差を自分で取ります - メモリの「作業実体」は
usage - stats.cache(docker 本体と同じ勘定)
この計測そのものの重さは 1 周 257 ms(最大 331 ms)・
常駐 14MB 弱でした。15 分に 1 回動かしています。
観測のために対象を重くしていないことは、測る側も測っておくべきだと思います。
自宅サーバーの実測を続けて書いています → https://lab.syutonton.com

