Docker 起動時の ES メモリ オーバーフローの解決方法

Docker 起動時の ES メモリ オーバーフローの解決方法

jvm.options ファイルを elasticsearch 構成に追加し、スタック サイズを変更します (デフォルトは 2 GB)。次に、es を直接起動して、構成ファイルが以前にマッピングされていることを確認します。

-Xms5g
-Xmx5g

完全な jvm.options ファイルは次のとおりです。

## JVM 構成
################################################################
## 重要: JVM ヒープサイズ
################################################################
##
## 常に最小および最大のJVMヒープを設定する必要があります
## サイズを同じ値に設定します。たとえば、
## ヒープを 4 GB に設定するには、次のように設定します。
##
## -Xms4g
## -Xmx4g
##
## https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html を参照してください
## 詳細は
##
################################################################
# Xmsはヒープスペース全体の初期サイズを表します
# Xmxはヒープスペース全体の最大サイズを表します
-Xms5g
-Xmx5g
################################################################
## エキスパート設定
################################################################
##
## このセクション以下のすべての設定は
## エキスパート設定。
## 自分が何をしているのか理解している
##
################################################################
## GC 構成
-XX:+ConcMarkSweepGC を使用する
-XX:CMS開始占有率=75
-XX:+CMS 占有開始のみを使用する
## 最適化
# 初期化中に JVM が使用する事前タッチ メモリ ページ
-XX:+常にプリタッチ
## 基本
# サーバー VM を強制します (32 ビット クライアント JVM では削除)
-サーバ
# スタックサイズを明示的に設定します(32ビットクライアントJVMでは320kに減らします)
-Xss1m
# 念のためヘッドレスに設定
-Djava.awt.headless=true
# デフォルトで UTF-8 エンコードを使用するようにします (例: ファイル名)
-Dfile.encoding=UTF-8
# システムのJNAではなく、常に弊社が提供するJNAを使用してください
-Djna.nosys=true
# JDK9 では古い形式のファイル権限を使用する
-Djdk.io.permissionsUseCanonicalPath=true
# Netty を設定するためのフラグ
-Dio.netty.noUnsafe=true
-Dio.netty.noKeySetOptimization=true
-Dio.netty.recycler.スレッドあたりの最大容量=0
# ログ4j 2
-Dlog4j.shutdownHookEnabled=false
-Dlog4j2.disable.jmx=true
-Dlog4j.skipJansi=true
## ヒープダンプ
# Javaヒープからの割り当てが失敗したときにヒープダンプを生成します
# ヒープダンプはJVMの作業ディレクトリに作成されます
-XX:+メモリ不足エラー時のヒープダンプ
# ヒープダンプの代替パスを指定する
# ディレクトリが存在し、十分なスペースがあることを確認する
#-XX:HeapDumpPath=${heap.dump.path}
## GC ログ
#-XX:+GC詳細を印刷
#-XX:+GCタイムスタンプを印刷
#-XX:+PrintGCDateStamps
#-XX:+PrintClassヒストグラム
#-XX:+印刷テンリング配布
#-XX:+PrintGCアプリケーション停止時間
# GCステータスをタイムスタンプ付きでファイルに記録する
# ディレクトリが存在することを確認する
#-Xloggc:${loggc}
# デフォルトでは、GC ログ ファイルはローテーションされません。
# 以下の行のコメントを解除すると、GCログファイル
# 128MBごとに最大32回ローテーションされます。
#-XX:+GCログファイルのローテーションを使用する
#-XX:GCログファイルの数=32
#-XX:GCログファイルサイズ=128M
# Elasticsearch 5.0.0 では、JSON 内の引用符で囲まれていないフィールド名に対して例外がスローされます。
# 以前のバージョンで引用符なしのフィールドを使用してドキュメントがすでにインデックスされている場合
Elasticsearch の # では、一部の操作でエラーが発生する可能性があります。
#
# 警告: このオプションはElasticsearch 6.0.0で削除され、
# 移行目的のみ。
#-Delasticsearch.json.allow_unquoted_field_names=true

補足: Docker コンテナのメモリ制限

Docker メモリ制限

docker run -d -i -t -m 256M --memory-swap 512M --name centos2.12 centos /bin/bash

コンテナ インスタンスのメモリ制限を表示します。

コンテナのメモリサイズを制限します。

docker run -d -i -t -m 256M --memory-swap 512M --name centos centos /bin/bash

-m, --メモリ 
# メモリ制限サイズ。単位は b、k、M、g です。最小値は 4M です。
--メモリスワップ
# メモリの合計制限 + スワップ パーティション サイズ --memory-reservation # 予約済みメモリ サイズ。ホスト上のコンテナーが占有する最小メモリ。
--oom-kill-disable
# メモリ不足のメモリオーバーフロー。コンテナプロセスの強制終了を制限します。デフォルトでは設定されていません --oom-score-adj
# OOMキラーによって強制終了されるコンテナの優先度。範囲は[-1000, 1000]、デフォルトは0です。
--メモリスワップ
# コンテナの仮想メモリ制御動作を設定するために使用されます。値は0から100までの整数です --kernel-memory
コアメモリの制限、最小は 4M です。

1. メモリはコンテナのメモリサイズを設定します。

--memory-swap はスワップ パーティションではなく、メモリ + スワップのサイズです。
コンテナのスワップパーティション swap = メモリスワップ - メモリ

2. Dockerのデフォルトコンテナのスワップパーティションのサイズはメモリと同じです

メモリスワップが設定されていないか、0 に設定されています。
コンテナのスワップ サイズはメモリのサイズです。
コンテナのプロセスが使用する最大メモリ = メモリ + スワップ

