ドッカーコンテナで実行したときにハイI / OのJavaプロセスは一貫JavaThreadに信号11 SIGSEGVを取得します

navkast:

誰もが異なるハードウェアと異なるJREバージョンを使用してJREの一貫複製SIGSEGVsすることができましたか?注(潜在的に大きな注):私はKubernetesに配備ドッカーコンテナ内のプロセスを実行しています。

サンプルエラー:

# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fea64dd9d01, pid=21, tid=0x00007fe8dfbfb700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_191-b12) (build 1.8.0_191-b12)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.191-b12 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# J 8706 C2 com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextFieldName()Ljava/lang/String; (493 bytes) @ 0x00007fea64dd9d01 [0x00007fea64dd9b60+0x1a1]

MySQLのへのダウンロードCSVをとJSONs、読書CSVを、CSVをへJSONsを書き込み、読み込みCSVを:私は現在、I / Oとシリアル化をやって多くのスレッドを持っている高いI / Oプロセスを管理しています。私は、アプリケーションの実行サイクルの間に時間のこの何千を行います。私は何もなく、一般的に使用されるライブラリ(ジャクソン、jOOQ)と「通常」のコードを使用します。具体的には、私は、JNIを使​​用して、ライトカスタムコードではありませんでした。

必ず、JVMは、各実行サイクル中にSIGSEGVます。これは、コードベースのさまざまな部分にSIGSERVには思われるが、決してGCのスレッドまたは任意の他のよく知られたスレッドで。「問題のあるフレームは、」常にコードをコンパイルしています。

テスト仕様:

  • AWS内の複数の異なるハードウェアインスタンス。
  • Ubuntuの16.04のJava 8 191および181を使用してテストしました。
  • このプロセスは、コンテナ(ドッカー)で実行しているとKubernetesに配備されています。
  • ドッカーバージョン: 17.03.2-ce

ここでは完全なログです:https://gist.github.com/navkast/9c95f56ce818d76276684fa5bb9a6864

ピーターLawrey:

大きなヒントがここにあります

 Memory: 4k page, physical 33554432k(1020k free), swap 0k(0k free)

32ギガバイトのうち、唯一の1メガバイトは、クラッシュ時の自由です。システムは、メモリが不足しているとして最も可能性の高いプロセスが殺されました。私は提案します:

  • 大幅にヒープサイズを小さくします。例えば2〜8ギガバイト
  • 使用可能なメモリを増やします。例えば4〜16ギガバイト
  • いくつかのスワップ領域を追加します。8例えば - 32ギガバイトを、これが問題を解決しませんが、もう少し優雅に完全なメモリを処理します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=232857&siteId=1