Мы запускаем установку java8 / jetty9 на appengine flex.В app.yaml мы выделили 30 ГБ оперативной памяти.Однако на сервере, когда мы вызываем Runtime.getRuntime().maxMemory()
, возвращаемое число составляет ~ 7G.Если я увеличу ОЗУ до 60G, это число увеличится до ~ 15G.Похоже, что JVM получает только четверть оперативной памяти, выделенной в app.yaml.
Я также попытался запустить сервер с параметром -Xmx30g
Однако загрузка сервера завершилась ошибкой
Недостаточно памяти для продолжения среды выполнения Java.
При выделении собственной памяти (mmap) не удалось сопоставить 7158235136 байт для фиксации зарезервированной памяти.
Ошибка, подтверждающая то, что мы видели с Runtime.getRuntime().maxMemory
, что существует ограничение ~ 7G, когда мы выделили 30G RAM.Куда идут остальные 75% распределения?
Вот Dockerfile
FROM gcr.io/google-appengine/jetty9
RUN apt-get -q update && \
apt-get -y -q --no-install-recommends -t jessie-backports install
openjdk-8-jdk && \
apt-get -y -q --no-install-recommends install ssh sshpass && \
apt-get clean && \
rm /var/lib/apt/lists/*_*
ADD backend.war $JETTY_BASE/webapps/root.war
WORKDIR $JETTY_BASE
RUN java -jar -Xmx30g -Xms20g $JETTY_HOME/start.jar --approve-all-licenses \
--add-to-startd=jmx,stats,hawtio,requestlog \
-Djava.util.logging.config.file=src/main/appengine/logging.properties \
&& chown -R jetty:jetty $JETTY_BASE
Вот app.yaml
runtime: custom
threadsafe: true
env: flex
handlers:
- url: /.*
script: this field is required, but ignored
secure: always
health_check:
enable_health_check: True
check_interval_sec: 5
timeout_sec: 4
unhealthy_threshold: 2
healthy_threshold: 2
resources:
cpu: 6
memory_gb: 30
disk_size_gb: 20
automatic_scaling:
min_num_instances: 1
max_num_instances: 3
cool_down_period_sec: 120
cpu_utilization:
target_utilization: 0.5