1. Introdução
Esta Seção tem o objetivo de fornecer uma visão geral acerca do trabalho, apresentando o
contexto e as motivações que levaram ao desenvolvimento deste, além de mapear os
principais objetivos a serem alcançados com o seu desdobramento e conclusão, tanto os
gerais, quanto os específicos. E ao final, é possível ter um panorama do que será tratado em
cada uma das seguintes seções do trabalho.
1.2 Objetivos
O objetivo principal deste trabalho é compreender e o aprimorar o processo de benchmarking
de funções serverless do ponto de vista de engenheiros de software em ambientes
possivelmente multi-cloud. Para se alcançar este objetivo, faz-se necessário:
● Identificar quais os parâmetros mais importantes em testes de performance sobre
essas funções;
● Identificar quais são as métricas mais relevantes no processo de comparação dos
resultados desses testes de performance;
● Averiguar se as ferramentas existentes possibilitam a comparação de funções
implantadas em provedores distintos.
2. Conceitos fundamentais
Esta Seção apresenta e explica os principais tópicos que o trabalho aborda. Por meio deles,
será possível ter um contexto para uma efetiva compreensão da ferramenta proposta na Seção
5.
2.4 Benchmarking
Para poder se comparar a performance as funções serverless, a fim de avaliar seus
comportamentos mediante determinadas situações, torna-se necessário a realização do
processo de benchmarking sobre as mesmas.
O processo de benchmarking é definido pela quantificação dos níveis de performance
entre diferentes participantes a partir de métricas, para assim identificar suas diferenças de
performance, a fim de se mapear quais deles tiveram os melhores resultados. Dessa forma, é
possível quantificar potenciais melhorias para os participantes que não tiveram os melhores
resultados, visando alcançar o nível dos melhores [50].
No objetivo de se dinamizar o cenário no qual todos os participantes de um
benchmarking irão se submeter, são definidos parâmetros. Dessa maneira torna-se factível a
comparação dessas métricas de performance advindas de diferentes configurações, provendo
a possibilidade de uma definição de cenário específica pelo requisitante do benchmarking.
3. Metodologia do Trabalho
Para esse trabalho, foi adotada a abordagem do GQM (Goal Question Metrics) [47] como
metodologia. A Figura 1 ilustra a meta que se busca alcançar na conclusão do trabalho, as
questões que precisam ser levadas em conta e respondidas para que a meta seja cumprida, e
por fim, as métricas que devem ser consideradas para se responder essas perguntas:
4.1 Método
Para a análise do estado da arte, foram utilizados os principais portais científicos, em especial
o IEEE [27], ACM [28] e Springer [29], e também portais agregadores, como o Google
Acadêmico [30] para a busca de trabalhos e artigos relacionados.
Como strings de busca, foram empregadas:
Tabela 1. Palavras-chaves utilizadas para compor a string de busca
4.2 Resultados
Com base na pesquisa, foi possível observar que a literatura acerca de benchmarking de
funções serverless em geral não é muito extensa, em decorrência do fato de FaaS ser um
modelo de computação cloud consideravelmente novo. Para se ter ideia, a primeira das
plataformas mais bem sucedidas desse tal modelo foi apenas lançada em 2014, pela AWS, as
chamadas Lambda Functions [31]. Contribuindo também para a análise desse fato, também é
possível constatar que o framework mais conhecido para a utilização dessas funções, o
Serverless Framework, teve sua versão 1.0.0 liberada em 2016 [32].
4.2.1 Parâmetros Mais Utilizados
Durante a fase de pesquisa do trabalho, para entender melhor o uso de testes de carga em
funções serverless, foi de fundamental importância determinar quais são os parâmetros mais
relevantes na configuração desses testes. Para apontar os mesmos, foi utilizado como critério
a quantidade de vezes que foram citados e/ou utilizados em outras ferramentas que se
propõem a realizar esse tal benchmarking.
Em primeira análise, fácil perceber que o parâmetro mais utilizado é o número de
requisições, o que faz bastante sentido ao se levar em consideração a natureza de um teste de
carga inserido num contexto de requisições HTTP. É possível constatar que todos os artigos
analisados utilizam o número de requisições como o parâmetro de configuração principal,
dando base ao processo de benchmarking [32, 33, 34, 35, 36, 37, 38].
Em segundo lugar no ranking, vem o número de requisições concorrentes, que simula
o comportamento de múltiplos clientes realizando requisições simultaneamente. Apesar de
ser menos presente nos trabalhos de referência [36, 38], tem um grande impacto nas métricas,
e torna os casos de teste muito mais fiéis em vários contextos do cotidiano onde as funções
são aplicadas.
5. Proposta de Ferramenta
A load-donkey (disponibilizada conforme o explícito na Seção 5.2) é uma ferramenta que foi
desenvolvida com o propósito de gerar relatórios comparativos a partir dos resultados de
testes de carga configuráveis, realizados sobre funções serverless, que por sua vez podem
estar implantadas em provedores cloud distintos.
Essa ferramenta visa facilitar o processo de benchmarking nesse modelo FaaS,
ajudando principalmente engenheiros de software na visualização, e dessa forma apoiando o
surgimento de insights sobre o comportamento dessa funções sob teste.
5.1 Arquitetura
A load-donkey foi desenvolvida numa arquitetura com a necessidade de facilidade de
extensão em mente. Para tal, a mesma foi implementada em dois principais pacotes, sendo
eles o load-donkey-core e o load-donkey-cli como é possível visualizar na Figura 2.
E para se utilizar a mesma, basta utilizar a seguinte linha de comando num terminal:
load-donkey /path/to/specfile
Ao final da execução, será gerado um diretório chamado load-donkey-reports na
pasta home do usuário. Dentro dele, constará um os arquivos de report, com a extensão html,
contendo um relatório comparando os resultados do benchmark que acabou de ser
performado.
5.1.1.1 Specfile
O Specfile é um arquivo no formato YAML, utilizado pelo load-donkey-cli para descrever a
suíte de testes de carga que devem ser executados. Para facilitar o entendimento, é possível
observar um exemplo de Specfile a seguir:
testEngine: ab
functions:
- address: http://host-aws.com
provider: aws
- address: http://host-gcp.com
provider: gcp
- address: http://host-azure.com
provider: azure
request:
method: POST
contentType: application/json
headers:
- key: Authorization
value: 123
queryParameters:
- key: pageSize
value: 25
bodyFile: /path/to/file/containing/body
parameters:
requestCount: 10000
concurrencyCount: 100
O mesmo utiliza os parâmetros apontados como os mais relevantes na Seção 4.2.1
(Número de requisições e Número de requisições concorrentes), assim como outros campos
que são usados para descrever a requisição que vai ser disparada, os endereços das funções, e
qual o motor de testes que deve ser utilizado.
5.1.1.2 Report
O Report é um arquivo html que consolida as métricas dos resultados dos testes de
performance executados sobre as funções definidas. Ele é gerado de forma dinâmica, a partir
dos resultados fornecidos. Atualmente ele dispõe as seguintes métricas:
● Total Time (in seconds): tempo total que se levou para realizar os testes sobre uma
função;
● Success Count: quantidade de requisições que retornaram resposta;
● Fail Count: quantidade de requisições que não retornaram resposta;
● Requests Per Second: quantidade média de requisições por segundo;
● Mean Time Per Request (in milliseconds): tempo médio por requisição em
milisegundos;
● P95 (in milliseconds): representa que 95% das requisições foram completas em
menos de X milisegundos;
● P99 (in milliseconds): representa que 99% das requisições foram completas em
menos de X milisegundos;
● Longest Request (in milliseconds): tempo de resposta mais longo dentre todas as
requisições em milisegundos.
Um exemplo de métrica apresentada no report é apresentada na Figura 3:
Tal módulo foi construído desta forma para se adequar ao princípio Open-Closed do
SOLID (conjunto de princípios ajudam a tornar mais fácil a manutenção e extensão do
código) [40], dessa forma, fazendo com que a ferramenta seja facilmente estendida, sem
afetar o funcionamento do que já foi previamente implementado. Nessa ótica, se torna uma
atividade relativamente trivial a implementação de outras interfaces com outros motores de
teste, como o Loadtest[41] e o Artillery [42].
10 1 90kb
10 1 180kb
function getPayload(size) {
switch (size) {
case '32':
return '<32kb_string>';
case '64':
return '<64kb_string>';
case '128':
return '<128kb_string>';
case '256':
return '<256kb_string>';
}
}
Para rodar os testes, serão utilizadas as configurações descritas conforme a Tabela 3,
que foram definidas a partir das combinações entre parâmetros base e o tamanho do payload
que constará na resposta de cada requisição, no objetivo de se observar o efeito dessa
variação de configuração nas métricas:
Tabela 3. Configurações utilizadas para o experimento de variação no tamanho do payload
Número de requisições Número de requisições Tamanho do payload de
concorrentes resposta
10 1 32
10 1 64
10 1 128
10 1 256
100 10 256
7. Resultados e Discussões
8. Conclusão
Pode-se então concluir que este trabalho atinge satisfatoriamente seu propósito, exposto na
Seção 3, de entender e aprimorar o processo de benchmarking em funções serverless
implantadas em ambientes possivelmente multi-cloud.
A partir de uma análise do estado da arte, vista na Seção 4, foi viável a elucidação das
questões fundamentais que nortearam o trabalho. Com essas respostas, foi desenvolvida uma
ferramenta capaz de realizar o benchmarking de funções serverless, que fizesse uso dos
parâmetros e métricas mais relevantes envolvidas nesse processo e que pode ser utilizada em
um contexto cotidiano, sobre funções definidas pelos próprios engenheiros de software, em
ambientes multi-cloud ou não.
Com os experimentos realizados, foi perceptível a viabilidade no uso da ferramenta,
que tornou possível fácil a configuração de inúmeros casos de teste, a apresentação de várias
métricas de performance já consolidadas de forma comparativa, e que demonstrou total
estabilidade em sua aplicação, apontando métricas capazes de fornecer insights valiosos sobre
o comportamento das funções testadas, que por sua vez, foram implementadas tendo como
base nos casos mais comuns de aplicações de serverless.
9. Trabalhos Futuros
Durante o desenvolvimento deste trabalho, algumas limitações foram percebidas na
ferramenta:
● Aprimoramento visual do report, utilizando-se de técnicas de design e visualização de
dados, a fim de torná-lo mais fácil de se interpretar as métricas consolidadas, assim
aumentando a propensão de se tirar insights sobre os dados;
● Criação de outros módulos na camada de interface de usuário, como por exemplo uma
API REST, que pode ser consumida por outros serviços;
● Implementação de interfaces com outros motores de teste de carga, tornando possível
suas utilizações e gerando métricas específicas desses motores;
● Implementação de mecanismo de coleta de logs dos próprios provedores cloud,
fornecendo métricas que não são capazes de ser obtidas por meio dos motores, como
por exemplo, o custo de cada execução das funções;
● Fazer com que a própria ferramenta aponte qual das funções sob teste teve o melhor
desempenho, a partir de uma função utilidade com fatores definidos pelo usuário.
10. Referências
[1]LEINER, Barry M. et al. A brief history of the Internet. ACM SIGCOMM Computer
Communication Review, v. 39, n. 5, p. 22-31, 2009.
[2]WINKLER, Till J.; BROWN, Carol V. Horizontal allocation of decision rights for
on-premise applications and software-as-a-service. Journal of Management Information
Systems, v. 30, n. 3, p. 13-48, 2013.
[3]THÖNES, Johannes. Microservices. IEEE software, v. 32, n. 1, p. 116-116, 2015.
[4]ROBERTS, Serverless Architectures. 2018. Acesso em: 09/04/20. Disponível em:
<https://martinfowler.com/articles/serverless.html>.
[5]Amazon Web Services, AWS. Acesso em: 09/04/20. Disponível em:
<https://aws.amazon.com/pt/>.
[6]Google Cloud, Google Cloud Platform. Acesso em: 09/04/20. Disponível em:
<https://cloud.google.com/>.
[7]Microsoft Azure, Microsoft Azure. Acesso em: 09/04/20. Disponível em:
<https://azure.microsoft.com/pt-br/>.
[8]Amazon Web Services, AWS Lambda. Acesso em: 09/04/20. Disponível em:
<https://aws.amazon.com/pt/lambda/>.
[9]Google Cloud, Cloud Functions. Acesso em: 09/04/20. Disponível em:
<https://cloud.google.com/functions?hl=pt-br>.
[10]Microsoft Azure, Azure Functions. Acesso em: 09/04/20. Disponível em:
<https://azure.microsoft.com/pt-br/services/functions/>.
[11]WANG, Lizhe et al. Cloud computing: a perspective study. New Generation Computing,
v. 28, n. 2, p. 137-146, 2010.
[12]MELL, Peter et al. The NIST definition of cloud computing. 2011.
[13]BOKHARI, Mohammad Ubaidullah; SHALLAL, Qahtan Makki; TAMANDANI, Yahya
Kord. Cloud computing service models: A comparative study. In: 2016 3rd International
Conference on Computing for Sustainable Global Development (INDIACom). IEEE,
2016. p. 890-895.
[14]Khalidi, Y. A. 2011. "Building a Cloud Computing Platform for New Possibilities,"
Computer (44), pp 29- 34.
[15]ARORA, Pankaj; WADHAWAN, Rubal Chaudhry; AHUJA, Er Satinder Pal. Cloud
computing security issues in infrastructure as a service. International journal of advanced
research in computer science and software engineering, v. 2, n. 1, 2012.
[16]NGINX Announces Results of 2016 Future of Application Development and Delivery
Survey. Acesso em: 12/11/20. Disponível em:
<https://www.nginx.com/press/nginx-announces-results-of-2016-future-of-application-dev
elopment-and-delivery-survey/>.
[17]Larry Seltzer. 2018. Serverless computing explained | HPE. Acesso em: 12/11/20.
Disponível em:
<https://www.hpe.com/us/en/insights/articles/serverless-computing-explained-1807.html>.
[18]HALL, Adam; RAMACHANDRAN, Umakishore. An execution model for serverless
functions at the edge. In: Proceedings of the International Conference on Internet of
Things Design and Implementation. 2019. p. 225-236.
[19]Tim Wagner. 2014. Understanding Container Reuse in AWS Lambda. Acesso em:
12/11/20. Disponível em:
<https://aws.amazon.com/blogs/compute/container-reuse-in-lambda/>.
[20]Colby Tresness. 2018. Understanding serverless cold start. Acesso em: 12/11/20.
Disponível em:
<https://azure.microsoft.com/pt-br/blog/understanding-serverless-cold-start/>.
[21]IBM Cloud, IBM Cloud Functions. Acesso em: 12/11/20. Disponível em:
<https://www.ibm.com/br-pt/cloud/functions>.
[22]Hetzel, Bill (1984). The Complete Guide to Software Testing. QED Information
Sciences. ISBN 0-89435-110-9.
[23]CRAIG, Rick David; JASKIEL, Stefan P. Systematic software testing. Artech house,
2002.
[24]JORGENSEN, Paul C. Software testing: a craftsman’s approach. CRC press, 2018.
[25]AMMANN, Paul; OFFUTT, Jeff. Introduction to software testing. Cambridge University
Press, 2016.
[26]Sten Pittet. The different types of software testing. Acesso em: 12/11/20. Disponível em:
<https://www.atlassian.com/continuous-delivery/software-testing/types-of-software-testin
g>.
[27]IEEE, IEEE Xplore. Acesso em: 12/11/20. Disponível em:
<https://ieeexplore.ieee.org/Xplore/home.jsp>.
[28]ACM Digital Library, ACM Journals. Acesso em: 12/11/20. Disponível em:
<https://dl.acm.org/journals>.
[29]Springer, Springer Link. Acesso em: 12/11/20. Disponível em:
<https://link.springer.com/>.
[30]Google, Google Acadêmico. Acesso em: 12/11/20. Disponível em:
<https://scholar.google.com.br/?hl=pt>.
[31]JANGDA, Abhinav et al. Formal foundations of serverless computing. Proceedings of
the ACM on Programming Languages, v. 3, n. OOPSLA, p. 1-26, 2019.
[32]Austen Collins. 2016. Releasing Serverless Framework V.1 & Fundraising. Acesso em:
12/11/20. Disponível em:
<https://www.serverless.com/blog/releasing-serverless-framework-v1-and-fundraising>.
[33]KIM, Jeongchul; LEE, Kyungyong. Functionbench: A suite of workloads for serverless
cloud function service. In: 2019 IEEE 12th International Conference on Cloud Computing
(CLOUD). IEEE, 2019. p. 502-504.
[34]MALAWSKI, Maciej et al. Benchmarking heterogeneous cloud functions. In: European
Conference on Parallel Processing. Springer, Cham, 2017. p. 415-426.
[35]SOMU, Nikhila et al. PanOpticon: A Comprehensive Benchmarking Tool for Serverless
Applications. In: 2020 International Conference on COMmunication Systems &
NETworkS (COMSNETS). IEEE, 2020. p. 144-151.
[36]MARTINS, Horácio; ARAUJO, Filipe; DA CUNHA, Paulo Rupino. Benchmarking
Serverless Computing Platforms. Journal of Grid Computing, p. 1-19, 2020.
[37]MAISSEN, Pascal et al. FaaSdom: A Benchmark Suite for Serverless Computing. arXiv
preprint arXiv:2006.03271, 2020.
[38]ROBSON, Ricardo. 2018. Em direção a um Framework Serverless para Docker Swarm.
Trabalho de Conclusão de Curso (Bacharelado em Sistemas de Informação) - Centro de
Informática, Universidade Federal de Pernambuco. 2018
[39]Apache, ab - Apache HTTP server benchmarking tool. Acesso em: 12/11/20. Disponível
em: <https://httpd.apache.org/docs/2.4/programs/ab.html/>.
[40]Samuel Oloruntoba. 2020. S.O.L.I.D: The First 5 Principles of Object Oriented Design.
Acesso em: 12/11/20. Disponível em:
<https://www.digitalocean.com/community/conceptual_articles/s-o-l-i-d-the-first-five-prin
ciples-of-object-oriented-design>.
[41]Loadtest. Acesso em: 12/11/20. Disponível em:
<https://github.com/alexfernandez/loadtest>.
[42]Artillery. Acesso em: 12/11/20. Disponível em: <https://artillery.io/>.
[43]Node.js. Acesso em: 12/11/20. Disponível em: <https://nodejs.org/en/>.
[44]Cloud Native Computing Foundation, CNCF WG-Serverless Whitepaper v1.0. Acesso
em: 16/11/20. Disponível em:
<https://github.com/cncf/wg-serverless/blob/master/whitepapers/serverless-overview/cncf
_serverless_whitepaper_v1.0.pdf>.
[45]InfluxData, InfluxDB. Acesso em: 15/11/20. Disponível em:
<https://www.influxdata.com/products/influxdb/>.
[46]GrafanaLabs, Grafana. Acesso em: 15/11/20. Disponível em: <https://grafana.com/>.
[47]BASILI, V. GQM approach has evolved to include models. IEEE SOFTWARE, v. 11, n.
1, p. 8-8, 1994.
[48]Zachary Tong. 2014. Averages Can Be Misleading: Try a Percentile. Acesso em:
16/11/20. Disponível em:
<https://www.elastic.co/blog/averages-can-dangerous-use-percentile>.
[49]Andrea Passwater. 2017. When (and why) not to go serverless. Acesso em: 07/12/20.
Disponível em: <https://www.serverless.com/blog/when-why-not-use-serverless>.
[50]STAPENHURST, Tim. The benchmarking book. Routledge, 2009.