3. メモリスワップ設定

メモリスワップが -1 に設定されている場合;
コンテナのメモリ サイズは、メモリによって設定されたサイズです。
スワップ パーティションのサイズは、ホスト マシンのスワップ サイズです。
コンテナ プロセスが使用できる最大メモリ = メモリ + ホスト スワップ サイズ。

4. メモリオーバーフロー

--oom-kill-disable
コンテナプロセスの強制終了を制限します。(メモリ制限後に設定する必要があります。)
docker run -d -i -t -m 256M --oom-kill-disable --name Centos-1 centos /bin/bash

5. カーネルメモリとユーザーメモリ

カーネル メモリとユーザー メモリの違いは、カーネル メモリはスワップアウトできないことです。

スワップアウトができないと、コンテナがメモリを過剰に消費して一部のシステム サービスをブロックする可能性があります。

コアメモリには以下が含まれます。
ページを積み重ねる
スラブページ
ソケットメモリの圧力
TCP メモリの圧力

このメモリは、カーネル メモリ制限を設定することによって制限できます。

各プロセスはスタック ページを消費します。カーネル メモリを制限することで、カーネル メモリの使用量が高くなりすぎたときに新しいプロセスが作成されないようにすることができます。

docker run -d -i -t -m 500M --kernel-memory 128M --name Centos-2 centos /bin/bash
コンテナ メモリを 256M に制限し、コア メモリを 128M に制限します。
docker run -d -i -t --kernel-memory 128M --name Centos-3 centos /bin/bash
メモリはホストメモリサイズであり、コアメモリは128Mに制限されています。

6. Swappiness メモリリサイクルページ

コンテナのカーネルは、匿名ページの一定の割合をスワップアウトできます。

この比率を設定するには --memory-swappiness を使用します。
--memory-swappiness は 0 から 100 まで設定できます。
# 0 は匿名ページスワッピングをオフにすることを意味します。
# 100 はすべての匿名ページを交換できることを意味します。デフォルトでは、--memory-swappiness が適用されていない場合、値は親プロセスから継承されます。
docker run -d -i -t --memory-swappiness=0 --name Centos-4 centos /bin/bash
--memory-swappiness を 0 に設定すると、コンテナのワーキングセットが保持され、スワップエージェントのパフォーマンスの低下を回避できます。

Swappiness 値が大きいほど、スワップ パーティションがよりアクティブに使用され、値が小さいほど、物理メモリがよりアクティブに使用されます。デフォルトの swappiness=60

sysctl vm.swappiness = 100 
# cat /proc/sys/vm/swappiness

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • Docker JVM メモリ使用量の表示
  • Docker メモリ監視とストレステストの方法
  • Docker View プロセス、メモリ、カップ消費量
  • Docker が elasticsearch を起動するときのメモリ不足の問題と解決策
  • Docker でコンテナに使用できるメモリを制限する方法
  • Dockerは指定されたメモリで操作を実行します

<<:  MySQL 5.7.33 インストール プロセスの詳細な図解

>>:  JavaScript を使用してソートアルゴリズムを実装する方法

推薦する

Alibaba Cloud イメージリポジトリの Docker 構成変更の実装

docker リポジトリ自体は非常に遅いですが、中国の Alibaba Cloud ミラー リポジト...

CSSで制御可能な点線を実装する方法

序文CSS を使用して点線を生成するのは、フロントエンド開発者にとっては簡単です。一般的に、これを実...

MySQL での挿入効率のいくつかの例の比較

序文最近、仕事の都合で、約 1000w の大量のデータを MySQL に挿入する必要があり、時間がか...

webpackでHMRを手動で実装するいくつかの方法

目次1. はじめに2. GitHub 3. 基本構成プロジェクトディレクトリパッケージ.json c...

div要素に丸い境界線を追加する方法

以下のように表示されます。 CSSコードコンテンツをクリップボードにコピー分割{境界線: 2px 固...

jQueryはシンプルなボタンの色の変更を実装します

HTML と CSS で、ボタンの色を設定したいとします。 目的の効果は得られますが、プロセスはかな...

MySQL の「特殊キーが長すぎます」の解決策

目次解決策1解決策2テーブルを作成するときに、興味深い問題に遭遇しました。「指定されたキーが長すぎま...

Windows の MySQL net start mysql MySQL サービスの起動エラーが発生する システムエラーの解決

目次1- エラーの詳細2-シングルソリューション2.1-ディレクトリ C:\Windows\Syst...

wgetはウェブサイト全体(サブディレクトリ全体)または特定のディレクトリをダウンロードします

wgetコマンドを使用して、親ディレクトリの下のサブディレクトリ全体をダウンロードします。親ディレク...

Dockerのyumソースの設定とCentOS7へのインストールの詳細な説明

ここではCentOS7が使用されており、カーネルバージョンは [root@localhost ~]#...

nginx アンチホットリンクおよびアンチクローラー設定の詳細な説明

新しい設定ファイルを作成します (たとえば、nginx インストール ディレクトリの下の conf ...

DockerにMySQL 8.0をインストールする方法

環境: MacOS_Cetalina_10.15.1、Mysql8.0.18、Docker_2.0....

フロントエンドの上級者向けコースでは、JavaScript のストレージ機能の使い方を学習します。

目次序文背景実施計画の考え方js ストレージ機能ソリューション設計やっと要約する序文どの SaaS ...

yum の基本的な使い方と例(推奨)

yumコマンドYum (フルネームは Yellow dog Updater, Modified) ...