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 を使用してソートアルゴリズムを実装する方法

推薦する

IE6 で幅と高さがおかしいバグ

図に示すように: しかし、IE6で表示すると、right:1px:になります。 IE6 には、幅と高...

Linux でジャンクファイルをエレガントに削除する方法

あなたも私と同じように、コンピューターのファイルを整然と整理し、不要なファイルを適宜削除するプログラ...

Webフロントエンドスキル概要(個人の実務経験)

1. 今日、ページを作っているときに、矢印を中央に配置する効果に遭遇しました。クリック領域を大きくし...

ウェブページを作成するために最もよく使用されるHTMLタグ

1. よく使われるHTMLタグの最適化HTML は Web 編集者にとって基本的なスキルであるべきで...

ReactJs 基礎チュートリアル - 基本編

目次1. ReactJS の紹介2. ReactJSの理解とReactJSの利点1. ReactJS...

webpackでCSSを分割・圧縮し、リンクでインポートする手順

まずコードファイルの構造を見てみましょう。エントリファイル (index1.js) の内容: ...

MySQLデータベースバックアップのさまざまな実装方法の概要

この記事では、MySQL データベースのバックアップを実装するさまざまな方法について説明します。ご参...

JavaScript のシングルトン デザイン パターン

目次1. デザインパターンとは何ですか? 2. デザインパターンの5つの設計原則(SOLID) 3....

ログインフォームを実装するためのReactサンプルコード

Vue ユーザーとして、React を拡張する時が来ました。antd の導入、less と rout...

js オプション連鎖演算子の使用

序文オプションの連鎖演算子 (?.) を使用すると、チェーン内の各参照が有効であることを明示的に検証...

Mysql の大きな SQL ファイルの高速リカバリ ソリューションの共有

序文MySQL データベースを使用する過程では、データベースのバックアップと復元が必要になることがよ...

HTML での位置の使用に関する簡単な紹介

昨日 HTML を少し学んだばかりで、JD.com の検索バーを作るのが待ちきれませんでした。 作っ...

JSはビデオの再生速度を制御するための簡単なサンプルコードを実装します

導入以前、ある問題に気づきました。学習ビデオを視聴しているとき、動きが遅すぎる、先生が黒板に書くのに...

NginxはLua+Redisを使用してIPを動的にブロックします

1. 背景日常的なウェブサイトのメンテナンスでは、このような要件に頻繁に遭遇します。特定のクローラー...

VirtualBox を使用して Mac 上にローカル仮想マシン環境を構築する方法

1. ビッグデータとHadoopビッグデータについて研究し学ぶには、当然 Hadoop から始める必...