В моем текущем проекте у меня есть функция AWS Lambda, написанная на Java. Ищу способы уменьшить задержки холодного старта лямбды. К сожалению, на данный момент у меня нет возможности переписать функцию на другом языке (Python или Go). В дополнение к стандартным действиям для оптимизации кода функции я исследую другие способы.
Опытным путем я обнаружил, что увеличение объема ОЗУ приводит к повышению производительности. Меня интересовало, какая конфигурация JVM используется в среде Lambda, но это была не очень доступная информация. Поэтому я попытался использовать следующую функцию, которая выполняет итерацию через InputArguments в RuntimeMXBean (я нашел подобное исследование в Интернете):
Извлечение лямбда-параметра
package com.amazonaws.lambda.demo;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.List;
public class LambdaFunctionHandler implements RequestHandler<Object, String> {
@Override
String handleRequest(Object input, Context context) {
context.getLogger().log("Input: " + input);
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
List arguments = runtimeMxBean.getInputArguments();
for (String arg : arguments) {
context.getLogger().log(arg);
}
return "Call succeeded.";
}
}
И я получил такой результат:
-XX:MaxHeapSize=445645k
-XX:MaxMetaspaceSize=52429k
-XX:ReservedCodeCacheSize=26214k
-XX:+UseSerialGC
-Xshare:on
-XX:-TieredCompilation
Как видите, он настроен на использование Serial GC и не использует многоуровневую компиляцию. Я не уверен, почему инженеры AWS выбрали такую конфигурацию, но было бы интересно попробовать использовать другие настройки JVM. Есть ли возможность настроить GC в JVM AWS Lambda или это полностью закрытый черный ящик?
Настройка GC не поможет сократить время холодного запуска AWS Lambda. Языки JVM имеют более длительное время холодного запуска, чем некоторые из альтернатив, из-за времени, необходимого для фактической загрузки виртуальной машины в память, а затем загрузки всех классов из файлов jar. Фреймворк, использующий отражение для определения того, что загружать, еще больше замедлит работу.
Чтобы улучшить холодный запуск, избегайте таких фреймворков, как Spring Boot, и минимизируйте свои зависимости. Вы также можете попробовать толстый JAR.