web-dev-qa-db-ja.com

Dockerコンテナで実行している場合、JVMは予約済みメモリをマップできません

サーバーのDockerコンテナでJavaを実行できないようです。Java -versionを発行しても、次のエラーが発生します。

root@86088d679103:/# Java -version
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000035ce1000000, 2555904, 1) failed; error='Operation not permitted' (errno=1)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 2555904 bytes for committing reserved memory.
# An error report file with more information is saved as:
# //hs_err_pid17.log

これによると、Java予約メモリ用に2.5Mbのスペースをマップできませんか?これは正しくないようです...

最後に完全なログが含まれていますが、いくつかの追加情報のために、私のシステムは次のことを報告しています。

root@86088d679103:/# uname -m
x86_64
root@86088d679103:/# free -mh
             total       used       free     shared    buffers     cached
Mem:           15G       9.7G       5.8G       912K       148M       8.9G
-/+ buffers/cache:       639M        14G
Swap:          15G         0B        15G

誰かが私を正しい方向に向けることができますか?

完全なログ: https://Gist.github.com/KayoticSully/e206c44681ce261674ba

更新

@Yobertが問題を突き止めたので、コメントとチャットログを読むことを強くお勧めします。そこに良い情報。

Javaを機能させる最後のコマンドが必要な場合:setfattr -n user.pax.flags -v "mr" /usr/bin/Java

ディストリビューションにデフォルトでsetfattrがインストールされていない場合は、paceman、apt-getなどを介してインストール可能なパッケージattrに含める必要があります。

11
KayoticSully

Grsec対応のカーネルを使用しているときにも同じ問題が発生しました。 JavaがNiceを再生するには、JavaバイナリでMPROTECTを無効にする必要がありました。これにはpaxctlユーティリティを使用できます。

paxctl -m /usr/lib/jvm/Java-7-openjdk/jre/bin/Java

これまでバイナリで使用したことがない場合は、最初にバイナリでpaxctl -cを実行する必要があります。

paxctl -c /usr/lib/jvm/Java-7-openjdk/jre/bin/Java

Paxctlの詳細については、次を参照してください。 http://en.wikibooks.org/wiki/Grsecurity/Additional_Utilities

12
Yobert

Alpine LinuxでDockerを実行しているときに同じ問題が発生しましたが、PaXソフトモードを有効にすると機能しました。

sysctl -w kernel.pax.softmode=1

ソフトモードはデフォルトでほとんどのPaX機能を無効にするため、有効にすることはお勧めしません。適切な方法は、すでに前述したように、paxctlを使用することです。

こちらもご覧ください: https://en.wikibooks.org/wiki/Grsecurity/Appendix/Grsecurity_and_PaX_Configuration_Options#Support_soft_mode

11
Sven Mohr

これは私にも起こりました。RAMサイズをVMこれまで。

解決策::この問題が発生しているアプリケーションまたはサービスのヒープサイズを縮小したところ、サービスは再び正常に起動しました。

1
Ankit