2016-11-03 4 views
1

Swisscom Cloudに展開可能なJavaアプリケーションがあります。 1.5GのRAMを持つインスタンス。 このアプリケーションのメモリ使用量を制限するために、CF用の次のパラメータを使用しています。 ps -ef | grep javaを実行する際に、インスタンスの下でJavaアプリケーションがSwisscomクラウド上でOOMで失敗する

[jre: { version: 1.8.0_+ }, memory_calculator: {memory_sizes: {stack: 228k}, 
memory_heuristics: {heap: 50, metaspace: 20, native: 50, stack: 10}}] 

は、我々が得る:

-Xms611500K -XX:MetaspaceSize=244600K -Xmx611500K -XX:MaxMetaspaceSize=244600K -Xss228 
-XX:MaxDirectMemorySize=256m -XX:InitialCodeCacheSize=32m -XX:ReservedCodeCacheSize=64m 
-XX:CompressedClassSpaceSize=250m -XX:+UseCompressedOops -XX:+UseCompressedClassPointer 

残念ながらいくつかの時間後に我々のアプリのプロセスが殺されている( "終了ステータス137で")。私たちはCFのために別の設定を試みましたが、運はありませんでした。私たちは使用メモリを制限しているにもかかわらず、私たちは常に1.5ギガバイトのRAMを使い果たしています。

2016-11-10T14:31:08.34+0200 [API/0]  OUT App instance exited with guid 
72a197e9-e222-43b5-9828-9553c1d58315 payload: {"instance"=>"", "index"=>0, 
"reason"=>"CRASHED", "exit_description"=>"2 error(s) occurred:\n\n* 2 error(s) 
occurred:\n\n* Exited with status 137 (out of memory)\n* cancelled\n* cancelled", 
"crash_count"=>1, "crash_timestamp"=>1478781068233690142, 
"version"=>"ebfced51-9973-434b-8ec0-79a8caa86b3b"} 

クラッシュする前に、私たちは新しいレリックを使用して、ヒープメモリの使用状況を分析し、私たちは、あなたが以下を参照することができます発見さ:4:30の周り

ここ

Used Heap memory Used Non-Heap memory は、Exited with status 137 (out of memory)が起こりました。あなたが見ることができるように、メモリの超過は全くありませんでした。実際に間違っている可能性が何

7 vcap 10 -10 6160764 1.357g 22528 S 27.3 7.4 3:09.52 java

:私は、私は次のだクラッシュする前にCFインスタンスの下topコマンドを実行

? Javaプロセスは実際には1.4GのRAMを使用していましたが、New Relicグラフからはそのような大量のメモリは使用されていません。

+0

終了コードについては、こちらを参照してください。http://journal.thobe.org/2013/02/jvms-and-kill-signals.html「...私たちはメモリを使用したという事実にもかかわらず...」と言うと、これは雲台の限界ですか?私はそれがあまりにも多くのメモリを使用する場合、あなたのプロセスを殺していると思います。だからあなたはまた、JVMのメモリを制限する必要があります –

+0

Xmxを使用してJVMのメモリを制限するのですか?はい、私はそれを制限しました。 –

+0

New Relicで監視した後、グラフを追加しました。 –

答えて

1

CFコンテナが多すぎるメモリを使用していると考えているため、アプリケーションがクラッシュしていると想定します。この仮定は、 "cf events"内のクラッシュイベントを調べ、それらがOOMクラッシュであることを確認することによって検証することができます。アプリケーションをクラッシュさせているのがコンテナであると仮定すると、これは通常この状況を調整する方法です。

java_buildpackは、アプリケーションのメモリ使用を本当に困難にしようとします。しかし、jvmが設定されたオプションの外でメモリを割り当てる方法を見つけ出すアプリケーションはまだ存在するようです。

私が設定を調整する最も簡単な方法は、アプリケーションが安定するまで単純に "ネイティブ"メモリ比率を引き上げてヒープを減らすことです。ネイティブは、ビルドパックが管理していないjvmが割り当ててもよいすべてのバケツをキャッチします。

私は "heap:600m"の設定を削除すると、ヒューリスティックな計算がより複雑になり、潜在的なネイティブパーセンテージが無効になる可能性があります。

+0

私はこの提案をもう一度します。あなたはさらに一歩進むことを検討するかもしれません。アプリケーションのメモリ制限を増やしますが、ヒープ/メタスペース制限を増やさないようにJBPを調整してください。このアイデアは、あまりにも大量の "ネイティブ"メモリを残すことです(これは後でスケールすることができます)。これはバッファのように動作し、アプリケーションにフリーで未使用のメモリを与えます。十分にバンプすれば、アプリがクラッシュするのを防ぎ、次に調査することができます(jmap、プロファイラなど)。)あなたのアプリ(またはおそらくJVM)で期待する以上のメモリを使用しているもの。 –

+0

ああ、また、JBP 3.8+を使用していることを確認してください。そのバージョンのメモリの計算にはいくつかの調整が加えられました。古いバージョンでは、cf set-env JBP_CONFIG_OPEN_JDK_JRE [memory_calculator:{stack_threads:300、memory_sizes:{stack:228k}、memory_heuristics:{heap:65、native:15、stack:10} }] ''と同じ変更を行います。 –

+0

現在、次のセットアップを行っています: CFインスタンスの予約メモリ - 1536m JBP_CONFIG_OPEN_JDK_JRE:[jre:{バージョン:1.8.0_ +}、memory_calculator:{memory_sizes:{stack:228k}、memory_heuristics:{heap:50、 xM:NativeMemoryTracking =詳細-XX:MaxDirectMemorySize = 256m -XX:InitialCodeCacheSize = 32m -XX:ReservedCodeCacheSize = 64m -XX:CompressedClassSpaceSize = 150m -XX:+ UseCompressedOops -XX :+ UseCompressedClassPointers –

関連する問題