ポイント
- fargateのタスク定義の「タスクメモリ」で指定したメモリ量を超えた場合、タスクは強制終了されます。
- 従って、タスクメモリを超えないように最大ヒープサイズ等を調整する必要があります。
環境
- 言語: Kotlin
- フレームワーク: ktor
- dockerイメージ: openjdk:8-jre-alpine
Dockerfile
FROM openjdk:8-jre-alpine
ENV APPLICATION_USER ktor
RUN adduser -D -g '' $APPLICATION_USER
RUN mkdir /app
RUN chown -R $APPLICATION_USER /app
USER $APPLICATION_USER
COPY ./build/libs/my-application.jar /app/my-application.jar
WORKDIR /app
CMD ["java", "-server", "-XX:+UnlockExperimentalVMOptions", "-XX:+UseCGroupMemoryLimitForHeap", "-XX:InitialRAMFraction=2", "-XX:MinRAMFraction=2", "-XX:MaxRAMFraction=2", "-XX:+UseG1GC", "-XX:MaxGCPauseMillis=100", "-XX:+UseStringDeduplication", "-XX:MaxMetaspaceSize=256M", "-XshowSettings:vm", "-jar", "my-application.jar"]
基本的にはktorのドキュメントを元にしていますが、以下のjavaのオプションを追加しました。
-
-XX:MaxMetaspaceSize=256M
: メタスペースの最大値を256MB確保して、それ以上増やさない設定です。 デフォルトでは無制限に拡張できてしまうので、念のため最大値を設定しました。 -
-XshowSettings:vm
: 起動時にVMの設定を出力します。
fargateのタスク定義
コンテナの定義で、メモリのハード制限を必ず指定してください。
ここで指定した値が、 docker run
の --memory
オプションに渡されます。
通常は、タスクメモリと同じ値を指定してください。
タスクのログの確認
Fargateのタスクのログを表示し、Max. Heap Size
が想定した値になっていることを確認してください。
今回の場合は、ハード制限が1000MiBで、javaのオプションが "-XX:MaxRAMFraction=2" なので、500Mとなるのが正しいです。