2014-12-03 11 views
11

Nie mogę w ogóle uruchomić java w kontenerze Docker na moim serwerze. Nawet podczas wydawania java -version pojawia się następujący błąd.JVM nie może zarezerwować pamięci zarezerwowanej podczas działania w kontenerze Docker

[email protected]:/# 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 

Zgodnie z tym, java nie może mapować 2,5Mb miejsca na rezerwowaną pamięć? To nie wydaje się słuszne ...

mam pełny log zawarte na końcu, ale przez wzgląd na jakiś dodatkowych informacji, mój system donosi co następuje:

[email protected]:/# uname -m 
x86_64 
[email protected]:/# 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 

Czy ktoś może wskazać mi w właściwy kierunek?

Pełna Log: https://gist.github.com/KayoticSully/e206c44681ce261674ba

Aktualizacja

@Yobert przybity problem i bardzo Proponuję przeczytać komentarze i rozmowy zalogować. Dobra informacja tam.

Dla tych, którzy chcą ostateczny rozkaz, że wykonane prace Java: setfattr -n user.pax.flags -v "mr" /usr/bin/java

Jeśli dystrybucja nie posiada setfattr instalowany domyślnie powinno być zawarte w pakiecie do zainstalowania attr przez paceman, apt-get itd

Odpowiedz

13

Miałem ten sam problem podczas korzystania z jądra obsługującego Grsec. Dla java, aby grać ładnie, musiałem wyłączyć MPROTECT w binarnym java. Można użyć narzędzia paxctl na to:

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

Musisz zrobić paxctl -c na binarny pierwszy jeśli nigdy wcześniej nie używał go na tym binarnego przed:

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

Więcej informacji o paxctl można znaleźć na stronie: http://en.wikibooks.org/wiki/Grsecurity/Additional_Utilities

+0

To jest niesamowite wiedzieć, ale to nie działa dla mnie ... Upewniłem się, że flaga została wyłączona na rzeczywistej binarnej java, która jest wykonywana, ale ten sam problem nadal się dzieje. – KayoticSully

+0

Sprawdź dmesg - powinieneś zobaczyć kilka rzeczy, gdy próbujesz go uruchomić, jeśli jest to problem PAX. Istnieje również nowsza metoda ustawiania atrybutów bezpieczeństwa za pomocą xattrs zamiast nagłówka binarnego, jeśli obsługuje je jądro.Może masz wyłączony tryb starszej wersji? – Yobert

+0

Hmm, spróbowałbym usunąć więcej flag niż tylko m. Usuwamy pemrs dla java (choć nie myślę, że to idiomatyczne) – Yobert

8

miałem ten sam problem przy uruchamianiu Döcker Alpine Linux, po włączeniu trybu miękkiego PaX to działało:

sysctl -w kernel.pax.softmode=1 

Tryb miękki domyślnie wyłącza większość funkcji PaX, dlatego nie zaleca się włączania go. Właściwym sposobem jest użycie paxctl, jak już wspomniano powyżej.

mają również do obejrzenia tutaj: https://en.wikibooks.org/wiki/Grsecurity/Appendix/Grsecurity_and_PaX_Configuration_Options#Support_soft_mode

+0

To nie działa dla mnie. Mam: [91msysctl: error: 'kernel.pax.softmode' jest nieznanym kluczem Czy to oznacza, że ​​mój system nie używa PaX? –

+0

Dzięki. To działa dla mnie w wersji 3.7.0 i wirtualnej. –

1

To zdarzyło mi się również, Mamy zmniejszona wielkość RAM na naszej VM i po kilku dniach zaczęła się ten błąd i usługa nie wpadł na zawsze .

Rozwiązanie :: Zredukowaliśmy wielkość sterty aplikacji lub usługi, w których wystąpił ten problem, a usługa znów była w porządku.