サーバーの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に含める必要があります。
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
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
これは私にも起こりました。RAMサイズをVMこれまで。
解決策::この問題が発生しているアプリケーションまたはサービスのヒープサイズを縮小したところ、サービスは再び正常に起動しました。