Nas partes anteriores de nossa série, medimos as inicializações a frio da função Lambda com tempo de execução Java 21 sem SnapStart habilitado, com SnapStart habilitado e também aplicamos otimização de preparação de invocação do DynamoDB com diferentes configurações de memória Lambda, tamanhos de artefato de implantação Lambda, Java opções de compilação, (a) clientes HTTP síncronos e o uso de diferentes camadas Lambda. Para todas essas medições usamos algoritmos de coleta de lixo padrão G1.
Neste artigo, gostaríamos de explorar o impacto dos algoritmos de coleta de lixo Java no desempenho da função Lambda com tempo de execução Java 21. Também mediremos novamente tudo para que o G1 tenha resultados comparáveis com a mesma versão secundária do Java 21 em uso para todos os algoritmos de coleta de lixo.
Para nossas medições, usaremos os seguintes algoritmos de coleta Java com sua configuração padrão (consulte a documentação vinculada para obter informações mais detalhadas sobre cada algoritmo):
Em nosso experimento usaremos um aplicativo ligeiramente modificado apresentado na parte 9. Você pode encontrar o código do aplicativo aqui. Existem basicamente 2 funções Lambda que respondem às solicitações do API Gateway e recuperam o produto pelo ID recebido do API Gateway do DynamoDB. Uma função Lambda GetProductByIdWithPureJava21LambdaWithGCAlg pode ser usada com e sem SnapStart e a segunda GetProductByIdWithPureJava21LambdaAndPrimingWithGCAlg usa preparação de invocação de solicitação SnapStart e DynamoDB.
Os resultados do experimento abaixo foram baseados na reprodução de mais de 100 partidas frias e aproximadamente 100.000 partidas quentes com um experimento que durou aproximadamente 1 hora. Para isso (e experimentos do meu artigo anterior) usei a ferramenta de teste de carga, ei, mas você pode usar qualquer ferramenta que quiser, como artilharia sem servidor ou Postman. Executamos experimentos fornecendo às funções Lambda 1.024 MB de memória e usando JAVA_TOOL_OPTIONS: "-XX: TieredCompilation -XX:TieredStopAtLevel=1" (compilação do cliente Java sem criação de perfil), que tem uma troca muito boa entre tempos de inicialização frio e quente.
Infelizmente não consegui fazer a função Lambda iniciar com o Z Garbage Collector (com o padrão e o geracional) apresentando o erro:
Failed to commit memory (Operation not permitted) [error][gc] Forced to lower max Java heap size from 872M(100%) to 0M(0%) [error][gc] Failed to allocate initial Java heap (512M) Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.Ele tentou configurações de memória maiores, como 1.024, 2.048 MB e ainda mais MBs, mas o mesmo erro ainda apareceu.
Vamos analisar os resultados de nossas medições com outros três algoritmos de coleta de lixo.
Abreviatura
c é para partida a frio e w é para partida a quente.
Hora de início frio (c) e quente (w) sem SnapStart ativado em ms:
cp50 | p75 | cp90 | cp99 | c p99.9 | c máx | p50 | p75 | p90 | wp99 | w p99.9 | w máximo | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
3655.17 | 3725,25 | 3811.88 | 4019.25 | 4027.30 | 4027.83 | 5.46 | 6.10 | 7.10 | 16.79 | 48.06 | 1929.79 | |
3714.10 | 3789.09 | 3857,87 | 3959,44 | 4075,89 | 4078.25 | 5,55 | 6.20 | 7.10 | 15.38 | 130.13 | 2017.92 | |
3963,40 | 4019.25 | 4096,30 | 4221,00 | 4388,78 | 4390,76 | 5,82 | 6,45 | 7,39 | 17.06 | 71.02 | 2159.21 |
Hora de início frio (c) e quente (w) com SnapStart ativado sem Priming em ms:
cp50 | p75 | cp90 | cp99 | c p99.9 | c máx | p50 | p75 | p90 | wp99 | w p99.9 | w máximo | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1867.27 | 1935.68 | 2152.02 | 2416.57 | 2426.25 | 2427.35 | 5.47 | 6.11 | 7.05 | 17.41 | 51.24 | 1522.04 | |
1990.62 | 2047.12 | 2202.07 | 2402.12 | 2418.99 | 2419.32 | 5,68 | 6.35 | 7,45 | 18.04 | 147,83 | 1577.21 | |
2195.47 | 2301.07 | 2563.37 | 3004.89 | 3029.01 | 3030.36 | 5,73 | 6.41 | 7,51 | 17.97 | 75,00 | 1843.34 |
Hora de início fria (c) e quente (w) com SnapStart habilitado e com invocação do DynamoDB Priming em ms:
cp50 | p75 | cp90 | cp99 | c p99.9 | c máx | p50 | p75 | p90 | wp99 | w p99.9 | w máximo | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
833,50 | 875,34 | 1089,53 | 1205.26 | 1269,56 | 1269,8 | 5.46 | 6.10 | 7.16 | 16.39 | 46.19 | 499.13 | |
900,18 | 975,12 | 1058.41 | 1141.94 | 1253.17 | 1253,99 | 5,82 | 6,61 | 7,75 | 16.87 | 49,64 | 487,73 | |
1065,84 | 1131.71 | 1331.96 | 1473.44 | 1553,59 | 1554,95 | 5,77 | 6h40 | 7,39 | 17h20 | 65.06 | 500,48 |
Consulte a documentação de cada algoritmo de coleta de lixo para ajustar configurações como mix e memória máxima, que podem fornecer melhoria significativa no desempenho e fazer suas próprias medições.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3