処理中にDockerコンテナが終了する理由を理解する必要があります。
簡単な背景:
RHシステムでパフォーマンステストを実行しています。 (マシンには64GBのRAM、16個のCPUがあります。)約20時間実行した後、コンテナはカーネルによってシャットダウンされます。
コンテナ内でJavaを実行しており、ヒープ制限は20 GBです。 (Elasticsearchでファイルをインデックス化するのは難しいプロセスです。)
また、ps-eFを使用してdocker内のメモリ消費量を監視し、Glowrootを使用してヒープサイズを監視します。
最大ヒープサイズプロセスが終了する前は6.7GBでした。
ps-eF見せるRSS16977356(1.7GB)です。
dmesg 出力は次のようになります。
[Mon Nov 12 08:44:10 2018] [ pid ] uid tgid total_vm rss nr_ptes swapents oom_score_adj name
[Mon Nov 12 08:44:11 2018] [ 3406] 0 3406 7811475 4240564 8512 0 0 java
[Mon Nov 12 08:44:11 2018] Out of memory: Kill process 3406 (java) score 264 or sacrifice child
[Mon Nov 12 08:44:11 2018] Killed process 3406 (java) total-vm:31245900kB, anon-rss:16962256kB, file-rss:0kB, shmem-rss:0kB
正しく理解したら総仮想マシン処理され使用されたすべてのRAMを示します。匿名RSSプロセスが終了します。これは、マイコンピュータに25GBの空きメモリが必要であることを意味します。
答え1
メモリ
メモリ不足のリスクを理解する
実行中のコンテナがあまりにも多くのホストメモリを消費しないようにすることが重要です。 Linuxホストでは、カーネルは重要なシステム機能を実行するのに十分なメモリがないことを検出すると、Out of Memory Exception(OOME)を発生させ、メモリを解放するためにプロセスを終了し始めます。 Dockerやその他の重要なアプリケーションを含むすべてのプロセスが終了します。誤ったプロセスが終了すると、システム全体がハングする可能性があります。
(...)
メモリへのコンテナアクセスの制限
-m or --memory= The maximum amount of memory the container can use. If you set this option, the minimum allowed value is 4m (4 megabyte).
源泉:
https://docs.docker.com/config/containers/resource_constraints/#memory