JVM cant map mémoire réservée lors de l'exécution dans un conteneur Docker
Je n'arrive pas à exécuter java du tout dans un conteneur Docker sur mon serveur. Même lors de l'émission java -version
, j'obtiens l'erreur suivante.
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
selon ceci, java ne peut pas cartographier 2.5 Mb d'espace réservé à la mémoire? Cela ne semble pas juste...
j'ai le log complet inclus à la fin, mais pour le bien de quelques informations supplémentaires, mon système de reporting suivantes:
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
quelqu'un peut-il m'indiquer la bonne direction?
Log Complet: https://gist.github.com/KayoticSully/e206c44681ce261674ba
mise à Jour
@Yobert a résolu le problème et je vous suggère fortement de lire les commentaires et le journal de chat. Bonne info.
Pour ceux qui veulent la dernière commande que fait Java: setfattr -n user.pax.flags -v "mr" /usr/bin/java
Si votre distribution n'a pas setfattr
installé par défaut, il doit être inclus dans le paquet installable attr via paceman, apt-get, etc.
3 réponses
j'ai eu ce même problème en utilisant un noyau grsec. Pour que java joue bien, j'ai dû désactiver MPROTECT sur le binaire java. Vous pouvez utiliser le paxctl
utilitaire pour ceci:
paxctl -m /usr/lib/jvm/java-7-openjdk/jre/bin/java
Vous aurez besoin de faire paxctl -c
sur le binaire d'abord si vous n'avez jamais utilisé sur que le binaire avant:
paxctl -c /usr/lib/jvm/java-7-openjdk/jre/bin/java
plus d'informations sur paxctl peuvent être trouvées à: http://en.wikibooks.org/wiki/Grsecurity/Additional_Utilities
j'ai eu le même problème quand J'ai lancé Docker sur Linux Alpine, après avoir activé le mode pax soft cela a fonctionné:
sysctl -w kernel.pax.softmode=1
Le mode Soft désactivera la plupart des fonctionnalités PaX par défaut, il n'est donc pas recommandé de l'activer. La bonne façon est d'utiliser paxctl, comme déjà mentionné ci-dessus.
Aussi, jetez un oeil ici: https://en.wikibooks.org/wiki/Grsecurity/Appendix/Grsecurity_and_PaX_Configuration_Options#Support_soft_mode
Cela m'est arrivé aussi , Nous avons réduit la taille de la mémoire vive sur notre VM et après quelques jours a commencé à obtenir cette erreur et le service n'est pas venu pour toujours.
Solution:: nous avons réduit la taille du tas de l'application ou du service ayant ce problème et le service est revenu très bien.