<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[padz.dev]]></title><description><![CDATA[Engenharia de confiabilidade, carreira, system design e tudo ao redor disso.]]></description><link>https://blog.padz.dev</link><image><url>https://substackcdn.com/image/fetch/$s_!d0XQ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28f3aae4-c6f9-4a2b-9671-b0ff6175501a_512x512.png</url><title>padz.dev</title><link>https://blog.padz.dev</link></image><generator>Substack</generator><lastBuildDate>Sun, 19 Apr 2026 01:12:43 GMT</lastBuildDate><atom:link href="https://blog.padz.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Bruno Padilha]]></copyright><language><![CDATA[pt-br]]></language><webMaster><![CDATA[brunopadz@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[brunopadz@substack.com]]></itunes:email><itunes:name><![CDATA[Bruno Padilha]]></itunes:name></itunes:owner><itunes:author><![CDATA[Bruno Padilha]]></itunes:author><googleplay:owner><![CDATA[brunopadz@substack.com]]></googleplay:owner><googleplay:email><![CDATA[brunopadz@substack.com]]></googleplay:email><googleplay:author><![CDATA[Bruno Padilha]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Graceful Shutdown - Como não perder milhares de Reais em 5 minutos de deploy]]></title><description><![CDATA[Um guia completo para encerrar aplica&#231;&#245;es de forma controlada]]></description><link>https://blog.padz.dev/p/graceful-shutdown-como-nao-perder</link><guid isPermaLink="false">https://blog.padz.dev/p/graceful-shutdown-como-nao-perder</guid><dc:creator><![CDATA[Bruno Padilha]]></dc:creator><pubDate>Tue, 13 Jan 2026 13:03:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!d7B8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2be8574-b8ec-4d10-9785-75ebbd2f637a_2832x1772.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!d7B8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2be8574-b8ec-4d10-9785-75ebbd2f637a_2832x1772.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!d7B8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2be8574-b8ec-4d10-9785-75ebbd2f637a_2832x1772.jpeg 424w, https://substackcdn.com/image/fetch/$s_!d7B8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2be8574-b8ec-4d10-9785-75ebbd2f637a_2832x1772.jpeg 848w, https://substackcdn.com/image/fetch/$s_!d7B8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2be8574-b8ec-4d10-9785-75ebbd2f637a_2832x1772.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!d7B8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2be8574-b8ec-4d10-9785-75ebbd2f637a_2832x1772.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!d7B8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2be8574-b8ec-4d10-9785-75ebbd2f637a_2832x1772.jpeg" width="1456" height="911" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d2be8574-b8ec-4d10-9785-75ebbd2f637a_2832x1772.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:911,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:691631,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/184042490?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2be8574-b8ec-4d10-9785-75ebbd2f637a_2832x1772.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!d7B8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2be8574-b8ec-4d10-9785-75ebbd2f637a_2832x1772.jpeg 424w, https://substackcdn.com/image/fetch/$s_!d7B8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2be8574-b8ec-4d10-9785-75ebbd2f637a_2832x1772.jpeg 848w, https://substackcdn.com/image/fetch/$s_!d7B8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2be8574-b8ec-4d10-9785-75ebbd2f637a_2832x1772.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!d7B8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2be8574-b8ec-4d10-9785-75ebbd2f637a_2832x1772.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Foto por <a href="https://unsplash.com/@sydsujuaan?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Syd Sujuaan</a> no <a href="https://unsplash.com/photos/closeup-photo-of-rippling-sea-water-08I-aPLola0?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure></div><p>Imagina o seguinte cen&#225;rio: voc&#234; trabalha em um e-commerce com alto volume de tr&#225;fego e logo no in&#237;cio do ano a diretoria comercial junto ao marketing decide realizar uma mega promo&#231;&#227;o de queima de estoque de produtos que n&#227;o venderam na Black Friday, com desconto agressivo e prazo curto.</p><p>Tudo no ar, campanhas rodando em redes sociais, tr&#225;fego subindo, todo mundo animado. At&#233; que percebem que um c&#225;lculo errado de pre&#231;o est&#225; sendo aplicado em parte do cat&#225;logo, afetando diretamente alguns dos produtos da promo&#231;&#227;o.</p><p>N&#227;o tem muito o que discutir, &#233; preciso corrigir. A &#250;nica sa&#237;da &#233; um novo deploy para sanar o problema.</p><p>Seu time faz a corre&#231;&#227;o, o CI passa, o deploy come&#231;a. Minutos depois, o time de atendimento dispara no Slack dizendo que v&#225;rios clientes n&#227;o conseguiram finalizar compras nos &#250;ltimos 5 minutos, exatamente o tempo que levou para o rollout da nova vers&#227;o. Carrinhos abandonados, pagamentos falhando, reclama&#231;&#245;es p&#250;blicas. Clim&#227;o.</p><p>Voc&#234; come&#231;a a investigar e percebe que diversas requisi&#231;&#245;es simplesmente n&#227;o foram conclu&#237;das durante o deploy. Algumas morreram no meio do caminho. Outras nunca receberam resposta.</p><p>O que aconteceu? Sua aplica&#231;&#227;o morreu no meio de transa&#231;&#245;es ativas. Pedidos sendo processados foram abortados. Pagamentos ficaram em estados inconsistentes. Workers processando emails de confirma&#231;&#227;o morreram deixando eventos &#243;rf&#227;os no Kafka.</p><p>E agora? Como evitar que isso aconte&#231;a de novo?</p><p>&#201; aqui que entra o Graceful Shutdown, uma forma de encerrar uma aplica&#231;&#227;o de maneira controlada, garantindo que requisi&#231;&#245;es em andamento sejam conclu&#237;das antes do processo morrer.</p><h2>O que &#233; Graceful Shutdown de verdade?</h2><p>Graceful Shutdown &#233; um contrato operacional entre sua aplica&#231;&#227;o e o ambiente onde ela roda. Para satisfazer esse contrato, voc&#234; precisa garantir tr&#234;s coisas:</p><ol><li><p>N&#227;o aceitar novas requests e workloads: Encerrar o recebimento de novas requisi&#231;&#245;es HTTP; Parar de consumir mensagens de filas (Kafka, RabbitMQ, SQS); Sem derrubar conex&#245;es j&#225; estabelecidas com banco de dados ou cache;</p></li><li><p>Completar todo processamento: Aguardar que todas as requisi&#231;&#245;es ativas sejam conclu&#237;das; Processar mensagens que j&#225; foram retiradas da fila; Se ultrapassar um tempo aceit&#225;vel, responder com erro previs&#237;vel, n&#227;o timeout gen&#233;rico.</p></li><li><p>Liberar recursos: Encerrar conex&#245;es com bancos de dados; Commitar offsets do Kafka; Liberar locks de arquivos; Finalizar qualquer comunica&#231;&#227;o ativa com sistemas externos.</p></li></ol><p>Neste artigo, vou mostrar como implementar isso em Go, mas o conceito vale para qualquer linguagem, runtime ou plataforma de orquestra&#231;&#227;o.</p><h1>Como processos sabem que devem morrer?</h1><p>Antes de nos aprofundarmos em Graceful Shutdown, &#233; importante entender como processos s&#227;o &#8220;avisados&#8221; de que precisam parar. Vamos voltar ao cen&#225;rio do e-commerce, quando voc&#234; fez o deploy, o que exatamente aconteceu do ponto de vista do processo rodando no container?</p><h2>Sinais </h2><p>Em sistemas Unix-like, processos s&#227;o notificados atrav&#233;s de sinais. Sinais s&#227;o interrup&#231;&#245;es enviadas pelo sistema operacional (ou por outro processo) para notificar que algo relevante aconteceu e uma a&#231;&#227;o precisa ser tomada.</p><p>Quando um sinal &#233; entregue, o fluxo normal de execu&#231;&#227;o do processo &#233; interrompido para que ele possa reagir a esse evento.</p><p>Por&#233;m, nem todo processo reage da mesma forma a um sinal, e nem todo sinal permite rea&#231;&#227;o.</p><p>Existem tr&#234;s comportamentos poss&#237;veis:</p><h3>Signal handler</h3><p>Um signal handler &#233; uma fun&#231;&#227;o registrada pela aplica&#231;&#227;o para lidar com um sinal espec&#237;fico. Quando o sinal &#233; recebido, o processo n&#227;o morre automaticamente. Em vez disso, o handler &#233; executado, permitindo que a aplica&#231;&#227;o:</p><ul><li><p>Pare de aceitar novas requisi&#231;&#245;es;</p></li><li><p>Aguarde requisi&#231;&#245;es em andamento;</p></li><li><p>Libere recursos;</p></li><li><p>Finalize de forma controlada.</p></li></ul><h3>A&#231;&#227;o padr&#227;o (default action)</h3><p>Se a aplica&#231;&#227;o n&#227;o define um handler, o sistema operacional executa a a&#231;&#227;o padr&#227;o associada ao sinal e dependendo do sinal, essa a&#231;&#227;o pode ser:</p><ul><li><p>Encerrar o processo imediatamente;</p></li><li><p>Ignorar o sinal;</p></li><li><p>Parar (suspender) o processo.</p></li></ul><h3>Unblockable signals (sinais que n&#227;o podem ser tratados)</h3><p>Alguns sinais n&#227;o podem ser interceptados ou ignorados, independentemente do que a aplica&#231;&#227;o fa&#231;a. Os mais conhecidos s&#227;o <code>SIGKILL </code>e o <code>SIGSTOP</code>. Quando um desses sinais &#233; enviado, o processo morre imediatamente, sem chance de cleanup, sem handler, sem tempo de reagir.</p><h3>E em ambientes conteinerizados?</h3><p>No Kubernetes, o processo normalmente recebe um <code>SIGTERM</code> antes de qualquer coisa mais agressiva. Esse &#233; como se fosse um &#250;ltimo aviso educado para a aplica&#231;&#227;o.</p><p>Se a aplica&#231;&#227;o n&#227;o trata <code>SIGTERM</code> ou demora mais do que o tempo configurado, o orquestrador envia um <code>SIGKILL</code> e a sua aplica&#231;&#227;o cai.</p><h2>Voltando ao cen&#225;rio do deploy com bug de pre&#231;o</h2><pre><code>15:29:58 - Deploy iniciado
15:30:00 - Kubernetes envia SIGTERM para Pod antigo
15:30:00 - Sua aplica&#231;&#227;o IGNORA o sinal (n&#227;o tem handler)
15:30:00 - Runtime do Go encerra processo imediatamente
15:30:00 - 47 requisi&#231;&#245;es HTTP ativas abortadas
15:30:00 - 12 mensagens Kafka meio processadas
15:30:00 - 3 workers gerando relat&#243;rios mortos
15:30:01 - Time de atendimento come&#231;a a receber reclama&#231;&#245;es</code></pre><h3>O erro comum</h3><p>Muitos times acham que &#8220;Graceful Shutdown &#233; coisa do Kubernetes&#8221; ou do load balancer, a real &#233; que n&#227;o &#233;.</p><p>O Graceful Shutdown come&#231;a dentro da aplica&#231;&#227;o, no momento em que ela decide o que fazer ao receber um sinal.</p><h1>Lidando com sinais em Go</h1><p>Quando uma aplica&#231;&#227;o Go inicia, antes mesmo da fun&#231;&#227;o<strong> </strong><code>main</code><strong> </strong>rodar, o runtime registra handlers para v&#225;rios sinais do sistema operacional. Esses handlers existem para garantir que o processo termine de forma previs&#237;vel.</p><p>Por&#233;m, para Graceful Shutdown, quase tudo &#233; ru&#237;do. Na pr&#225;tica, tr&#234;s sinais concentram 99% dos cen&#225;rios reais:</p><ul><li><p><code>SIGTERM</code>: Indica que o processo deve encerrar. &#201; o sinal enviado por orquestradores como Kubernetes durante deploys, scale down ou evictions. Ele pode e deve ser tratado pela aplica&#231;&#227;o;</p></li><li><p><code>SIGINT</code>: Normalmente enviado quando algu&#233;m pressiona <code>Ctrl+C</code> no terminal. O comportamento esperado &#233; encerrar de forma limpa, assim como no <code>SIGTERM</code>;</p></li><li><p><code>SIGHUP</code>: Historicamente &#233; um sinal utilizado para indicar fechamento de terminal. Hoje em dia, ele costuma ser usado para recarregar configs.</p></li></ul><p>Por padr&#227;o, ao receber qualquer um desses sinais, o runtime do Go encerra o processo imediatamente. Isso significa que:</p><ul><li><p>Requisi&#231;&#245;es em andamento s&#227;o abortadas;</p></li><li><p>Conex&#245;es s&#227;o fechadas sem aviso;</p></li><li><p>O sistema externo que chamou sua aplica&#231;&#227;o n&#227;o vai receber a resposta.</p></li></ul><p>Para mudar esse comportamento, &#233; necess&#225;rio interceptar os sinais usando o pacote <code>os/signal</code>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xsRp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcca73810-42c1-4305-bcbe-7618d203aa5f_1240x1498.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xsRp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcca73810-42c1-4305-bcbe-7618d203aa5f_1240x1498.png 424w, https://substackcdn.com/image/fetch/$s_!xsRp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcca73810-42c1-4305-bcbe-7618d203aa5f_1240x1498.png 848w, https://substackcdn.com/image/fetch/$s_!xsRp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcca73810-42c1-4305-bcbe-7618d203aa5f_1240x1498.png 1272w, https://substackcdn.com/image/fetch/$s_!xsRp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcca73810-42c1-4305-bcbe-7618d203aa5f_1240x1498.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xsRp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcca73810-42c1-4305-bcbe-7618d203aa5f_1240x1498.png" width="590" height="712.758064516129" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cca73810-42c1-4305-bcbe-7618d203aa5f_1240x1498.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1498,&quot;width&quot;:1240,&quot;resizeWidth&quot;:590,&quot;bytes&quot;:215407,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/184042490?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcca73810-42c1-4305-bcbe-7618d203aa5f_1240x1498.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xsRp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcca73810-42c1-4305-bcbe-7618d203aa5f_1240x1498.png 424w, https://substackcdn.com/image/fetch/$s_!xsRp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcca73810-42c1-4305-bcbe-7618d203aa5f_1240x1498.png 848w, https://substackcdn.com/image/fetch/$s_!xsRp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcca73810-42c1-4305-bcbe-7618d203aa5f_1240x1498.png 1272w, https://substackcdn.com/image/fetch/$s_!xsRp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcca73810-42c1-4305-bcbe-7618d203aa5f_1240x1498.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Basicamente, <code>signal.NotifyContext</code> (dispon&#237;vel desde o Go 1.16) faz com que o runtime notifique os sinais para um contexto ao inv&#233;s de executar o comportamento padr&#227;o, permitindo que voc&#234; configure a melhor forma de prevenir que a aplica&#231;&#227;o termine de forma abrupta.</p><h2>Timeout n&#227;o &#233; detalhe</h2><p>Graceful Shutdown n&#227;o acontece no seu tempo, acontece no tempo que o ambiente permite.</p><p>Quando sua aplica&#231;&#227;o recebe um sinal de encerramento, existe um rel&#243;gio invis&#237;vel rodando. Se ele zerar antes do seu cleanup terminar, o sistema simplesmente mata o processo.</p><p>No Kubernetes, por exemplo, o comportamento padr&#227;o &#233; o seguinte:</p><ul><li><p>Ao iniciar um deploy, scale down ou eviction, o Pod recebe um <code>SIGTERM</code>;</p></li><li><p>A partir desse momento, come&#231;a a contar o valor que &#233; especificado no <code>terminationGracePeriodSeconds</code>, que por padr&#227;o s&#227;o 30 segundos - <a href="https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/">doc</a>;</p></li><li><p>Se o processo ainda estiver vivo ao final desse per&#237;odo, o Kubernetes envia um <code>SIGKILL</code>.</p></li></ul><p>E aqui n&#227;o tem negocia&#231;&#227;o, o <code>SIGKILL</code> n&#227;o pode ser interceptado, tratado ou ignorado. O processo morre imediatamente, no estado em que estiver. </p><p>Isso significa que toda a sua l&#243;gica de shutdown precisa caber dentro dessa janela:</p><ul><li><p>Concluindo requisi&#231;&#245;es em andamento;</p></li><li><p>Respondendo erros controlados se necess&#225;rio;</p></li><li><p>Liberando conex&#245;es;</p></li><li><p>Finalizar goroutines e workers.</p></li></ul><p>No cen&#225;rio do e-commerce, se voc&#234; tem:</p><ul><li><p>Requisi&#231;&#245;es HTTP de checkout que levam 5-8 segundos (valida&#231;&#227;o de estoque, pagamento, nota fiscal);</p></li><li><p>Workers processando emiss&#227;o de Notas Fiscais que levam 10-15 segundos;</p></li><li><p>Consumidor Kafka commitando offsets em batch a cada 30 segundos.</p></li></ul><p>Voc&#234; tem um baita de um problema. O shutdown padr&#227;o de 30s n&#227;o vai dar conta.</p><h2>Parando de receber requisi&#231;&#245;es: HTTP Server</h2><p>Vamos come&#231;ar pelo b&#225;sico, fazer o servidor HTTP parar de aceitar novas requisi&#231;&#245;es. </p><p>O pacote <code>net/http</code> possui o m&#233;todo <code>http.Server.Shutdown(ctx)</code> que implementa Graceful Shutdown nativamente. Ele para de aceitar novas conex&#245;es, aguarda as requisi&#231;&#245;es em andamento completarem (respeitando o contexto passado) e ent&#227;o fecha as conex&#245;es idle. Veja um exemplo <a href="https://github.com/brunopadz/signals-go/blob/main/http.go">aqui</a>.</p><p>Se voc&#234; usa <a href="https://gin-gonic.com/en/">Gin</a>, ele n&#227;o possui m&#233;todo pr&#243;prio, voc&#234; usa o <code>http.Server.Shutdown</code> diretamente, j&#225; que Gin &#233; apenas um wrapper em cima do <code>net/http</code>. Exemplo <a href="https://github.com/brunopadz/signals-go/blob/main/gin.go">aqui</a>.</p><p>J&#225; se voc&#234; usa o <a href="https://gofiber.io/">Fiber</a> (minha escolha pessoal), ele tem seu pr&#243;prio m&#233;todo, o <code>app.ShutdownWithContext(ctx)</code> porque usa o <a href="https://github.com/valyala/fasthttp">fasthttp</a> por baixo e n&#227;o o <code>net/http</code>. <a href="https://github.com/brunopadz/signals-go/blob/main/fiber.go">Exemplo</a>.</p><h3>Comportamento comum aos tr&#234;s</h3><p>Independte da implemente, framework, o comportamento &#233; o mesmo:</p><ul><li><p>Param de aceitar novas conex&#245;es imediatamente;</p></li><li><p>Aguardam requisi&#231;&#245;es ativas finalizarem (com timeout do contexto);</p></li><li><p>Fecham conex&#245;es idle;</p></li><li><p>Por&#233;m, n&#227;o garantem que requisi&#231;&#245;es v&#227;o completar se o timeout do contexto expirar.</p></li></ul><h3>O problema do Kubernetes</h3><p>J&#225; no Kubernetes, mesmo ap&#243;s o Pod ser marcado para termination, o kube-proxy pode demorar alguns segundos (~5-10s) para atualizar as regras de iptables e remover o Pod dos endpoints do Service. </p><p>Durante essa janela, voc&#234; ainda pode receber tr&#225;fego. O que acontece:</p><pre><code>15:30:00 - SIGTERM enviado 
15:30:00 - app.Shutdown() chamado imediatamente 
15:30:00 - Servidor para de aceitar conex&#245;es 
15:30:01 - Cliente tenta conectar &#8594; Connection refused 
15:30:02 - Cliente tenta conectar &#8594; Connection refused 
15:30:05 - kube-proxy finalmente atualiza iptables 
15:30:05 - Agora sim, tr&#225;fego para de chegar</code></pre><p>O resultado s&#227;o clientes recebendo erros 5xx.</p><p>Uma boa solu&#231;&#227;o &#233; implementar um delay antes de chamar o Shutdown:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!d8B7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef82586c-e20b-45a6-97ab-8dec159ae9c0_1240x864.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!d8B7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef82586c-e20b-45a6-97ab-8dec159ae9c0_1240x864.png 424w, https://substackcdn.com/image/fetch/$s_!d8B7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef82586c-e20b-45a6-97ab-8dec159ae9c0_1240x864.png 848w, https://substackcdn.com/image/fetch/$s_!d8B7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef82586c-e20b-45a6-97ab-8dec159ae9c0_1240x864.png 1272w, https://substackcdn.com/image/fetch/$s_!d8B7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef82586c-e20b-45a6-97ab-8dec159ae9c0_1240x864.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!d8B7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef82586c-e20b-45a6-97ab-8dec159ae9c0_1240x864.png" width="1240" height="864" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef82586c-e20b-45a6-97ab-8dec159ae9c0_1240x864.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:864,&quot;width&quot;:1240,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:159251,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/184042490?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef82586c-e20b-45a6-97ab-8dec159ae9c0_1240x864.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!d8B7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef82586c-e20b-45a6-97ab-8dec159ae9c0_1240x864.png 424w, https://substackcdn.com/image/fetch/$s_!d8B7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef82586c-e20b-45a6-97ab-8dec159ae9c0_1240x864.png 848w, https://substackcdn.com/image/fetch/$s_!d8B7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef82586c-e20b-45a6-97ab-8dec159ae9c0_1240x864.png 1272w, https://substackcdn.com/image/fetch/$s_!d8B7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef82586c-e20b-45a6-97ab-8dec159ae9c0_1240x864.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>E agora o fluxo ficaria algo assim:</p><pre><code>15:30:00 - SIGTERM recebido
15:30:00 - Aplica&#231;&#227;o aguarda 10s (delay intencional)
15:30:05 - kube-proxy atualiza iptables
15:30:10 - app.Shutdown() chamado
15:30:10 - Servidor para de aceitar conex&#245;es (mas n&#227;o chega mais tr&#225;fego)
15:30:12 - Requisi&#231;&#245;es ativas completadas
15:30:12 - Servidor encerrado </code></pre><h2>O que voc&#234; esqueceu de desligar</h2><p>Voc&#234; implementou <code>http.Server.Shutdown</code>, testou localmente, fez deploy em produ&#231;&#227;o. Tudo funcionando. At&#233; que numa ter&#231;a-feira &#224;s 3 da manh&#227; voc&#234; recebe um alerta: mensagens duplicadas no Kafka, jobs incompletos no banco, relat&#243;rios corrompidos.</p><p>O que aconteceu? Seu servidor HTTP morreu corretamente com Graceful Shutdown, mas o resto da aplica&#231;&#227;o morreu no meio do caminho.</p><h3>O problema real</h3><p>Aplica&#231;&#245;es n&#227;o s&#227;o s&#243; servidores HTTP. Elas t&#234;m:</p><ul><li><p>Consumidores de fila processando eventos ass&#237;ncronos;</p></li><li><p>Workers em background gerando relat&#243;rios, enviando emails, processando uploads;</p></li><li><p>Jobs agendados fazendo limpeza, sincroniza&#231;&#227;o, c&#225;lculos peri&#243;dicos;</p></li><li><p>Conex&#245;es persistentes com bancos, caches, message brokers.</p></li></ul><p>Quando voc&#234; faz Graceful Shutdown apenas do servidor HTTP, esses componentes continuam rodando at&#233; o SIGKILL chegar (~30s depois no Kubernetes). O resultado:</p><pre><code><code>15:30:00 - SIGTERM recebido
15:30:00 - HTTP server para de aceitar requests
15:30:02 - HTTP server finaliza &#250;ltimas requisi&#231;&#245;es
15:30:02 - HTTP server encerrado 
15:30:02 - Kafka consumer ainda processando pedido #8472
           &#8627; Validando estoque, reservando produtos...
15:30:15 - Worker ainda gerando nota fiscal do pedido #8480
           &#8627; PDF 70% completo, gravando no S3...
15:30:20 - Job de sincroniza&#231;&#227;o com ERP ainda rodando
           &#8627; Atualizando 4.823 produtos de 10.000...
15:30:30 - SIGKILL &#8594; tudo morre abruptamente
           &#8627; Pedido #8472: estoque reservado mas n&#227;o commitado no Kafka
           &#8627; Nota fiscal #8480: PDF corrompido no S3
           &#8627; Sincroniza&#231;&#227;o ERP: estado inconsistente</code></code></pre><p>A sequ&#234;ncia de shutdown tamb&#233;m &#233; importante. Voc&#234; precisa respeitar as depend&#234;ncias entre componentes: </p><h3>Fase 1</h3><p>Primeiro voc&#234; impede que novos processamentos ocorram no sistema:</p><ol><li><p>HTTP Server para de aceitar requisi&#231;&#245;es;</p></li><li><p>Kafka Consumer para de consumir novos eventos;</p></li><li><p>Jobs agendados devem ser cancelados.</p></li></ol><p>A ideia de fazer nessa ordem &#233; porque o servidor HTTP pode enfileirar eventos no Kafka, e o Kafka pode disparar jobs. Se voc&#234; parar o Kafka antes do HTTP, requisi&#231;&#245;es v&#227;o falhar ao tentar publicar os eventos.</p><h3>Fase 2</h3><p>Aqui a ideia &#233; finalizar todo processamento que est&#225; em andamento:</p><ol><li><p>Requisi&#231;&#245;es HTTP ativas, por exemplo: checkout, pagamento;</p></li><li><p>Kafka Consumers: Finaliza processamento, commita offsets;</p></li><li><p>Workers: Completa gera&#231;&#227;o de Notas Fiscais, envio de e-mails;</p></li><li><p>Jobs: Termina sincroniza&#231;&#227;o com ERP.</p></li></ol><h3>Fase 3</h3><p>Por fim, voc&#234; a aplica&#231;&#227;o deve liberar conex&#245;es com recursos externos:</p><ol><li><p>Fecha conex&#245;es com o Kafka, tanto de producer quanto consumer;</p></li><li><p>Encerra conex&#227;o com o banco de dados;</p></li><li><p>Encerra conex&#227;o com o Redis, memcached ou qualquer outro sistema de cache;</p></li><li><p>Libera locks de arquivos.</p></li></ol><p>Essa ordem importa, por que se voc&#234; fechar a conex&#227;o com o banco de dados enquanto os workers ainda est&#227;o salvando Notas Fiscais, voc&#234; ver&#225; um connection closed do nada. Se fechar a conex&#227;o com o Kafka antes de commitar os offsets, vai ter que reprocessar mensagens.</p><p>Exemplo:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SMeF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389b5c11-4215-4975-8fea-81de0dbb208b_1240x790.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SMeF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389b5c11-4215-4975-8fea-81de0dbb208b_1240x790.png 424w, https://substackcdn.com/image/fetch/$s_!SMeF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389b5c11-4215-4975-8fea-81de0dbb208b_1240x790.png 848w, https://substackcdn.com/image/fetch/$s_!SMeF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389b5c11-4215-4975-8fea-81de0dbb208b_1240x790.png 1272w, https://substackcdn.com/image/fetch/$s_!SMeF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389b5c11-4215-4975-8fea-81de0dbb208b_1240x790.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SMeF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389b5c11-4215-4975-8fea-81de0dbb208b_1240x790.png" width="1240" height="790" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/389b5c11-4215-4975-8fea-81de0dbb208b_1240x790.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:790,&quot;width&quot;:1240,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:159950,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/184042490?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389b5c11-4215-4975-8fea-81de0dbb208b_1240x790.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SMeF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389b5c11-4215-4975-8fea-81de0dbb208b_1240x790.png 424w, https://substackcdn.com/image/fetch/$s_!SMeF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389b5c11-4215-4975-8fea-81de0dbb208b_1240x790.png 848w, https://substackcdn.com/image/fetch/$s_!SMeF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389b5c11-4215-4975-8fea-81de0dbb208b_1240x790.png 1272w, https://substackcdn.com/image/fetch/$s_!SMeF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F389b5c11-4215-4975-8fea-81de0dbb208b_1240x790.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Goroutines tamb&#233;m precisam saber a hora de morrer</h2><p>Outro ponto ignorado com frequ&#234;ncia: goroutines n&#227;o morrem sozinhas.</p><p>Quando o processo recebe um <code>SIGTERM</code>:</p><ul><li><p>O runtime n&#227;o cancela goroutines automaticamente;</p></li><li><p>Loops infinitos continuam rodando;</p></li><li><p>Workers bloqueados continuam bloqueados.</p></li></ul><p>Se voc&#234; n&#227;o tem um mecanismo claro de cancelamento (normalmente via <code>context.Context</code>), voc&#234; est&#225; acreditando que o processo vai morrer r&#225;pido o suficiente, ou o orquestrador vai mandar <code>SIGKILL</code>.</p><p>Nenhuma das duas op&#231;&#245;es &#233; uma boa estrat&#233;gia.</p><p>Uma boa aqui &#233; utilizar context-aware goroutine, <a href="https://github.com/brunopadz/signals-go/blob/main/goroutines_1.go">exemplo</a>. Agora caso voc&#234; tem v&#225;rias goroutines, use <code>sync.WaitGroup</code> para aguardar todas finalizarem, <a href="https://github.com/brunopadz/signals-go/blob/main/goroutines_2.go">exemplo</a>.</p><p>Toda goroutine de longa dura&#231;&#227;o deveria responder a cancelamento. Se ela n&#227;o sabe quando parar, ela &#233; provavelmente &#233; um leak.</p><h2>Shutdown precisa ser previs&#237;vel, n&#227;o best effort</h2><p>Muita gente implementa shutdown como algo &#8220;best effort&#8221;, tenta fechar tudo e torce para dar tempo e isso &#233; fr&#225;gil.</p><p>O shutdown precisa ter:</p><ul><li><p>Ordem clara, o que encerra antes do qu&#234;;</p></li><li><p>Limites de tempo expl&#237;citos;</p><ul><li><p>Lembra das fases que citei acima?</p></li></ul></li><li><p>Fallback bem definido. O que acontece se algo n&#227;o for encerrado conforme esperado?</p></li></ul><p>Esses tempos precisam ser mensurados e testados. Uma dica aqui &#233; adicionar uma gordura. Voltando ao nosso cen&#225;rio:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o48I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ea64a3-6060-4851-b254-d8879b79f796_938x695.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o48I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ea64a3-6060-4851-b254-d8879b79f796_938x695.png 424w, https://substackcdn.com/image/fetch/$s_!o48I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ea64a3-6060-4851-b254-d8879b79f796_938x695.png 848w, https://substackcdn.com/image/fetch/$s_!o48I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ea64a3-6060-4851-b254-d8879b79f796_938x695.png 1272w, https://substackcdn.com/image/fetch/$s_!o48I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ea64a3-6060-4851-b254-d8879b79f796_938x695.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o48I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ea64a3-6060-4851-b254-d8879b79f796_938x695.png" width="673" height="498.6513859275053" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e0ea64a3-6060-4851-b254-d8879b79f796_938x695.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:695,&quot;width&quot;:938,&quot;resizeWidth&quot;:673,&quot;bytes&quot;:158978,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/184042490?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ea64a3-6060-4851-b254-d8879b79f796_938x695.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!o48I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ea64a3-6060-4851-b254-d8879b79f796_938x695.png 424w, https://substackcdn.com/image/fetch/$s_!o48I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ea64a3-6060-4851-b254-d8879b79f796_938x695.png 848w, https://substackcdn.com/image/fetch/$s_!o48I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ea64a3-6060-4851-b254-d8879b79f796_938x695.png 1272w, https://substackcdn.com/image/fetch/$s_!o48I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ea64a3-6060-4851-b254-d8879b79f796_938x695.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Vamos relembrar que o <code>terminationGracePeriodSeconds</code> por padr&#227;o no Kubernetes s&#227;o 30 segundos, mas a soma das nossas fases d&#225; ~35s. Isso &#233; intencional, voc&#234; quer que todas fases termine antes do <code>SIGKILL</code>.</p><p>Voc&#234; pode muito bem configurar o lifecycle do seu Deployment/Pod atrav&#233;s do par&#226;metro <code>terminationGracePeriodSeconds</code> e utilizar o <code>preStop</code> hook. </p><h2>Observe o shutdown como um evento cr&#237;tico</h2><p>Outro erro recorrente, o shutdown n&#227;o &#233; observado.</p><p>Em produ&#231;&#227;o, voc&#234; deveria conseguir responder:</p><ul><li><p>Quanto tempo o shutdown levou?</p></li><li><p>Q que demorou mais?</p></li><li><p>Quantas requisi&#231;&#245;es foram abortadas?</p></li><li><p>Houve timeout?</p></li></ul><p>Sem logs claros e m&#233;tricas, o shutdown vira um buraco negro. Quando algo d&#225; errado, ningu&#233;m sabe o real motivo.</p><p>Talvez esse seja o grande ponto de reflex&#227;o do meu post, Graceful Shutdown &#233; um evento operacional importante, n&#227;o um detalhe de implementa&#231;&#227;o.</p><h3>Dicas para mensurar</h3><ul><li><p>Atrav&#233;s m&#233;tricas para mensurar o tempo de dura&#231;&#227;o do shutdown;;</p></li><li><p>Atrav&#233;s de logs contendo dura&#231;&#227;o, quantas requests estavam ativas, quantos jobs estavam pendentes;</p></li><li><p>Crie uma dashboard para monitorar esses tempos, com dura&#231;&#227;o do shutdown, quantos shutdowns foram bem sucedidos, a dura&#231;&#227;o por fase e quantas requests foram abortadas;</p></li><li><p>Alerte apenas em casos cr&#237;ticos. Quando o shutdown est&#225; pr&#243;ximo dos 30s ou do valor que voc&#234; definir do <code>terminationGracePeriodSeconds</code>.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4Lda!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93f0fe0f-31e1-441d-ae5c-80a33dc2935f_1240x790.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4Lda!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93f0fe0f-31e1-441d-ae5c-80a33dc2935f_1240x790.png 424w, https://substackcdn.com/image/fetch/$s_!4Lda!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93f0fe0f-31e1-441d-ae5c-80a33dc2935f_1240x790.png 848w, https://substackcdn.com/image/fetch/$s_!4Lda!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93f0fe0f-31e1-441d-ae5c-80a33dc2935f_1240x790.png 1272w, https://substackcdn.com/image/fetch/$s_!4Lda!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93f0fe0f-31e1-441d-ae5c-80a33dc2935f_1240x790.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4Lda!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93f0fe0f-31e1-441d-ae5c-80a33dc2935f_1240x790.png" width="630" height="401.3709677419355" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93f0fe0f-31e1-441d-ae5c-80a33dc2935f_1240x790.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:790,&quot;width&quot;:1240,&quot;resizeWidth&quot;:630,&quot;bytes&quot;:125370,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/184042490?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93f0fe0f-31e1-441d-ae5c-80a33dc2935f_1240x790.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4Lda!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93f0fe0f-31e1-441d-ae5c-80a33dc2935f_1240x790.png 424w, https://substackcdn.com/image/fetch/$s_!4Lda!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93f0fe0f-31e1-441d-ae5c-80a33dc2935f_1240x790.png 848w, https://substackcdn.com/image/fetch/$s_!4Lda!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93f0fe0f-31e1-441d-ae5c-80a33dc2935f_1240x790.png 1272w, https://substackcdn.com/image/fetch/$s_!4Lda!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93f0fe0f-31e1-441d-ae5c-80a33dc2935f_1240x790.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Exemplo de m&#233;tricas</figcaption></figure></div><p></p><h3>N&#227;o teste s&#243; quando d&#225; problema</h3><p>Shutdown precisa ser testado:</p><ul><li><p>Localmente durante desenvolvimento;</p></li><li><p>Em staging antes de subir pra produ&#231;&#227;o;</p></li><li><p>Sob carga com tr&#225;fego real;</p></li><li><p>Com lat&#234;ncia que possa simular depend&#234;ncias lentas;</p></li><li><p>Com depend&#234;ncias como banco de dados e Kafka falhando.</p></li></ul><p>Quanto antes voc&#234; falhar, mais barato &#233; corrigir.</p><h1>Conclus&#227;o</h1><p>Graceful Shutdown n&#227;o &#233; uma feature opcional nem um detalhe de infraestrutura.<br>Ele &#233; parte do contrato da aplica&#231;&#227;o com o ambiente onde ela roda.</p><p>Se voc&#234; ignora:</p><ul><li><p>Sinais do sistema operacional;</p></li><li><p>Limites de tempo impostos pelo orquestrador;</p></li><li><p>Requisi&#231;&#245;es em andamento;</p></li><li><p>Goroutines e workers;</p></li></ul><p>O sistema vai continuar funcionando, at&#233; o dia em que o deploy custar dinheiro, reputa&#231;&#227;o ou ambos.</p><h2>Pr&#243;ximos passos</h2><p>Se voc&#234; ainda n&#227;o tem Graceful Shutdown:</p><ol><li><p>Comece pelo b&#225;sico interceptando <code>SIGTERM</code> e <code>SIGINT</code>;</p></li><li><p>Implemente shutdown do servidor HTTP;</p></li><li><p>Identifique todos os componentes concorrentes (Kafka, workers, jobs);</p></li><li><p>Implemente shutdown coordenado respeitando depend&#234;ncias;</p></li><li><p>Adicione logs e m&#233;tricas;</p></li><li><p>Teste localmente com <code>Ctrl+C</code>;</p></li><li><p>Teste em staging sob carga;</p></li><li><p>Fa&#231;a rollout gradual em produ&#231;&#227;o;</p></li><li><p>Monitore e ajuste timeouts baseado em dados reais.</p></li></ol><p>Se voc&#234; j&#225; tem Graceful Shutdown:</p><ol><li><p>Revise a ordem, ela respeita depend&#234;ncias?;</p></li><li><p>Me&#231;a os timeouts;</p></li><li><p>Adicione observabilidade;</p></li><li><p>Teste sob condi&#231;&#245;es adversas;</p></li><li><p>Configure alertas;</p></li><li><p>Documente.</p></li></ol><div><hr></div><p>Fiquem a vontade para comentar suas solu&#231;&#245;es, como voc&#234;s implementam ou se possuem d&#250;vidas sobre o tema.</p><p>At&#233; mais!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.padz.dev/p/graceful-shutdown-como-nao-perder?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Compartilhar&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.padz.dev/p/graceful-shutdown-como-nao-perder?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Compartilhar</span></a></p>]]></content:encoded></item><item><title><![CDATA[Evitando bolhas de negatividade]]></title><description><![CDATA[O conselho de carreira que ningu&#233;m quer ouvir, mas todo mundo precisa.]]></description><link>https://blog.padz.dev/p/evitando-bolhas-de-negatividade</link><guid isPermaLink="false">https://blog.padz.dev/p/evitando-bolhas-de-negatividade</guid><dc:creator><![CDATA[Bruno Padilha]]></dc:creator><pubDate>Tue, 23 Dec 2025 12:48:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!288p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F520da97c-9443-47b7-a575-5c4ebb78b1ee_6000x4000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!288p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F520da97c-9443-47b7-a575-5c4ebb78b1ee_6000x4000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!288p!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F520da97c-9443-47b7-a575-5c4ebb78b1ee_6000x4000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!288p!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F520da97c-9443-47b7-a575-5c4ebb78b1ee_6000x4000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!288p!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F520da97c-9443-47b7-a575-5c4ebb78b1ee_6000x4000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!288p!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F520da97c-9443-47b7-a575-5c4ebb78b1ee_6000x4000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!288p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F520da97c-9443-47b7-a575-5c4ebb78b1ee_6000x4000.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/520da97c-9443-47b7-a575-5c4ebb78b1ee_6000x4000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2486878,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/181440566?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F520da97c-9443-47b7-a575-5c4ebb78b1ee_6000x4000.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!288p!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F520da97c-9443-47b7-a575-5c4ebb78b1ee_6000x4000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!288p!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F520da97c-9443-47b7-a575-5c4ebb78b1ee_6000x4000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!288p!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F520da97c-9443-47b7-a575-5c4ebb78b1ee_6000x4000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!288p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F520da97c-9443-47b7-a575-5c4ebb78b1ee_6000x4000.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Foto por <a href="https://unsplash.com/@pawel_czerwinski?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Pawel Czerwinski</a> no <a href="https://unsplash.com/photos/a-black-background-with-a-blue-wave-of-light-eybM9n4yrpE?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure></div><p>Esse post &#233; baseado em <a href="https://brooker.co.za/blog/2025/06/20/career.html">um dos melhores artigos</a> que li esse ano e que tenho tentado seguir. Sim, &#233; um exerc&#237;cio constante e para mudar esse comportamento leva tempo. Afinal, somos humanos e reclamar &#233; inerente. </p><p>No texto do <a href="https://brooker.co.za/blog/">Marc Brooker</a>, ele toca em um ponto que a maioria das pessoas prefere ignorar (ou que n&#227;o se atentaram ainda), que s&#227;o as pessoas e grupos que voc&#234; escolhe ouvir, dar aten&#231;&#227;o e participar moldam de forma silenciosa a sua ambi&#231;&#227;o, a sua energia e a sua capacidade de evolu&#231;&#227;o.</p><p>E uma grande verdade &#233; que se voc&#234; passa tempo demais em ambientes e/ou grupos onde o normal &#233; reclamar, voc&#234; vira parte do problema, mesmo achando que est&#225; s&#243; desabafando.</p><h2><strong>Evitando o ru&#237;do negativo</strong></h2><blockquote><p>&#8220;If I could offer you a single piece of career advice, it&#8217;s this: avoid negativity echo chambers.&#8221;</p></blockquote><p>Grupos onde a reclama&#231;&#227;o reina v&#227;o drenar sua capacidade de pensar com clareza e ser&#225; criada uma distor&#231;&#227;o onde todo desafio parece muito complicado, toda empresa &#233; t&#243;xica e todo l&#237;der &#233; incompetente.</p><p>Voc&#234; pode n&#227;o perceber, mas a sua ambi&#231;&#227;o &#233; enfraquecida por osmose.</p><p>E a verdade &#233; simples, pessoas que vivem reclamando n&#227;o progridem e tamb&#233;m n&#227;o querem que voc&#234; progrida.</p><p>E &#233; a&#237; que o pessimismo em grupo vira identidade.</p><blockquote><p>&#8220;Sometimes, it becomes a cultural norm&#8230; pessimistic people end up dominating.&#8221;</p></blockquote><p>Essa &#233; a real, quando a negatividade vira a linguagem comum, quem tenta construir algo novo se torna o ing&#234;nuo que n&#227;o conhece o ambiente que trabalha.</p><p>E na minha opini&#227;o, esse tipo de grupo/comunidade &#233; bem confort&#225;vel para quem desistiu silenciosamente da pr&#243;pria evolu&#231;&#227;o. Se voc&#234; est&#225; cercado disso, voc&#234; com certeza j&#225; sabe. E sabe tamb&#233;m que, quanto mais tempo passa, mais dif&#237;cil se desligar dessas comunidades.</p><p>Outra grande verdade &#233; que reclamar com pares tamb&#233;m n&#227;o adianta e essa &#233; uma das frases mais verdadeiras do texto:</p><blockquote><p>&#8220;DMing away about how much things suck doesn&#8217;t make change.&#8221;</p></blockquote><p>Sair mandando mensagem privada para seus pares pode criar a sensa&#231;&#227;o de a&#231;&#227;o, mas a real &#233; que n&#227;o. Ainda mais se &#233; um problema cultural e/ou estrutural da empresa. No fim, &#233; autoengano com um custo emocional alto.</p><p>Quando voc&#234; passa um tempo demais alimentando essas conversas de bastidores, est&#225; tentando dizer para si mesmo que est&#225; tentando melhorar&#8230; mas, na pr&#225;tica, s&#243; est&#225; mantendo o status quo. &#201; um v&#237;cio que parece inofensivo, mas destr&#243;i clareza e motiva&#231;&#227;o.</p><p>Vale ressaltar que o oposto tamb&#233;m &#233; prejudicial:</p><blockquote><p>&#8220;Positive echo chambers can be bad too.&#8221;</p></blockquote><p>Sim, entusiasmo e positivismo cego &#233; t&#227;o t&#243;xico quanto o pessimismo cr&#244;nico. O ponto central n&#227;o &#233; ser positivo e good vibes o tempo todo. &#201; ter clareza da situa&#231;&#227;o. </p><p>Todo esse otimismo sem a&#231;&#227;o gera ilus&#227;o e a negatividade sem a&#231;&#227;o gera corros&#227;o e entre esses dois extremos est&#225; o &#250;nico caminho que importa, a realidade com movimento.</p><h2><strong>E como sair desse ciclo?</strong></h2><p>O Marc prop&#245;e algo bem direto:</p><blockquote><p>&#8220;If more than 20% of the content is negative, I move on.&#8221; </p></blockquote><p>Marc tamb&#233;m define um limite objetivo para se livrar desses ambientes e voc&#234; n&#227;o precisa se explicar, n&#227;o precisa convencer ningu&#233;m, &#233; s&#243; sair. Se voc&#234; est&#225; consumindo e interagindo de forma negativa mais de 20% do seu tempo ou mais de 20% das conversas s&#227;o s&#243; reclama&#231;&#245;es, voc&#234; j&#225; sabe o que isso est&#225; fazendo com seu c&#233;rebro e com seu &#226;nimo.</p><p>Meu conselho aqui &#233; fazer uma reflex&#227;o do que voc&#234; consome em m&#237;dias sociais (principalmente LinkedIn) e em grupos/comunidades que voc&#234; participa hoje e se voc&#234; achar que &#233; t&#243;xico, saia. Novamente, voc&#234; n&#227;o precisa se explicar, nem convencer ningu&#233;m. </p><p>Outra sa&#237;da &#233; onde voc&#234; vai e deve colocar sua energia:</p><blockquote><p>&#8220;Spend your energy at work doing great work and improving. Or, do the minimum and disconnect.&#8221;</p></blockquote><p>Em uma tradu&#231;&#227;o livre &#8220;Gaste sua energia no trabalho fazendo um trabalho bacana e sempre melhorando, ou fa&#231;a o m&#237;nimo e desconecte&#8221; e ponto final.</p><p>Esse clima morno onde voc&#234; nem cresce, nem descansa e nem se preserva n&#227;o leva a nada, s&#243; estagna&#231;&#227;o.</p><p>Se quer evoluir, aprenda, construa, se exponha ao que te desafia. Se aproxime de pessoas que constroem, que tentam, que erram, que corrigem e que seguem nesse ritmo. Isso vale para pessoas no seu trabalho ou de comunidades.</p><p>O que n&#227;o d&#225; &#233; tentar justificar essa estagna&#231;&#227;o com discursos sobre &#8220;como o mercado &#233; cruel&#8221; ou &#8220;como ningu&#233;m sabe o que faz&#8221;. Infelizmente, esse discurso s&#243; te faz continuar na mesma.</p><h2><strong>Pontos finais</strong></h2><p>Como disse inicialmente, &#233; dif&#237;cil quebrar esse ciclo e a maioria das pessoas subestima o impacto das comunidades que fazem parte e o conte&#250;do que consomem. </p><p>Voc&#234; pode ser super competente, ser &#243;timo tecnicamente, mas se a sua refer&#234;ncia di&#225;ria s&#227;o grupos onde as pessoas s&#227;o frustradas e beiram o cinismo, n&#227;o existem atalhos, mentoria e nem ajuda profissional que ajude. </p><p>Meu conselho &#233;, se quiser evoluir, remova todo o ru&#237;do negativo, saia de grupos, fa&#231;a uma boa limpa em suas redes sociais, n&#227;o d&#234; bola para aquele colega de trabalho que s&#243; sabe ver o lado negativo das coisas e comece a se aproximar de quem est&#225; construindo e evoluindo.</p>]]></content:encoded></item><item><title><![CDATA[Mensurando e Entendendo Disponibilidade]]></title><description><![CDATA[Entenda como medir e melhorar a disponibilidade de sistemas para garantir experi&#234;ncias confi&#225;veis aos clientes. Descubra a rela&#231;&#227;o entre resili&#234;ncia, m&#233;tricas e estrat&#233;gias para evitar downtime.]]></description><link>https://blog.padz.dev/p/mensurando-e-entendendo-disponibilidade</link><guid isPermaLink="false">https://blog.padz.dev/p/mensurando-e-entendendo-disponibilidade</guid><dc:creator><![CDATA[Bruno Padilha]]></dc:creator><pubDate>Wed, 23 Jul 2025 12:03:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qhB6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F226073d0-fe0e-407f-a7cd-d49a56eb9982_4567x3045.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qhB6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F226073d0-fe0e-407f-a7cd-d49a56eb9982_4567x3045.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qhB6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F226073d0-fe0e-407f-a7cd-d49a56eb9982_4567x3045.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qhB6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F226073d0-fe0e-407f-a7cd-d49a56eb9982_4567x3045.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qhB6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F226073d0-fe0e-407f-a7cd-d49a56eb9982_4567x3045.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qhB6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F226073d0-fe0e-407f-a7cd-d49a56eb9982_4567x3045.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qhB6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F226073d0-fe0e-407f-a7cd-d49a56eb9982_4567x3045.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/226073d0-fe0e-407f-a7cd-d49a56eb9982_4567x3045.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2020019,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/168633240?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F226073d0-fe0e-407f-a7cd-d49a56eb9982_4567x3045.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qhB6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F226073d0-fe0e-407f-a7cd-d49a56eb9982_4567x3045.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qhB6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F226073d0-fe0e-407f-a7cd-d49a56eb9982_4567x3045.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qhB6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F226073d0-fe0e-407f-a7cd-d49a56eb9982_4567x3045.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qhB6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F226073d0-fe0e-407f-a7cd-d49a56eb9982_4567x3045.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Foto por <a href="https://unsplash.com/@yogidan2012?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Daniele Levis Pelusi</a> no <a href="https://unsplash.com/photos/green-textile-AWZbbVFEW3k?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></figcaption></figure></div><p>Um dos pontos mais importantes ao arquitetar sistemas escal&#225;veis &#233; disponibilidade. Existem servi&#231;os que um certo tempo de downtime &#233; entend&#237;vel e at&#233; esperado e alguns n&#227;o podem ficar fora do ar de forma alguma.</p><p>Acredito que existem perguntas essenciais que n&#227;o s&#243; times de engenharia, mas tamb&#233;m times de neg&#243;cio e produto devem se fazer ao determinar o qu&#227;o importante &#233; a disponibilidade de sistemas para a empresa e para seus clientes. Como por exemplo:</p><ol><li><p>Por que comprar seu produto? Por que algu&#233;m compraria seu produto ou seu servi&#231;o se ele n&#227;o est&#225; operacional ou acess&#237;vel quando eles precisam?</p></li><li><p>O que os clientes pensariam nesse cen&#225;rio? O que eles pensariam ou sentiriam sobre a marca/empresa quando eles precisam usar seu servi&#231;o e ele est&#225; fora do ar?</p></li><li><p>Qual &#233; o n&#237;vel de satisfa&#231;&#227;o dos seus clientes? Como voc&#234; pode fazer os clientes felizes, trazer dinheiro para a empresa e atender as promessas do seu neg&#243;cio se os servi&#231;os est&#227;o fora?</p></li></ol><p>E a real &#233; que a respostas para essas perguntas levam a um &#250;nico ponto. Seu sistema precisa estar operacional. Existe uma rela&#231;&#227;o direta entre n&#237;vel de satisfa&#231;&#227;o de seus clientes com a disponibilidade de seus servi&#231;os. </p><h2>Disponibilidade e Resili&#234;ncia</h2><p>Disponibilidade e resili&#234;ncia s&#227;o dois conceitos muito similares, por&#233;m diferentes e &#233; importante entender essa diferen&#231;a. Ainda mais se voc&#234; trabalha com SRE ou arquitetando e desenvolvendo aplica&#231;&#245;es.</p><p>Disponibilidade se refere a habilidade de um sistema em realizar suas opera&#231;&#245;es. Se o sistema est&#225; de p&#233;, est&#225; operacional e est&#225; respondendo ent&#227;o sim, ele est&#225; dispon&#237;vel.</p><p>J&#225; resili&#234;ncia se refere a qualidade do sistema, se o sistema consegue de forma consistente realizar suas opera&#231;&#245;es.</p><p>Novamente, ambos conceitos s&#227;o super parecidos. &#201; dif&#237;cil um sistema ser dispon&#237;vel se ele n&#227;o &#233; resiliente e o contr&#225;rio tamb&#233;m &#233; uma verdade. </p><p>Se um sistema que recebe dois par&#226;metros e os soma, por exemplo &#8220;4&#8221; e &#8220;2&#8221; e retorna &#8220;8&#8221;, ele tem uma baixa resili&#234;ncia. Nesse cen&#225;rio, a resili&#234;ncia pode ser corrigida ao implementar testes. J&#225; a disponibilidade &#233; mais dif&#237;cil de se resolver. Vamos a mais um cen&#225;rio, imagine que o sistema ao receber os mesmos par&#226;metros retorne &#8220;6&#8221;, ele &#233; resiliente. Mas devido a um problema de rede, as vezes ele retorna 6, as vezes n&#227;o retorna nada. A aplica&#231;&#227;o &#233; resiliente, mas n&#227;o &#233; sempre dispon&#237;vel.  </p><h3>Causas de Disponibilidade Degradada</h3><ul><li><p>Exaust&#227;o de recursos: Quando a quantidade de usu&#225;rios ou a quantidade de dados trafegados ou armazenados aumenta resultando em requisi&#231;&#245;es lentas; </p></li><li><p>Mudan&#231;as inesperadas na carga que o sistema suporta: Geralmente requer mudan&#231;as de &#250;ltima hora e sem planejamento, tanto na infraestrutura quanto no c&#243;digo e podem aumentar a probabilidade de mais problemas;</p></li><li><p>Depend&#234;ncias externas: Quanto mais seu sistema depender de recursos externos, como SaaS, mais o seu sistema estar&#225; exposto a problemas de disponibilidade causado por esses recursos;</p></li><li><p>D&#237;vida t&#233;cnica: Quanto mais as aplica&#231;&#245;es se tornam complexas, geralmente, a d&#237;vida t&#233;cnica cresce junto e d&#237;vida t&#233;cnica &#233; sin&#244;nimo de problema em algum momento.</p></li></ul><p>O ponto aqui &#233; que problemas de disponibilidade custam dinheiro para voc&#234;, para seus clientes e afeta diretamente a confian&#231;a dos clientes no neg&#243;cio e produto. Provavelmente a empresa n&#227;o vai pra frente se voc&#234; tem problemas constantes de disponibilidade e contruir aplica&#231;&#245;es que precisam escalar &#233; construir aplica&#231;&#245;es que tenham alta disponibilidade.</p><h2>Medindo Disponibilidade</h2><p>Medir a disponibilidade &#233; importante para manter seu sistema sempre operacional. Ao mensur&#225;-la voc&#234; pode entender como sua aplica&#231;&#227;o est&#225; performando agora e compar&#225;-la daqui 1 semana, 1 m&#234;s ou sempre que uma nova funcionalidade nova for para produ&#231;&#227;o.</p><p>O mecanismo mais utilizado para medir a disponibilidade &#233; calcular a porcentagem de quanto aquele sistema est&#225; dispon&#237;vel para os clientes, onde pode ser utilizada a seguinte f&#243;rmula:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\text{Disponibilidade (%)} = \\frac{\\text{per&#237;odo_total_em_segundos} - \\text{segundos_de_indisponibilidade}}{\\text{total_de_segundos_do_per&#237;odo}} \\times 100&quot;,&quot;id&quot;:&quot;VLBWXVUOYD&quot;}" data-component-name="LatexBlockToDOM"></div><p>Exemplo, durante o m&#234;s de Janeiro, seu sistema ficou fora do ar 3 vezes, a primeira 40 minutos, a segunda 20 minutos e a terceira 5 minutos. Qual seria a disponibilidade desse sistema?</p><p>Segundos fora do ar: (40*60)+(20*60)+(5*60) &#8203;= 3.900s<br>Segundos em um m&#234;s: 31 dias x 86.400s/dia&#8203; = 2.678.400s</p><p>Agora aplicando a f&#243;rmula:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\text{Disponibilidade (%)} \n= \\frac{2678400 - 3900}{2678400} \\times 100\n= \\frac{2\\,674\\,500}{2\\,678\\,400} \\times 100\n\\approx 99.8544\\%\n\n&quot;,&quot;id&quot;:&quot;VCFOQUVRAL&quot;}" data-component-name="LatexBlockToDOM"></div><p>A disponibilidade seria ~99.8%. O que nos leva ao pr&#243;ximo t&#243;pico e uma pergunta que ouvimos bastante, &#8220;a disponibilidade da sua aplica&#231;&#227;o est&#225; em quantos noves?&#8221;</p><h3>Os Noves</h3><p>Estamos acostumados a relacionar &#8220;os noves&#8221; como indicadores de alta disponibilidade. A tabela abaixo d&#225; uma vis&#227;o geral do que isso significa.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qRV1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28ff875b-4254-42cc-8715-66411dcf4f4d_743x357.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qRV1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28ff875b-4254-42cc-8715-66411dcf4f4d_743x357.png 424w, https://substackcdn.com/image/fetch/$s_!qRV1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28ff875b-4254-42cc-8715-66411dcf4f4d_743x357.png 848w, https://substackcdn.com/image/fetch/$s_!qRV1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28ff875b-4254-42cc-8715-66411dcf4f4d_743x357.png 1272w, https://substackcdn.com/image/fetch/$s_!qRV1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28ff875b-4254-42cc-8715-66411dcf4f4d_743x357.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qRV1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28ff875b-4254-42cc-8715-66411dcf4f4d_743x357.png" width="743" height="357" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/28ff875b-4254-42cc-8715-66411dcf4f4d_743x357.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:357,&quot;width&quot;:743,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:88773,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/168633240?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28ff875b-4254-42cc-8715-66411dcf4f4d_743x357.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qRV1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28ff875b-4254-42cc-8715-66411dcf4f4d_743x357.png 424w, https://substackcdn.com/image/fetch/$s_!qRV1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28ff875b-4254-42cc-8715-66411dcf4f4d_743x357.png 848w, https://substackcdn.com/image/fetch/$s_!qRV1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28ff875b-4254-42cc-8715-66411dcf4f4d_743x357.png 1272w, https://substackcdn.com/image/fetch/$s_!qRV1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28ff875b-4254-42cc-8715-66411dcf4f4d_743x357.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Um sistema que tem 2 noves de disponibilidade, precisa estar dispon&#237;vel 99% do tempo, ou seja, o sistema pode ficar fora 432 minutos por m&#234;s. J&#225; uma aplica&#231;&#227;o que garante 5 noves de disponibilidade pode ter apenas 4 minutos de downtime por m&#234;s.</p><p>No exemplo que mostrei anteriormente, a aplica&#231;&#227;o falhou em atender a disponibilidade de 3 noves (99.8% comparado a 99.9%). Mas qual &#233; o valor razo&#225;vel para seu sistema ser considerado como altamente dispon&#237;vel? E a resposta para isso &#233;, depende. Voc&#234; vai precisar determinar isso com neg&#243;cio/produto da sua empresa e nesse momento voc&#234; precisa saber ouvir e saber vender qual seria o trabalho (e custo) necess&#225;rio pra chegar no n&#237;vel desejado. O ideal &#233; chegar ao meio termo. Geralmente para aplica&#231;&#245;es web 3 noves &#233; considerado como aceit&#225;vel.</p><p>Vale lembrar que manuten&#231;&#245;es programadas tamb&#233;m s&#227;o consideradas como downtime. Vamos aplicar a mesma f&#243;rmula anterior em um cen&#225;rio onde o time realiza manuten&#231;&#245;es preventivas toda semana e o sistema fica fora por 3 horas.</p><p>Horas em uma semana: 7 x 24 horas = 168 horas<br>Horas indispon&#237;veis por semana: 3 horas</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\n\\text{Disponibilidade (%)} \n\n= \\frac{168 - 3}{168} \\times 100\n= \\frac{165}{168} \\times 100\n\\approx 98.21\\%&quot;,&quot;id&quot;:&quot;QTCBGSREJF&quot;}" data-component-name="LatexBlockToDOM"></div><p>Nesse cen&#225;rio, o sistema teria disponibilidade aproximada de 98.21%, ou seja, n&#227;o atinge nem 99% de disponibilidade. Isso sem contar se houver algum downtime durante o per&#237;odo, ent&#227;o por esse motivo, cuidado com manuten&#231;&#245;es planejadas.</p><h2>Melhorando a Disponibilidade</h2><p>Vamos para mais um cen&#225;rio. Seu servi&#231;o rec&#233;m lan&#231;ado est&#225; operacional, est&#225; online, o time opera normalmente e tudo parece bem. O tr&#225;fego aumenta gradativamente, seu servi&#231;o &#233; rent&#225;vel e est&#225; tudo bem. At&#233; que o sistema tem um downtime inesperado, mas tudo bem, a disponibilidade continua boa.</p><p>At&#233; que acontece novamente e ningu&#233;m liga, pois os n&#250;meros continuam bons. E acontece novamente. O time de neg&#243;cio come&#231;a a se preocupar, come&#231;am a pipocar tickets e reclama&#231;&#245;es para o time de atendimento e novamente, outro incidente.</p><p>Manter seu sistema dispon&#237;vel &#233; uma tarefa dif&#237;cil, o que voc&#234; faria se isso come&#231;asse a acontecer e voc&#234; precisa trabalhar para manter os clientes satisfeitos e o dinheiro entrando novamente?</p><p>Identificar cen&#225;rios como esse s&#227;o essenciais para evitar um ciclo vicioso de problemas e voc&#234; pode ter algumas iniciativas para contornar isso:</p><ul><li><p>Medir e acompanhar a disponibilidade geral;</p></li><li><p>Automatizar processos manuais;</p></li><li><p>Automatizar processos de deploy;</p></li><li><p>Manter todas as configura&#231;&#245;es dos sistemas de forma centralizada;</p></li><li><p>Continuar trabalhando em melhorar seus sistemas. Isso n&#227;o significa migrar para o Kubernetes, e sim identificar problemas de arquitetura, c&#243;digo ou infraestrutura.</p></li></ul><p>Vamos nos aprofundar em cada uma delas:</p><h3>Medir e acompanhar a disponibilidade geral</h3><p>Para entender o que est&#225; acontecendo com a disponibilidade do sistema, voc&#234; precisa medi-la primeiro e saber qual &#233; o valor atual. Expliquei isso mais acima. Utilize a f&#243;rmula e alguma ferramenta para acomapanhar se a disponibilidade est&#225; melhorando ou piorando.</p><p>Monitore de forma cont&#237;nua essa porcentagem e tamb&#233;m quando houve altera&#231;&#245;es significativas ou n&#227;o no sistema. Dessa forma voc&#234; pode correlacionar eventos com incidentes.</p><h3>Automatizar processos manuais</h3><p>Elimine vari&#225;veis e processos desconhecidos. Realizar opera&#231;&#245;es manuais &#233; um modo comum de inserir resultados vari&#225;veis ou desconhecidos no sistema.</p><p>A dica de ouro &#233; nunca realize opera&#231;&#245;es manuais em produ&#231;&#227;o.</p><p>Quando voc&#234; realiza uma mudan&#231;a, essa mudan&#231;a pode melhorar ou comprometer de vez seu sistema. Ao usar apenas tarefas automatizadas e que podem ser repetidas traz benef&#237;cios como:</p><ul><li><p>Voc&#234; pode testar um processo ou script antes de execut&#225;-lo;</p></li><li><p>Realizar ajustes nesse script para executar exatamente o que voc&#234; precisa;</p></li><li><p>O script pode ser revisado por um colega, com isso diminui a probabilidade de algo estar passando despercebido;</p></li><li><p>Voc&#234; pode versionar scripts afim de entender quando o script foi alterado e por quem;</p></li><li><p>Possibilidade de rodar o mesmo script em v&#225;rios servidores ao mesmo tempo;</p></li><li><p>Ao automatizar voc&#234; cria tarefas repetit&#237;veis e toda tarefa repetit&#237;vel podem ser auditada e analisada. Ou seja, voc&#234; ter&#225; como saber qual foi o impacto. Se positivo ou negativo.</p></li></ul><p>Existem empresas onde ningu&#233;m tem acesso ao ambiente de produ&#231;&#227;o. Toda e qualquer mudan&#231;a s&#243; deve ser feita atrav&#233;s de processos automatizados.</p><h3>Deploys automatizados</h3><p>Essa pode parecer mais do mesmo, mas muitas empresas ainda n&#227;o tem um processo de deploy automatizado, onde a pipeline (testes, processos de seguran&#231;a, build) &#233; igual para toda e qualquer nova release.</p><p>Os processos de rollbacks tamb&#233;m s&#227;o mais confi&#225;veis quando automatizados.</p><h3>Gest&#227;o de configura&#231;&#227;o</h3><p>Assim como o ponto de cima, pode parecer super comum, mas n&#227;o &#233;. </p><p>Utilizar sistemas de gest&#227;o de configura&#231;&#227;o como Ansible ao inv&#233;s de sair mudando manualmente aquela vari&#225;vel no Kernel de um servidor &#233; um passo bem importante. Se o Ansible &#233; muito para seu cen&#225;rio, escreva um script que fa&#231;a as altera&#231;&#245;es e versione.</p><p>Para infraestrutura, utilize solu&#231;&#245;es de Infra as Code como Terraform ou Pulumi. Falo mais sobre isso <a href="https://blog.padz.dev/i/168012508/infra-as-code-desde-o-inicio">aqui</a>.</p><h3>Melhorando sistemas</h3><p>Agora que voc&#234; tem um sistema onde &#233; poss&#237;vel monitorar a disponibilidade, uma maneira de rastrear riscos e uma maneira de aplicar altera&#231;&#245;es consistentes ao seu sistema de forma f&#225;cil e segura, voc&#234; pode concentrar seus esfor&#231;os em melhorar a disponibilidade dele. Vou dar alguns exemplos que podem te direcionar.</p><h4>Construa pensando em falhas</h4><p>Planeje e desenhe as aplica&#231;&#245;es pensando que em algum momento elas v&#227;o falhar. Ou por um problema de rede, ou por um servi&#231;o terceiro fora do ar, ou por DNS :). Isso &#233; fato, em algum momento haver&#227;o falhas, ponto. Portanto:</p><ul><li><p>Quais design patterns voc&#234; considerou ou utiliza que ir&#225; melhorar a disponibilidade da aplica&#231;&#227;o? Ao usar patterns simples como l&#243;gica de retry e circuit breakers voc&#234; consegue identificar problemas mesmo que eles afetem apenas uma pequena funcionalidade. Isso ajuda a limitar o escopo de um problema e permite que a aplica&#231;&#227;o continue operacional em partes;</p></li><li><p>O que voc&#234; faz quando um componente que a aplica&#231;&#227;o depende come&#231;a a falhar? Como voc&#234; faz a retentativa da requisi&#231;&#227;o? Circuit breakers s&#227;o &#243;timos para esses casos, pois eles reduzem o impacto de falhas em depend&#234;ncias. Sem um circuit breaker, voc&#234; diminui a performance da aplica&#231;&#227;o, principalmente quando timeouts longos s&#227;o necess&#225;rios para detectar uma falha;</p></li><li><p>O que voc&#234; faz quando acontece um tr&#225;fego inesperado para seu sistema? O sistema cai? Voc&#234; consegue limitar a quantidade de requisi&#231;&#245;es? </p></li></ul><h4>Sempre se pergunte &#8220;isso escala?&#8221; </h4><p>N&#227;o &#233; porque sua aplica&#231;&#227;o funciona hoje que ela vai funcionar amanh&#227;, ainda mais aplica&#231;&#245;es web, onde o tr&#225;fego de hoje pode ser totalmente diferente daqui uma semana, as vezes em at&#233; menos tempo. Construa pensando sempre no futuro:</p><ul><li><p>Arquitete pensando em como escalar seus bancos de dados;</p></li><li><p>Pense nos limites l&#243;gicos ao escalar a camada de dados. O que acontece se seu banco de dados alcan&#231;ar algumas de suas capacidades e limites?</p></li><li><p>Construa sua aplica&#231;&#227;o de forma que seja f&#225;cil adicionar novos servidores em caso. Como voc&#234; mant&#233;m o estado da aplica&#231;&#227;o? Como o tr&#225;fego externo chega nos servidores? Existe um load balancer?</p></li><li><p>Utilize CDNs para conte&#250;dos est&#225;ticos para minimizar o tr&#225;fego para sua rede e servidores;</p></li><li><p>Pense em quais conte&#250;dos din&#226;micos podem ser gerados de forma est&#225;tica.</p></li></ul><h4>Mitigue riscos</h4><p>Identifique poss&#237;veis riscos que seu sistema pode ter. Geralmente as causas das falhas poderiam ter sido identificadas antes delas terem ocorrido. Alguns exemplos:</p><ul><li><p>Um servidor vai cair;</p></li><li><p>Os dados no banco de dados podem se corromper;</p></li><li><p>A resposta de uma requisi&#231;&#227;o pode retornar errada;</p></li><li><p>Uma conex&#227;o de rede vai falhar;</p></li></ul><p>Manter sistemas dispon&#237;veis envolve remover ou reduzir os riscos, mas com o aumento da complexidade isso se torna cada vez mais dif&#237;cil. Manter um sistema grande dispon&#237;vel &#233; muito mais sobre gerenciar seus riscos, o quanto &#233; aceit&#225;vel e o que voc&#234; pode fazer para mitig&#225;-los.</p><h4>Observabilidade</h4><p>Voc&#234; n&#227;o saber&#225; que h&#225; um problema a menos que voc&#234; o veja. Instrumente seu sistema de ponta a ponta para ter uma vis&#227;o do todo. Tamb&#233;m falei sobre isso <a href="https://blog.padz.dev/i/168012508/observabilidade">aqui</a>. Existem solu&#231;&#245;es Open Source que podem ser adotadas de forma f&#225;cil para essa finalidade.</p><p>O segredo &#233; n&#227;o criar um caminh&#227;o de alertas, setar SLIs e monitorar SLOs. Observe tend&#234;ncias na performance e os outliers (valores fora do normal) poder&#227;o ser tratados como problemas de disponibilidade, podendo dessa forma gerar alertas em ocorr&#234;ncias.</p><h4>Resposta a incidentes</h4><p>Ter um sistema observ&#225;vel &#233; in&#250;til se voc&#234; n&#227;o tem uma forma de atuar quando os incidentes acontecem. Estabele&#231;a processos e procedimentos, os famosos Runbooks, que os times possam seguir para identificar problemas e corrigi-los de forma f&#225;cil.  </p><p>Por exemplo, se um servi&#231;o &#233; afetado, voc&#234; deve ter uma s&#233;rie de passos para restaur&#225;-lo a normalidade. N&#227;o importa se seja um restart de um daemon, de um conteiner, verifica&#231;&#227;o de espa&#231;o em um banco de dados ou consumer lag de um t&#243;pico do Kafka. O importante &#233; ter o passo a passo documentado para ajudar as pessoas a identificar o problema.</p><p>Quando um alerta &#233; enviado, os donos dos servi&#231;os devem ser os primeiros a receber a notifica&#231;&#227;o, por&#233;m, outros times que consomem ou tem algum tipo de &#8220;conex&#227;o&#8221; com o servi&#231;o afetado tamb&#233;m podem ser notificados. Isso vai depender de cada empresa e cultura.</p><p>Outro ponto importante &#233; documentar o escopo de atua&#231;&#227;o de cada time, ou seja, quem s&#227;o os donos de determinados servi&#231;os, vamos considerar squads de um e-commerce:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wmDH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8065fad-d386-4151-8a15-6f090e0885c6_554x640.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wmDH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8065fad-d386-4151-8a15-6f090e0885c6_554x640.png 424w, https://substackcdn.com/image/fetch/$s_!wmDH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8065fad-d386-4151-8a15-6f090e0885c6_554x640.png 848w, https://substackcdn.com/image/fetch/$s_!wmDH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8065fad-d386-4151-8a15-6f090e0885c6_554x640.png 1272w, https://substackcdn.com/image/fetch/$s_!wmDH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8065fad-d386-4151-8a15-6f090e0885c6_554x640.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wmDH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8065fad-d386-4151-8a15-6f090e0885c6_554x640.png" width="554" height="640" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c8065fad-d386-4151-8a15-6f090e0885c6_554x640.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:640,&quot;width&quot;:554,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:90787,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/168633240?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8065fad-d386-4151-8a15-6f090e0885c6_554x640.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wmDH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8065fad-d386-4151-8a15-6f090e0885c6_554x640.png 424w, https://substackcdn.com/image/fetch/$s_!wmDH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8065fad-d386-4151-8a15-6f090e0885c6_554x640.png 848w, https://substackcdn.com/image/fetch/$s_!wmDH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8065fad-d386-4151-8a15-6f090e0885c6_554x640.png 1272w, https://substackcdn.com/image/fetch/$s_!wmDH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8065fad-d386-4151-8a15-6f090e0885c6_554x640.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Nesse caso, a squad de Checkout &#233; &#8220;dependente&#8221; de servi&#231;os da squad de Cat&#225;logo onde por exemplo, o carrinho n&#227;o exibe o valor correto de um produto se o servi&#231;o de gest&#227;o de produtos que determina o valor est&#225; incosistente. Assim como ela tamb&#233;m depende do servi&#231;o de c&#225;lculo de frete, do time de Log&#237;stica. Criar SLOs para observar o error budget de fluxos importantes &#233; essencial nesse cen&#225;rio.</p><p>Todos esses processos e procedimentos devem ser preparados com anteced&#234;ncia para que, durante um incidente, os times saibam o que fazer nas diversas circunst&#226;ncias para restaurar as opera&#231;&#245;es rapidamente.</p><h2>Finalizando</h2><p>Esse foi o primeiro post de uma s&#233;rie sobre boas pr&#225;ticas de como manter a disponibilidade com resili&#234;ncia em aplica&#231;&#245;es. Nos pr&#243;ximos, a ideia &#233; aprofundar mais em como lidar com falhas de forma inteligente, graceful shutdown e tudo que est&#225; em torno disso.</p>]]></content:encoded></item><item><title><![CDATA[O que eu aprendi em quase 20 anos construindo (e quebrando) infraestrutura]]></title><description><![CDATA[Boas pr&#225;ticas para quem est&#225; come&#231;ando um projeto do zero. Sem hype, sem atalhos, s&#243; o que realmente funciona.]]></description><link>https://blog.padz.dev/p/o-que-eu-aprendi-em-quase-20-anos</link><guid isPermaLink="false">https://blog.padz.dev/p/o-que-eu-aprendi-em-quase-20-anos</guid><dc:creator><![CDATA[Bruno Padilha]]></dc:creator><pubDate>Fri, 11 Jul 2025 13:57:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!uAKQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uAKQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uAKQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uAKQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uAKQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uAKQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uAKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1337668,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/168012508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uAKQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uAKQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uAKQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uAKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ea6716c-1349-4ddd-ad75-7b6a4cae6ad9_4032x3024.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Foto por <a href="https://unsplash.com/@ryanquintal?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Ryan Quintal</a> no <a href="https://unsplash.com/photos/yellow-lego-block-lot-G-HRuwCTR7c?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></figcaption></figure></div><p>Em quase 20 anos da minha trajet&#243;ria profissional aprendi bastante depois de participar de v&#225;rios projetos, tanto aqueles de infra mais ra&#237;z, quanto migra&#231;&#245;es para cloud, Kubernetes e por a&#237; vai. Em algumas vezes tomei decis&#245;es erradas, mas o importante disso &#233; o aprendizado. E nada mais justo do que repassar esse conhecimento a diante.</p><p>Por isso, eu vejo muitas pessoas (desde os que est&#227;o come&#231;ando agora at&#233; os mais experientes) tomando decis&#245;es ou querendo surfar a onda do hype, ou como costum&#225;vamos dizer na Leroy Merlin, sendo &#8220;bleeding-edge&#8221;.</p><p>Esse post &#233; para quem est&#225; trabalhando em projetos greenfield, stealths ou come&#231;ando do zero.</p><h2>1 - Escolha tecnologias maduras (boring tech)</h2><p>Sim, escolha tecnologias maduras ao iniciar novos projetos. Aquele novo orquestrador de conteiner, aquele novo servi&#231;o da AWS ou aquele framework novo que promete ser 20% mais r&#225;pido que o framework que voc&#234; utiliza n&#227;o vale todo o overhead operacional. </p><p>Sim, &#233; legal usar e testar novas tecnologias, eu gosto e todo mundo gosta, mas cuidado ao usar em projetos novos. As vezes o tempo gasto dando manuten&#231;&#227;o em algo que &#8220;ningu&#233;m usa&#8221;, seria muito mais &#250;til se aproveitado trabalhando em melhorias reais de performance.</p><h2>2 - Infra as Code desde o in&#237;cio</h2><p>Simples como o t&#237;tulo. Provisionar infra n&#227;o &#233; mais o famoso &#8220;next, next, finish&#8221; na console da AWS (ou qualquer outra cloud). Sem saber o que e como foi feito s&#243; vai gerar mais d&#237;vida t&#233;cnica e impossibilitar de recriar o ambiente em caso de necessidade.</p><p>Sem contar as in&#250;meras vantagens que IaC traz, como rastreabilidade, consist&#234;ncia e redu&#231;&#227;o de erros, j&#225; que o c&#243;digo pode ser revisado e testado.</p><h2>3 - Seguran&#231;a planejada, n&#227;o acidental</h2><p>Adicionar seguran&#231;a depois que o projeto j&#225; est&#225; rodando, ou depois de um incidente &#233; muito (mas muito) mais dif&#237;cil do que construir desde o dia zero. Come&#231;ar com o menor privil&#233;gio poss&#237;vel em roles, keys e etc j&#225; &#233; um baita come&#231;o. Use IRSA ou Pod Identity na AWS.</p><p>Se seu escopo for al&#233;m da cloud, <a href="https://github.com/dependabot">Dependabot</a> (ou <a href="https://github.com/renovatebot">Renovatebot</a>) e <a href="https://github.com/aquasecurity/trivy-action">Trivy</a> salvam muito.</p><h2>4 - Automatize tudo</h2><p>&#201; o mesmo ponto de Infra as Code. N&#227;o se trata de velocidade e sim de consist&#234;ncia. Processos manuais criam silos de conhecimento e pontos &#250;nicos de falha.</p><p>O m&#237;nimo aceit&#225;vel &#233; ter um fluxo de deploy automatizado tanto para infraestrutura quanto para o c&#243;digo.</p><h2>5 - Documente decis&#245;es</h2><p>N&#227;o adianta s&#243; documentar seu c&#243;digo, documente suas decis&#245;es e os motivos de escolher determinadas arquiteturas. </p><p>Um bom in&#237;cio &#233; escrever <a href="https://adr.github.io/">ADRs</a> (Architectural Decision Records). N&#227;o precisa ser nada rebuscado, um markdown em um reposit&#243;rio no GitHub j&#225; ajuda. Com certeza, vai ajudar as pr&#243;ximas pessoas do seu time a entender o por que as coisas s&#227;o do jeito que s&#227;o.</p><h2>6 - Se questione o &#8220;por que&#8221;</h2><p>Esse vai de encontro com o ponto acima.</p><p>A arquitetura das aplica&#231;&#245;es (ou infraestrutura) devem servir ao neg&#243;cio, n&#227;o ao contr&#225;rio. Tecnologia n&#227;o &#233; o objetivo, &#233; o meio. Mantenha as coisas simples, com prop&#243;sitos e alinhado ao neg&#243;cio.</p><p>Provavelmente voc&#234; n&#227;o precisa de microservi&#231;os para um MVP.</p><h2>7 - Planeje para falhas</h2><p>Uma hora seu servi&#231;o, sua infra, seu DNS vai falhar. Toda rede tem problemas. Desenhe sua arquitetura esperando que isso vai acontecer em algum momento. <br><br>Aprendi com um antigo gestor durante uma migra&#231;&#227;o de servidores Microsoft Exchange 2003 para 2010 (ainda existe isso?), o seguinte pensamento: </p><blockquote><p>Quem tem um, n&#227;o tem nenhum.<br>Quem tem dois, tem um.<br>Quem tem tr&#234;s, tem dois. </p></blockquote><p>E &#233; sobre isso. Tenha no m&#237;nimo duas r&#233;plicas do que &#233; core para o neg&#243;cio.</p><h2>8 - Observabilidade</h2><p>O papo de observabilidade n&#227;o &#233; monitora&#231;&#227;o j&#225; t&#225; batido. Identifique seus SLIs e defina SLOs para acompanh&#225;-los. Novamente, tecnologia a favor do neg&#243;cio e n&#227;o ao contr&#225;rio.</p><p>Comece instrumentando seu c&#243;digo e pontos chaves da infraestrutura. A <a href="https://grafana.com/go/webinar/getting-started-with-grafana-lgtm-stack/">stack LGTM</a> &#233; um &#243;timo ponto de partida.</p>]]></content:encoded></item><item><title><![CDATA[Systems Performance - eBPF]]></title><description><![CDATA[Uma breve introdu&#231;&#227;o sobre eBPF e como sistemas de seguran&#231;a e observabilidade est&#227;o evoluindo gra&#231;as a ele.]]></description><link>https://blog.padz.dev/p/systems-performance-ebpf</link><guid isPermaLink="false">https://blog.padz.dev/p/systems-performance-ebpf</guid><dc:creator><![CDATA[Bruno Padilha]]></dc:creator><pubDate>Fri, 23 May 2025 14:24:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mfBS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c51cb56-3e35-48ac-85cf-e247c3038b7b_5616x3744.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mfBS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c51cb56-3e35-48ac-85cf-e247c3038b7b_5616x3744.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mfBS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c51cb56-3e35-48ac-85cf-e247c3038b7b_5616x3744.jpeg 424w, https://substackcdn.com/image/fetch/$s_!mfBS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c51cb56-3e35-48ac-85cf-e247c3038b7b_5616x3744.jpeg 848w, https://substackcdn.com/image/fetch/$s_!mfBS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c51cb56-3e35-48ac-85cf-e247c3038b7b_5616x3744.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!mfBS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c51cb56-3e35-48ac-85cf-e247c3038b7b_5616x3744.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mfBS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c51cb56-3e35-48ac-85cf-e247c3038b7b_5616x3744.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9c51cb56-3e35-48ac-85cf-e247c3038b7b_5616x3744.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2912409,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/159336066?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c51cb56-3e35-48ac-85cf-e247c3038b7b_5616x3744.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mfBS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c51cb56-3e35-48ac-85cf-e247c3038b7b_5616x3744.jpeg 424w, https://substackcdn.com/image/fetch/$s_!mfBS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c51cb56-3e35-48ac-85cf-e247c3038b7b_5616x3744.jpeg 848w, https://substackcdn.com/image/fetch/$s_!mfBS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c51cb56-3e35-48ac-85cf-e247c3038b7b_5616x3744.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!mfBS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c51cb56-3e35-48ac-85cf-e247c3038b7b_5616x3744.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Foto por <a href="https://unsplash.com/@sharonmccutcheon?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Alexander Grey</a> no <a href="https://unsplash.com/photos/brown-and-white-floor-tiles-BucjGtyv58A?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></figcaption></figure></div><p>O eBPF (Extended Berkeley Packet Filter) surgiu como uma tecnologia revolucion&#225;ria para observabilidade e otimiza&#231;&#227;o de desempenho em sistemas modernos, permitindo a execu&#231;&#227;o segura de c&#243;digo diretamente no kernel do Linux, oferecendo uma abordagem &#8220;sandboxed&#8221; para interagir com aplica&#231;&#245;es, redes e subsistemas do hardware. </p><p>A ideia desse post &#233; abordar alguns princ&#237;pios e fundamentos mais b&#225;sicos, j&#225; que o eBPF continua em constante evolu&#231;&#227;o e &#233; aplicado em cada vez mais cen&#225;rios.</p><h2>O que &#233; eBPF?</h2><p>O eBPF foi inicialmente desenvolvido para Linux, por&#233;m n&#227;o h&#225; motivos para que ele n&#227;o possa ser utilizado em outros Sistemas Operacionais. Inclusive, a Microsoft tem <a href="https://microsoft.github.io/ebpf-for-windows/">desenvolvido</a> uma implementa&#231;&#227;o dele para Windows.</p><p>A ideia do eBPF nasceu no in&#237;cio dos anos 90 como uma &#8220;pseudo m&#225;quina&#8221; que podia rodar programas como se fossem filtros, onde era determinado se um pacote de rede poderia ser aceito ou rejeitado. Esses programas eram escritos em instru&#231;&#245;es chamadas BPF (BSD Packet Filter) bem similares ao Assembly. Caso voc&#234; queira se aprofundar nas ra&#237;zes do eBPF, sugiro dar uma <a href="https://www.tcpdump.org/papers/bpf-usenix93.pdf">lida no paper escrito</a> no fim de 1992 por Steven McCanne e Van Jacobson. Abaixo, um exemplo de c&#243;digo retirado direto desse paper:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8z06!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb94c5f-bd4f-4530-a491-0af28a3696a2_900x674.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8z06!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb94c5f-bd4f-4530-a491-0af28a3696a2_900x674.png 424w, https://substackcdn.com/image/fetch/$s_!8z06!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb94c5f-bd4f-4530-a491-0af28a3696a2_900x674.png 848w, https://substackcdn.com/image/fetch/$s_!8z06!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb94c5f-bd4f-4530-a491-0af28a3696a2_900x674.png 1272w, https://substackcdn.com/image/fetch/$s_!8z06!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb94c5f-bd4f-4530-a491-0af28a3696a2_900x674.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8z06!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb94c5f-bd4f-4530-a491-0af28a3696a2_900x674.png" width="478" height="357.9688888888889" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6fb94c5f-bd4f-4530-a491-0af28a3696a2_900x674.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:674,&quot;width&quot;:900,&quot;resizeWidth&quot;:478,&quot;bytes&quot;:49412,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/159336066?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb94c5f-bd4f-4530-a491-0af28a3696a2_900x674.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8z06!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb94c5f-bd4f-4530-a491-0af28a3696a2_900x674.png 424w, https://substackcdn.com/image/fetch/$s_!8z06!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb94c5f-bd4f-4530-a491-0af28a3696a2_900x674.png 848w, https://substackcdn.com/image/fetch/$s_!8z06!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb94c5f-bd4f-4530-a491-0af28a3696a2_900x674.png 1272w, https://substackcdn.com/image/fetch/$s_!8z06!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb94c5f-bd4f-4530-a491-0af28a3696a2_900x674.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Esse c&#243;digo basicamente filtra pacotes que n&#227;o s&#227;o pacotes IP da seguinte maneira:</p><ol><li><p>O c&#243;digo trabalha com pacotes Ethernet como entrada;</p></li><li><p>Utilizando uma instru&#231;&#227;o <code>ldh</code>, ele carrega um valor de 2 bytes a partir do byte 12 do pacote (este &#233; o campo EtherType nos quadros Ethernet que identifica o protocolo);</p></li><li><p>Uma instru&#231;&#227;o <code>jeq</code> ent&#227;o compara este valor com o c&#243;digo padr&#227;o para pacotes IP;</p></li><li><p>Se houver uma correspond&#234;ncia, a execu&#231;&#227;o salta para um &#8220;r&#243;tulo&#8221; (ou fun&#231;&#227;o) chamado <code>L1</code> e retorna um valor n&#227;o zero (<code>#TRUE</code>), aceitando o pacote;</p></li><li><p>Se n&#227;o houver correspond&#234;ncia, o pacote &#233; rejeitado retornando <code>0</code>.</p></li></ol><p>No paper existem trechos de c&#243;digo bem mais complexos, por&#233;m o mais importante disso tudo &#233; ficar claro, que a pessoa podia escrever essas instru&#231;&#245;es e serem executadas diretamente dentro do Kernel, o que possibilita a utiliza&#231;&#227;o do eBPF hoje em dia. A primeira utiliza&#231;&#227;o do BPF no Linux foi a partir da vers&#227;o 2.1, no utilit&#225;rio <code>tcpdump</code> para capturar pacotes TCP.</p><p>O BPF se tornou o que conhecemos hoje por eBPF na vers&#227;o 3.18 do kernel do Linux trazendo mudan&#231;as significativas como:</p><ul><li><p>Um melhor suporte a arquitetura 64-bit;</p></li><li><p>Possibilidade de criar estruturas de dados atrav&#233;s de <code>maps</code>;</p></li><li><p>A syscall <code>bpf()</code> foi adicionada para que programas rodando a n&#237;vel de usu&#225;rio pudessem interagir com programas eBPF rodando no kernel.</p></li></ul><h2>eBPF e o Kernel do Linux</h2><p>Desde 2005 existe uma funcionalidade no kernel do Linux chamada <code>kprobes</code> (kernel probes), que permite que voc&#234; injete &#8220;traps&#8221; em quase todas instru&#231;&#245;es de c&#243;digo do kernel de uma forma que novos m&#243;dulos (kernel modules) possam &#8220;attachar&#8221; suas fun&#231;&#245;es a esses <code>kprobes</code> com intuito de medir performance ou debugar aplica&#231;&#245;es.</p><p>Por&#233;m, s&#243; em 2015 foi adicionada a funcionalidade de &#8220;attachar&#8221; programas eBPF aos <code>kprobes</code> e foi a partir de ent&#227;o que a forma como todo tracing dentro de um sistema Linux come&#231;ou a mudar, permitindo uma melhor visualiza&#231;&#227;o e entendimento de toda stack de rede daquele sistema. Nos anos seguintes, a ado&#231;&#227;o do eBPF se tornou proeminente em empresas como <a href="https://www.brendangregg.com/blog/2016-03-05/linux-bpf-superpowers.html">Netflix</a> e <a href="https://github.com/facebookincubator/katran">Facebook</a> possibilitando o nascimento do projeto <a href="https://github.com/cilium/cilium">Cilium</a>. </p><p>Em meados de 2018, a comunidade viu o eBPF se tornar um subsistema totalmente separado dentro do kernel do Linux, a introdu&#231;&#227;o do BTF, tornando programas eBPF mais port&#225;teis e o LSM BPF, que tornou programas eBPF a serem utilizados juntos de uma interface do kernel chamada Linux Security Module (LSM), possibilitando que o eBPF fosse a melhor tecnologia para seguran&#231;a, observabilidade e redes.</p><h3>Kernel e o User space </h3><p>Para realmente entender o eBPF, &#233; necess&#225;rio saber a diferen&#231;a entre o kernel e o user space no Linux, ent&#227;o vamos l&#225;.</p><p>De modo bem simples e direto, o kernel do Linux &#233; um software que atua entre as aplica&#231;&#245;es e o hardware do sistema onde ele roda. J&#225; as aplica&#231;&#245;es rodam em uma camada &#8220;superior&#8221; chamada user space, o que n&#227;o d&#225; acesso direto ao hardware, para isso, a aplica&#231;&#227;o que necessita ler e escrever arquivos, trafegar dados pela rede ou acessar a mem&#243;ria RAM, precisa fazer requests utilizando syscalls para que o kernel atue pela aplica&#231;&#227;o nesses momentos. O kernel tamb&#233;m &#233; respons&#225;vel por coordenar processos concorrentes, permitindo que v&#225;rias aplica&#231;&#245;es rodem ao mesmo tempo.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5Pr6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F050f3f3a-c767-49cc-9ca0-88e122510435_691x599.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5Pr6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F050f3f3a-c767-49cc-9ca0-88e122510435_691x599.png 424w, https://substackcdn.com/image/fetch/$s_!5Pr6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F050f3f3a-c767-49cc-9ca0-88e122510435_691x599.png 848w, https://substackcdn.com/image/fetch/$s_!5Pr6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F050f3f3a-c767-49cc-9ca0-88e122510435_691x599.png 1272w, https://substackcdn.com/image/fetch/$s_!5Pr6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F050f3f3a-c767-49cc-9ca0-88e122510435_691x599.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5Pr6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F050f3f3a-c767-49cc-9ca0-88e122510435_691x599.png" width="691" height="599" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/050f3f3a-c767-49cc-9ca0-88e122510435_691x599.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:599,&quot;width&quot;:691,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:97081,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/159336066?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F050f3f3a-c767-49cc-9ca0-88e122510435_691x599.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5Pr6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F050f3f3a-c767-49cc-9ca0-88e122510435_691x599.png 424w, https://substackcdn.com/image/fetch/$s_!5Pr6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F050f3f3a-c767-49cc-9ca0-88e122510435_691x599.png 848w, https://substackcdn.com/image/fetch/$s_!5Pr6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F050f3f3a-c767-49cc-9ca0-88e122510435_691x599.png 1272w, https://substackcdn.com/image/fetch/$s_!5Pr6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F050f3f3a-c767-49cc-9ca0-88e122510435_691x599.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>&#201; bem dif&#237;cil no dia dia utilizarmos uma interface de syscall de forma direta, pois as linguagens de programa&#231;&#227;o j&#225; oferecem abstra&#231;&#245;es e bibliotecas que s&#227;o muito mais f&#225;ceis de se utilizar. Por isso, muitas pessoas n&#227;o fazem ideia do que o kernel est&#225; fazendo enquanto aplica&#231;&#245;es est&#227;o rodando. Para ter uma no&#231;&#227;o, veja o output de um <code>strace</code> durante a execu&#231;&#227;o de um simples <code>docker run</code>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SnsP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a20e-791c-4d55-8fd9-159063a5f6fc_844x1017.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SnsP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a20e-791c-4d55-8fd9-159063a5f6fc_844x1017.png 424w, https://substackcdn.com/image/fetch/$s_!SnsP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a20e-791c-4d55-8fd9-159063a5f6fc_844x1017.png 848w, https://substackcdn.com/image/fetch/$s_!SnsP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a20e-791c-4d55-8fd9-159063a5f6fc_844x1017.png 1272w, https://substackcdn.com/image/fetch/$s_!SnsP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a20e-791c-4d55-8fd9-159063a5f6fc_844x1017.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SnsP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a20e-791c-4d55-8fd9-159063a5f6fc_844x1017.png" width="844" height="1017" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2664a20e-791c-4d55-8fd9-159063a5f6fc_844x1017.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1017,&quot;width&quot;:844,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:125933,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/159336066?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a20e-791c-4d55-8fd9-159063a5f6fc_844x1017.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SnsP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a20e-791c-4d55-8fd9-159063a5f6fc_844x1017.png 424w, https://substackcdn.com/image/fetch/$s_!SnsP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a20e-791c-4d55-8fd9-159063a5f6fc_844x1017.png 848w, https://substackcdn.com/image/fetch/$s_!SnsP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a20e-791c-4d55-8fd9-159063a5f6fc_844x1017.png 1272w, https://substackcdn.com/image/fetch/$s_!SnsP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a20e-791c-4d55-8fd9-159063a5f6fc_844x1017.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Com isso, d&#225; pra perceber o quanto as aplica&#231;&#245;es &#8220;dependem&#8221; do kernel e com eBPF &#233; poss&#237;vel adicionar instrumenta&#231;&#245;es nele para entender e ter todos esses insights. Por exemplo, se voc&#234; interceptar syscalls em opera&#231;&#245;es de arquivos, voc&#234; saber&#225; exatamente quais arquivos foram manipulados. </p><p>Programas eBPF podem ser carregados (e descarregados) de forma din&#226;mica do kernel e uma vez que eles s&#227;o &#8220;attachados&#8221; a um evento, esse programa sempre ser&#225; acionado por esse evento independente do que  o causou. Por exemplo, se voc&#234; &#8220;attachar&#8221; um programa a uma syscall ao abrir arquivos, esse programa ser&#225; acionado sempre que qualquer programa tentar abrir um arquivo.</p><p>Isso significa que utilizar ferramentas de seguran&#231;a e observabilidade que utilizam eBPF s&#227;o um grande diferencial de ferramentas comuns, pois voc&#234; ter&#225; visibilidade de tudo que est&#225; acontecendo no sistema. Sem contar que tamb&#233;m &#233; poss&#237;vel filtrar eventos a n&#237;vel do kernel sem envi&#225;-los ao user space, &#8220;economizando&#8221; custo de processamento. Em ambientes rodando conteineres, a visibilidade chega at&#233; os processos dentro desses conteineres, o que nos leva ao pr&#243;ximo t&#243;pico.</p><h2>eBPF em ambientes Cloud Native</h2><p>Com a ado&#231;&#227;o de solu&#231;&#245;es cloud native como Kubernetes, s&#227;o utilizadas abordagens que decidem em qual servidor um determinado workload ir&#225; rodar. Obviamente, esses servidores rodam um Sistema Operaciona que possui um kernel. E aplica&#231;&#245;es em conteineres compartilham o mesmo kernel do servidor onde est&#227;o rodando, ou seja, em um cluster Kubernetes, todos os conteineres em todos os Pods em um determinado node est&#227;o utilizando o mesmo kernel. Quando esse kernel &#233; instrumentado atrav&#233;s de programas eBPF, todos workloads estar&#227;o vis&#237;veis para esses programas.</p><p>E ter essa visibilidade tr&#225;s benef&#237;cios como:</p><ul><li><p>N&#227;o &#233; necess&#225;rio mudar ou implementar bibliotecas para instrument&#225;-las com eBPF;</p></li><li><p>Assim que o kernel carrega um novo programa eBPF, esse programa pode observar processos de aplica&#231;&#245;es que j&#225; est&#227;o rodando.</p></li></ul><p>O que comparado com solu&#231;&#245;es que utilizam sidecars, &#233; um super diferencial, pois:</p><ul><li><p>Ao usar sidecars, os Pods precisam ser reiniciados para que esse novo conteiner seja adicionado;</p></li><li><p>O tempo de inicializa&#231;&#227;o do Pod &#233; afetado;</p></li><li><p>Gerenciar v&#225;rios conteineres em um Pod s&#243; tr&#225;s mais complexidade; </p></li></ul><p>Como ferramentas baseadas em eBPF podem ter uma visibilidade completa, pode ser mais dif&#237;cil para que invasores n&#227;o sejam notados. Por exemplo, imagine que um invasor consiga explorar uma vulnerabilidade em um servi&#231;o exposto e fa&#231;a upload de um bin&#225;rio malicioso para realizar uma coleta de dados. Se sua estrat&#233;gia de observabilidade ou seguran&#231;a depende de agentes instalados dentro do conteiner ou de sidecars, &#233; bem prov&#225;vel que esse processo passe completamente despercebido. J&#225; com uma abordagem baseada em eBPF, &#233; poss&#237;vel observar syscalls, conex&#245;es de rede e acesso a arquivos diretamente do kernel, independentemente de como o processo foi iniciado. Isso significa que esse tipo de atividade pode ser detectada sem depender de modifica&#231;&#245;es no ambiente da aplica&#231;&#227;o. </p><h2>Aplica&#231;&#245;es de eBPF</h2><p>Como ficou claro at&#233; aqui, o eBPF permite customizar o comportamento do kernel e observar eventos em todo o sistema e report&#225;-los ao user space. A partir de agora vamos entrar de forma mais profunda em como o eBPF pode ser aplicado em solu&#231;&#245;es de seguran&#231;a e rede.</p><h3>eBPF para seguran&#231;a</h3><p>Como mencionei um pouco acima, syscalls s&#227;o interfaces entre aplica&#231;&#245;es rodando no user space e o kernel. &#201; poss&#237;vel restringir ou limitar quais syscalls uma aplica&#231;&#227;o pode fazer, e se voc&#234; utiliza Docker h&#225; um bom tempo, voc&#234; j&#225; deve ter esbarrado em uma ferramenta que utiliza BPF para isso, a <code>seccomp</code>.</p><p>O <code>seccomp</code> (SECure COMPuting) surgiu com o objetivo de isolar aplica&#231;&#245;es n&#227;o confi&#225;veis, limitando quais syscalls est&#227;o dispon&#237;veis para um determinado processo. Em seu modo strict, apenas syscalls como <code>read()</code>, <code>write()</code>, <code>_exit()</code> e <code>sigreturn()</code> s&#227;o permitidos, o suficiente para aplica&#231;&#245;es extremamente limitadas. Para oferecer maior flexibilidade, foi criado o <a href="https://www.kernel.org/doc/html/v4.17/userspace-api/seccomp_filter.html">seccomp-bpf</a>, que usa filtros baseados em BPF para permitir ou bloquear syscalls dinamicamente com base em algumas configura&#231;&#245;es e os filtros s&#227;o executados toda vez que uma syscall &#233; chamada.</p><p>Ferramentas como <a href="https://github.com/falcosecurity/falco">Falco</a>, ampliam essa abordagem ao usar eBPF para rastrear syscalls de processos j&#225; em execu&#231;&#227;o, sem a limita&#231;&#227;o de aplicar pol&#237;ticas somente na inicializa&#231;&#227;o. O Falco permite definir regras que geram alertas quando comportamentos suspeitos s&#227;o detectados, usando drivers baseados tanto em m&#243;dulo de kernel quanto em eBPF.</p><h3>eBPF em solu&#231;&#245;es de rede</h3><p>Quando pensamos em solu&#231;&#245;es de rede baseadas em eBPF, a primeira que vem a mente &#233; o Cilium, que utiliza eBPF como plataforma para gerenciar toda parte de rede em clusters Kubernetes, provendo funcionalidades como balanceamento de carga, criptografia, observabilidade e muito mais. Outro grande exemplo &#233; a Cloudflare, <a href="https://blog.cloudflare.com/how-cloudflare-auto-mitigated-world-record-3-8-tbps-ddos-attack/">que utiliza eBPF</a> em solu&#231;&#245;es conta DDoS.</p><p>E ao falarmos em rede, vale dar uma breve explica&#231;&#227;o sobre XDP (eXpress Data Path). O XDP &#233; uma tecnologia para processamento de pacotes de rede, que executa programas no ponto mais &#8220;baixo&#8221; poss&#237;vel da stack de rede. Ele &#233; utilizado em aplica&#231;&#245;es como:</p><ul><li><p>Firewall de baixa lat&#234;ncia, que inspeciona cada pacote assim que ele chega &#224; interface de rede;</p></li><li><p>Mitiga&#231;&#227;o de ataques DDoS ao monitorar a taxa de pacotes por IP de origem, por exemplo, se um IP exceder um certo limite em um intervalo de tempo, os pacotes ser&#227;o descartados;</p></li><li><p>Pacotes malformados podem explorar vulnerabilidades (Packet of Death) no kernel, causando instabilidades ou at&#233; a paraliza&#231;&#227;o do sistema. Um programa XDP pode inspecionar padr&#245;es suspeitos (como headers inv&#225;lidos ou tamanhos inconsistentes) e descartar o pacote antes que ele chegue de fato no kernel.</p></li></ul><p>Al&#233;m disso, programas XDP n&#227;o s&#227;o limitados a &#8220;apenas&#8221; inspecionar conte&#250;dos de pacotes de rede, eles tamb&#233;m podem modificar o conte&#250;do desses pacotes. Outro fato interessante &#233; que atualmente j&#225; existem placas de rede (interfaces) que suportam XDP Offload, onde os programas eBPF s&#227;o executados no pr&#243;prio processador da placa, ou seja, um pacote pode ser dropado ou redirecionado antes mesmo de chegar ao kernel do sistema e n&#227;o gastar ciclos de CPU do servidor de forma desnecess&#225;ria, o que pode resultar em melhoras significativas em performance.</p><h3>eBPF e a stack de rede do Kubernetes</h3><p>Esse n&#227;o &#233; o ponto central do post, mas acredito que seja bom exemplificar como eBPF pode ajudar a melhorar o tr&#225;fego para (e entre) workloads rodando no Kubernetes.</p><p>Um Pod no Kubernetes, &#233; um grupo de conteineres que compartilham o mesmo namespace do kernel e cgroups, o que isola Pods um dos outros e do servidor/node onde eles est&#227;o rodando.</p><p>Geralmente (isso vai variar de ambiente pra ambiente), um Pod tem seu pr&#243;prio namespace de rede e seu endere&#231;o IP, o que significa que o kernel tem uma stack de rede para cada namespace, separando a rede do servidor/node de outros Pods. Como mostro abaixo, o Pod &#233; conectado ao servidor/node por uma conex&#227;o Ethernet virtual.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QSDu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f10097b-0663-4d21-872b-0314c8027305_850x1276.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QSDu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f10097b-0663-4d21-872b-0314c8027305_850x1276.png 424w, https://substackcdn.com/image/fetch/$s_!QSDu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f10097b-0663-4d21-872b-0314c8027305_850x1276.png 848w, https://substackcdn.com/image/fetch/$s_!QSDu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f10097b-0663-4d21-872b-0314c8027305_850x1276.png 1272w, https://substackcdn.com/image/fetch/$s_!QSDu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f10097b-0663-4d21-872b-0314c8027305_850x1276.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QSDu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f10097b-0663-4d21-872b-0314c8027305_850x1276.png" width="850" height="1276" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f10097b-0663-4d21-872b-0314c8027305_850x1276.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1276,&quot;width&quot;:850,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:433977,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/159336066?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f10097b-0663-4d21-872b-0314c8027305_850x1276.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QSDu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f10097b-0663-4d21-872b-0314c8027305_850x1276.png 424w, https://substackcdn.com/image/fetch/$s_!QSDu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f10097b-0663-4d21-872b-0314c8027305_850x1276.png 848w, https://substackcdn.com/image/fetch/$s_!QSDu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f10097b-0663-4d21-872b-0314c8027305_850x1276.png 1272w, https://substackcdn.com/image/fetch/$s_!QSDu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f10097b-0663-4d21-872b-0314c8027305_850x1276.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Nota-se que pacotes que vem de fora do node tem que trafegar por toda a stack de rede daquele servidor, at&#233; a interface virtual e posteriormente at&#233; a rede do Pod e consequentemente toda a stack de rede do namespace do Pod at&#233; chegar na aplica&#231;&#227;o.</p><blockquote><p>Para mais contexto sobre iptables, recomendo dar uma lida nesse <a href="https://www.guiafoca.org/guiaonline/seguranca/ch05.html">belo material</a> sobre o tema.</p></blockquote><p>Essas duas stacks est&#227;o no mesmo kernel, certo? Ent&#227;o podemos concluir que o pacote est&#225; fazendo o mesmo caminho duas vezes. Com isso, teremos uma lat&#234;ncia mais alta. Uma solu&#231;&#227;o para esse cen&#225;rio seria utilizar o Cilium e substituir toda carga duplicada de roteamento do kernel e do iptables, uma vez que o eBPF &#233; uma solu&#231;&#227;o mais inteligente pra isso.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o77t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a93285-75de-4ad7-842f-b7470e43c5a6_917x1277.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o77t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a93285-75de-4ad7-842f-b7470e43c5a6_917x1277.png 424w, https://substackcdn.com/image/fetch/$s_!o77t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a93285-75de-4ad7-842f-b7470e43c5a6_917x1277.png 848w, https://substackcdn.com/image/fetch/$s_!o77t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a93285-75de-4ad7-842f-b7470e43c5a6_917x1277.png 1272w, https://substackcdn.com/image/fetch/$s_!o77t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a93285-75de-4ad7-842f-b7470e43c5a6_917x1277.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o77t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a93285-75de-4ad7-842f-b7470e43c5a6_917x1277.png" width="917" height="1277" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/71a93285-75de-4ad7-842f-b7470e43c5a6_917x1277.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1277,&quot;width&quot;:917,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:451313,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/159336066?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a93285-75de-4ad7-842f-b7470e43c5a6_917x1277.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!o77t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a93285-75de-4ad7-842f-b7470e43c5a6_917x1277.png 424w, https://substackcdn.com/image/fetch/$s_!o77t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a93285-75de-4ad7-842f-b7470e43c5a6_917x1277.png 848w, https://substackcdn.com/image/fetch/$s_!o77t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a93285-75de-4ad7-842f-b7470e43c5a6_917x1277.png 1272w, https://substackcdn.com/image/fetch/$s_!o77t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a93285-75de-4ad7-842f-b7470e43c5a6_917x1277.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Mas qual o real motivo de evitar a utiliza&#231;&#227;o de iptables? O componente kube-proxy implementa uma load balancer que permite que v&#225;rios Pods respondam requisi&#231;&#245;es enviadas a um Service e por baixo dos panos o kube-proxy utiliza iptables.</p><p>Como muito de voc&#234;s sabem, existe a possibilidade de utilizar plug-ins de CNI (Container Network Interface) que implementam novas funcionalidades em toda camada de rede de um cluster, por&#233;m, a grande maioria ainda utiliza regras de iptables que trabalham na camada 3 e 4 (Rede e Transporte) e quando essas regras precisam ser atualizadas elas podem demorar e muito - o trecho do v&#237;deo abaixo explica o motivo.</p><div id="youtube2-4-pawkiazEg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;4-pawkiazEg&quot;,&quot;startTime&quot;:&quot;863s&quot;,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/4-pawkiazEg?start=863s&amp;rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Ent&#227;o devido a utiliza&#231;&#227;o de eBPF pelo Cilium, toda a configura&#231;&#227;o de regras, conntrack e balanceamento de carga s&#227;o armazenadas em <a href="https://docs.ebpf.io/linux/map-type/BPF_MAP_TYPE_HASH/">hash table maps</a>, que possibilitam essas opera&#231;&#245;es escalar de forma muito melhor. </p><h2>Finalizando</h2><p>N&#227;o s&#243; eBPF, mas como o Cilium, s&#227;o tecnologias que v&#227;o muito al&#233;m de um post. O tema &#233; vasto e uma coisa &#233; entender o funcionamento macro e outra coisa &#233; entender criando programas eBPF e implementando o Cilium. Se rolou um interesse mais e gostaria que eu abordasse mais sobre o assunto, deixe um coment&#225;rio ou me procure no <a href="https://www.linkedin.com/in/brunopadz/">LinkedIn</a> para batermos um papo.</p><p>Existe tamb&#233;m um Substack muito interessante s&#243; sobre eBPF, chamado <a href="https://ebpfchirp.substack.com/">eBPF Chirp</a>. Vale a pena conferir.</p><p>At&#233; a pr&#243;xima!</p>]]></content:encoded></item><item><title><![CDATA[Systems Performance - Aprofundando em Aplicações]]></title><description><![CDATA[Um guia de como medir, analisar e otimizar aplica&#231;&#245;es de forma eficiente e sem achismos]]></description><link>https://blog.padz.dev/p/systems-performance-aprofundando</link><guid isPermaLink="false">https://blog.padz.dev/p/systems-performance-aprofundando</guid><dc:creator><![CDATA[Bruno Padilha]]></dc:creator><pubDate>Wed, 19 Mar 2025 15:30:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!EYfU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51803c6-27f7-4d19-9a4b-be483a0e09c5_4000x2600.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EYfU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51803c6-27f7-4d19-9a4b-be483a0e09c5_4000x2600.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EYfU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51803c6-27f7-4d19-9a4b-be483a0e09c5_4000x2600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!EYfU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51803c6-27f7-4d19-9a4b-be483a0e09c5_4000x2600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!EYfU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51803c6-27f7-4d19-9a4b-be483a0e09c5_4000x2600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!EYfU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51803c6-27f7-4d19-9a4b-be483a0e09c5_4000x2600.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EYfU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51803c6-27f7-4d19-9a4b-be483a0e09c5_4000x2600.jpeg" width="1456" height="946" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c51803c6-27f7-4d19-9a4b-be483a0e09c5_4000x2600.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:946,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2325199,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/158947812?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51803c6-27f7-4d19-9a4b-be483a0e09c5_4000x2600.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!EYfU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51803c6-27f7-4d19-9a4b-be483a0e09c5_4000x2600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!EYfU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51803c6-27f7-4d19-9a4b-be483a0e09c5_4000x2600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!EYfU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51803c6-27f7-4d19-9a4b-be483a0e09c5_4000x2600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!EYfU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc51803c6-27f7-4d19-9a4b-be483a0e09c5_4000x2600.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Foto por <a href="https://unsplash.com/@maxberg?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Maxim Berg</a> no <a href="https://unsplash.com/photos/background-pattern-ZESbrsLBPPk?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></figcaption></figure></div><p>Bem-vindos a mais um post da s&#233;rie sobre Systems Performance. At&#233; agora abordei desde os conceitos e m&#233;tricas, at&#233; como realizar capacity planning de forma eficaz. E seguindo a ideia, nesse post abordarei como descrever os objetivos de melhoria de performance, t&#233;cnicas, desafios de diferentes linguagens de programa&#231;&#227;o e muito mais, ent&#227;o pegue um caf&#233; e aproveite a leitura. &#9749;</p><h2>Criando contexto</h2><p>Antes de iniciar qualquer tipo de an&#225;lise, assim como abordei em posts anteriores, &#233; importante criar um entendimento sobre como a aplica&#231;&#227;o se comporta em alto n&#237;vel, o que ela faz, como ela opera e como &#233; a performance atual. Para isso &#233; importante se perguntar:</p><ol><li><p>Qual &#233; o papel dessa aplica&#231;&#227;o? &#201; um web server, banco de dados, load balancer?</p></li><li><p>Quais tipos de requisi&#231;&#245;es essa aplica&#231;&#227;o serve? &#201; poss&#237;vel medir?</p></li><li><p>A aplica&#231;&#227;o roda em qual modo de CPU? User-level ou kernel-level?</p></li><li><p>Como &#233; realizada a configura&#231;&#227;o da aplica&#231;&#227;o? Via arquivo, ENV VARs?</p></li><li><p>Como &#233; a infraestrutura que hospeda a aplica&#231;&#227;o? Quais s&#227;o seus recursos e limites?</p></li><li><p>A aplica&#231;&#227;o publica m&#233;tricas e logs? Quais logs podem ser habilitados e quais m&#233;tricas de performance est&#227;o dispon&#237;veis atrav&#233;s de logs?</p></li><li><p>Houve alguma modifica&#231;&#227;o recente visando melhoria de performance?</p></li><li><p>Existem bugs conhecidos em bibliotecas terceiras? Algum tipo de bug conhecido no web server ou banco de dados que possa afetar performance?</p></li></ol><p>Ao responder essas quest&#245;es, voc&#234; ter&#225; uma ideia de onde o esfor&#231;o precisa ser aplicado e o que voc&#234; precisa fazer e criar um objetivo. Voc&#234; pode iniciar com os tipos de opera&#231;&#245;es ou requisi&#231;&#245;es que a aplica&#231;&#227;o serve, se poss&#237;vel sempre usando m&#233;tricas - tais m&#233;tricas podem vir como requisito de neg&#243;cio ou de um arquiteto de solu&#231;&#245;es (ou algu&#233;m que fa&#231;a esse papel na sua empresa), alguns exemplos de objetivos:</p><ul><li><p>Lat&#234;ncia m&#233;dia de 10ms;</p></li><li><p>90% das requisi&#231;&#245;es completadas com lat&#234;ncia abaixo de 200ms;</p></li><li><p>N&#227;o ter requests acima de 2s;</p></li><li><p>Cada inst&#226;ncia (servidor, Pod, VM) da aplica&#231;&#227;o processar 5000 requests por segundo;</p></li></ul><p>Ao come&#231;ar esse trabalho &#233; comum (ou deveria ser) olhar o c&#243;digo da aplica&#231;&#227;o. Uma forma eficiente de realizar performance &#233; iniciando onde a maior parte do workload &#233; realizado. Por exemplo, se uma API est&#225; com alta lat&#234;ncia, pode ser mais assertivo analisar os trechos de c&#243;digo respons&#225;veis por acessar o banco de dados ou fazer serializa&#231;&#245;es mais pesadas.</p><h2>Aprofundando nas t&#233;cnicas</h2><p>Existem algumas t&#233;cnicas para melhorar performance de aplica&#231;&#245;es, vou abordar algumas aqui come&#231;ando por Caching.</p><h3>Caching</h3><p>Sistemas Operacionais utilizam cache para melhorar a performance de leitura em sistemas de arquivos. Nas aplica&#231;&#245;es utilizamos cache pelo mesmo motivo, ao inv&#233;s de sempre executar uma opera&#231;&#227;o pesada de leitura, os resultados de algumas opera&#231;&#245;es podem ser armazenados em um cache para uma utiliza&#231;&#227;o futura. Um &#243;timo exemplo &#233; cache em bancos de dados, onde o resultado das queries pode ser armazenado em um memcached ou Redis. Enquanto o cache vai melhorar o tempo de leitura, o disco ser&#225; usado como um buffer para melhorar opera&#231;&#245;es de escrita.</p><h3>Buffering</h3><p>Geralmente falamos muito mais de cache do que buffering, mas a realidade &#233; que essa &#233; uma das maneiras de melhorar opera&#231;&#245;es de escrita, onde os dados podem ser agrupados em um buffer antes de serem enviados para o pr&#243;ximo passo do processamento, aumentando o tamanho das opera&#231;&#245;es de I/O. Por&#233;m, existe um trade-off onde dependendo do tipo de escrita, onde isso pode aumentar a lat&#234;ncia, j&#225; que primeira escrita precisa esperar por outras.</p><h3>Escolhendo o tamanho da opera&#231;&#227;o de I/O (ou I/O Size)</h3><p>Antes de falar sobre isso vale diferencia tamanho de I/O (I/O Size) de Block Size. </p><p>I/O Size &#233; o page size que a aplica&#231;&#227;o utiliza, por exemplo 8KB no Postgres, 16KB no MySQL, ou seja, &#233; o tamanho real dos dados que est&#227;o sendo lidos e escrito em uma &#250;nica opera&#231;&#227;o. J&#225; o Block Size &#233; configurado no lado do Sistema Operacional (ou storage) e se refere ao tamanho da unidade de dados consegue endere&#231;ar, por exemplo se o Block Size do disco s&#227;o 16KB, mesmo que voc&#234; grave 5KB, o sistema ir&#225; utilizar 16KB no disco.</p><p>Dito isso, aumentar o tamanho das opera&#231;&#245;es de I/O &#233; uma estrat&#233;gia para melhorar o throughput. Por exemplo, &#233; muito mais eficiente transferir 128 KB de uma vez s&#243;, do que fazer 128 opera&#231;&#245;es separadas de 1 KB cada. E como sempre h&#225; trade-offs. Se a aplica&#231;&#227;o n&#227;o precisa de tamanhos maiores de I/O, o desempenho pode piorar (e muito). Imagine um banco de dados que faz leituras de 8 KB, se o sistema estiver lendo 128 KB por opera&#231;&#227;o, 120 KB s&#227;o desperdi&#231;ados a cada leitura. Isso gera uma lat&#234;ncia desnecess&#225;ria, que poderia ser reduzida com opera&#231;&#245;es de I/O menores e mais alinhadas com o padr&#227;o de acesso da aplica&#231;&#227;o.</p><h3>Paralelismo e Concorr&#234;ncia</h3><p>A diferen&#231;a entre paralelismo e concorr&#234;ncia &#233; bem importante para entender como otimizar aplica&#231;&#245;es. Concorr&#234;ncia &#233; a capacidade de lidar com m&#250;ltiplas tarefas ao mesmo tempo, enquanto paralelismo implica na execu&#231;&#227;o simult&#226;nea dessas tarefas. </p><h4>Fibers e Threads</h4><p>Threads s&#227;o as unidades b&#225;sicas de execu&#231;&#227;o gerenciada pelo sistema operacional. Cada thread possui sua pr&#243;pria stack e estado, compartilhando o mesmo espa&#231;o de mem&#243;ria com outras threads do mesmo processo. O sistema operacional aloca tempo de CPU para cada thread e realiza o context switching (processo de armazenar o estado da thread) entre elas, o que pode ser custoso devido ao overhead de salvar e restaurar o estado.</p><p>Fibers, por outro lado, s&#227;o threads leves (lightweight threads) gerenciadas pela pr&#243;pria aplica&#231;&#227;o e n&#227;o pelo sistema operacional. A principal diferen&#231;a &#233; que o escalonamento de fibers &#233; cooperativo, ou seja, a aplica&#231;&#227;o controla o fluxo de execu&#231;&#227;o, em vez de ser interrompido (preemptivo) pelo sistema operacional. O interessante das fibers &#233; que elas ocupam bem menos mem&#243;ria se comparado a threads, cada fiber pode ocupar de 2KB a 4KB.</p><h4>Coroutines</h4><p>Coroutines representam um modelo de concorr&#234;ncia onde as fun&#231;&#245;es podem ser suspensas e retomadas posteriormente, mantendo seu estado entre execu&#231;&#245;es. As principais caracter&#237;sticas incluem:</p><ul><li><p>Suspens&#227;o e retomada: Uma coroutine pode pausar sua execu&#231;&#227;o e retornar o controle para quem a chamou, mas mant&#233;m seu estado para continuar de onde parou;</p></li><li><p>Execu&#231;&#227;o ass&#237;ncrona sem callbacks: Permitem escrever c&#243;digo ass&#237;ncrono de forma sequencial, evitando o <a href="https://www.geeksforgeeks.org/what-to-understand-callback-and-callback-hell-in-javascript/">callback hell</a>;</p></li><li><p>Efici&#234;ncia: Consomem menos recursos que threads, permitindo alta concorr&#234;ncia.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!V1Lx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a03fe-7684-4c17-812c-4b1fd4782e5a_1462x831.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!V1Lx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a03fe-7684-4c17-812c-4b1fd4782e5a_1462x831.png 424w, https://substackcdn.com/image/fetch/$s_!V1Lx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a03fe-7684-4c17-812c-4b1fd4782e5a_1462x831.png 848w, https://substackcdn.com/image/fetch/$s_!V1Lx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a03fe-7684-4c17-812c-4b1fd4782e5a_1462x831.png 1272w, https://substackcdn.com/image/fetch/$s_!V1Lx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a03fe-7684-4c17-812c-4b1fd4782e5a_1462x831.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!V1Lx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a03fe-7684-4c17-812c-4b1fd4782e5a_1462x831.png" width="1462" height="831" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/548a03fe-7684-4c17-812c-4b1fd4782e5a_1462x831.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:831,&quot;width&quot;:1462,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:128551,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/158947812?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa58ac0f2-472d-4284-9a2f-f9c82dcd895f_1498x1042.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!V1Lx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a03fe-7684-4c17-812c-4b1fd4782e5a_1462x831.png 424w, https://substackcdn.com/image/fetch/$s_!V1Lx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a03fe-7684-4c17-812c-4b1fd4782e5a_1462x831.png 848w, https://substackcdn.com/image/fetch/$s_!V1Lx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a03fe-7684-4c17-812c-4b1fd4782e5a_1462x831.png 1272w, https://substackcdn.com/image/fetch/$s_!V1Lx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a03fe-7684-4c17-812c-4b1fd4782e5a_1462x831.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Exemplo de goroutine em Go</figcaption></figure></div><h4>Thread Pools</h4><p>Thread pools s&#227;o mecanismos para gerenciar um conjunto de threads reutiliz&#225;veis, evitando a cria&#231;&#227;o e destrui&#231;&#227;o constante de threads, devido ao context switching que mencionei anteriormente.</p><p>Um service thread pool &#233; dedicado a opera&#231;&#245;es de longa dura&#231;&#227;o, especialmente com foco em I/O (acesso a rede, DBs ou filesystems). J&#225; um CPU thread pool &#233; dedicado a opera&#231;&#245;es de processamento intensivo, ideal para c&#225;lculos, transforma&#231;&#245;es de dados, compress&#227;o, etc&#8230;</p><h4>SEDA (Staged Event-Driven Architecture)</h4><p>SEDA &#233; uma arquitetura que decomp&#245;e uma aplica&#231;&#227;o em um conjunto de est&#225;gios conectados por filas, onde cada est&#225;gio possui seu pr&#243;prio thread pool. Essa abordagem fornece alguns benef&#237;cios como:</p><ul><li><p>Isolamento de recursos: Problemas em um est&#225;gio n&#227;o afetam diretamente outros est&#225;gios;</p></li><li><p>Permite backpressure: Filas entre est&#225;gios podem implementar mecanismos de controle de fluxo;</p></li><li><p>Otimiza&#231;&#227;o de recursos: Cada est&#225;gio pode ter seu thread pool dimensionado de acordo com suas caracter&#237;sticas espec&#237;ficas;</p></li><li><p>Monitoramento mais f&#225;cil: M&#233;tricas podem ser coletadas por est&#225;gio, facilitando a identifica&#231;&#227;o de poss&#237;veis gargalos.</p></li></ul><h2>Linguagens de programa&#231;&#227;o</h2><p>Linguagens de programa&#231;&#227;o podem ser interpretadas ou compiladas. Vale um grande par&#234;ntese aqui: muitas das linguagens se &#8220;vendem&#8221; por serem conhecidas por ser otimizadas para performance, mas que no final das contas, vai depender mais do software ou do c&#243;digo escrito do que da linguagem em si. Essa &#233; a verdade.</p><h3>Compilado vs Interpretado</h3><p>Linguagens compiladas, como C, Go e Rust, passam por um processo de compila&#231;&#227;o antes da execu&#231;&#227;o, onde o c&#243;digo fonte &#233; traduzido para instru&#231;&#245;es de m&#225;quina e armazenado em arquivos bin&#225;rios. Esses bin&#225;rios podem ser executados a qualquer momento, sem necessidade de ser recompilado.</p><p>Uma das grandes vantagens das linguagens compiladas &#233; a performance. Como o c&#243;digo j&#225; est&#225; traduzido para instru&#231;&#245;es que o processador entende, n&#227;o haver&#225; o overhead de interpreta&#231;&#227;o durante o runtime. </p><p>Compiladores tamb&#233;m aplicam otimiza&#231;&#245;es, reorganizando instru&#231;&#245;es para extrair ainda mais desempenho.</p><p>J&#225; por outro lado, as linguagens interpretadas como PHP, Python ou Ruby executam o c&#243;digo linha por linha durante o runtime. Esse processo de interpreta&#231;&#227;o envolve parsing, tradu&#231;&#227;o e execu&#231;&#227;o din&#226;mica, o que vai adicionar um overhead a cada execu&#231;&#227;o. Sim, essas linguagens n&#227;o foram projetadas pensando em alta performance, e sim em produtividade e facilidade de escrita. Por&#233;m, h&#225; diversos sistemas mega robustos recebendo milhares de requests por segundo constru&#237;dos com essas linguagens, o que novamente vale ressaltar: vai depender muito mais de como seu c&#243;digo foi escrito do que da linguagem em si.</p><h3>Garbage Collection</h3><p>Algumas linguagens utilizam um sistema autom&#225;tico de gerenciamento de mem&#243;ria, onde a mem&#243;ria alocada pela aplica&#231;&#227;o &#233; &#8220;limpa&#8221; de forma ass&#237;ncrona, chamado Garbage Collector. Por&#233;m, ao utilizar GC tamb&#233; h&#225; trade-offs: </p><ul><li><p>A mem&#243;ria da aplica&#231;&#227;o pode crescer de forma gradativa se o GC n&#227;o liberar objetos corretamente, levando seu sistema a &#8220;swapar&#8221; ou at&#233; cair (aquele famoso OOM no Kubernetes);</p></li><li><p> O GC consome CPU ao escanear a mem&#243;ria, o que pode reduzir os recursos dispon&#237;veis para a aplica&#231;&#227;o, especialmente em aplica&#231;&#245;es com uso intensivo de mem&#243;ria;</p></li><li><p> Dependendo do tipo de coleta utilizando no GC, ele pode pausar a execu&#231;&#227;o da aplica&#231;&#227;o em alguns casos, retornando requests com uma lat&#234;ncia acima do esperado.</p></li></ul><p>Vale consultar a documenta&#231;&#227;o da linguagem utilizada e configurar o GC de acordo com o seu cen&#225;rio.</p><h3>Virtual Machines</h3><p>Linguagens como o Java s&#227;o normalmente executadas em Virtual Machines (VMs), onde elas podem ser executadas independente da plataforma. O c&#243;digo fonte &#233; compilado para um conjunto de instru&#231;&#245;es da VM, chamado bytecode, que pode ser executado em qualquer sistema que tenha aquela VM instalada.</p><p>Ainda utilizando o exemplo do Java, &#233; poss&#237;vel utilizar JIT que converte o bytecode em instru&#231;&#245;es de m&#225;quina, oferecendo uma performance bem pr&#243;xima ao de um c&#243;digo compilado.</p><h2>Voltando em metodologias</h2><p>Al&#233;m das metodologias que descrevi em um post dedicado ao tema, vale a pena ressaltar algumas t&#233;cnicas de an&#225;lise um pouco mais espec&#237;ficas, como CPU Profiling, an&#225;lise de syscalls e tracing distribu&#237;do.</p><h3>CPU Profiling</h3><p>Profiling constr&#243;i uma &#8220;imagem&#8221; de alguns momentos durante a execu&#231;&#227;o da sua aplica&#231;&#227;o para entender um determinado comportamento da CPU, onde &#233; poss&#237;vel identificar gargalos e problemas de performance.</p><p>Atualmente, v&#225;rias (ou quase todas) ferramentas de observabilidade e monitora&#231;&#227;o possuem suporte a profilers, mas o que muita gente desconhece &#233; que o pr&#243;prio linux possui ferramentas para tal finalidade, como o <code>perf</code>. O <code>perf</code> roda em modo kernel e pode caputar tanto stacks do kernel (kernel-level) quanto de usu&#225;rio (user-level), o que vai prover uma visibilidade praticamente completa da utiliza&#231;&#227;o da CPU.</p><p>Os profilers construidos para linguagens espec&#237;ficas geralmente capturam a utiliza&#231;&#227;o da CPU em user-level, o que pode ocultar algumas informa&#231;&#245;es, por isso o ideal &#233; iniciar essa an&#225;lise utilizando um profiler que tenha acesso tanto ao user-level quanto ao kernel-level, para ter uma vis&#227;o do todo.</p><p>A minha recomenda&#231;&#227;o aqui &#233; utilizar <a href="https://github.com/brendangregg/FlameGraph">flame graphs</a>. Eles est&#227;o dispon&#237;veis na maioria das ferramentas de observabilidade hoje em dia.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yzfr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5541125-865d-4a18-80e5-910a68358c67_932x585.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yzfr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5541125-865d-4a18-80e5-910a68358c67_932x585.png 424w, https://substackcdn.com/image/fetch/$s_!yzfr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5541125-865d-4a18-80e5-910a68358c67_932x585.png 848w, https://substackcdn.com/image/fetch/$s_!yzfr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5541125-865d-4a18-80e5-910a68358c67_932x585.png 1272w, https://substackcdn.com/image/fetch/$s_!yzfr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5541125-865d-4a18-80e5-910a68358c67_932x585.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yzfr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5541125-865d-4a18-80e5-910a68358c67_932x585.png" width="932" height="585" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a5541125-865d-4a18-80e5-910a68358c67_932x585.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:585,&quot;width&quot;:932,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:159307,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/158947812?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5541125-865d-4a18-80e5-910a68358c67_932x585.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yzfr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5541125-865d-4a18-80e5-910a68358c67_932x585.png 424w, https://substackcdn.com/image/fetch/$s_!yzfr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5541125-865d-4a18-80e5-910a68358c67_932x585.png 848w, https://substackcdn.com/image/fetch/$s_!yzfr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5541125-865d-4a18-80e5-910a68358c67_932x585.png 1272w, https://substackcdn.com/image/fetch/$s_!yzfr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5541125-865d-4a18-80e5-910a68358c67_932x585.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Exemplo de flame graph</figcaption></figure></div><h3>Outros recursos</h3><p>Os profilers tamb&#233;m mostram evid&#234;ncias de problemas que podem estar acontecendo al&#233;m da utiliza&#231;&#227;o de CPU, I/O de disco &#233; um exemplo disso. Ao analisar resultados de profilers atrav&#233;s de flame graph, voc&#234; pode encontrar fun&#231;&#245;es que referenciam quais opera&#231;&#245;es est&#227;o acontecendo naquele momento. </p><p>&#201; importante ressaltar que ao analisar essas opera&#231;&#245;es voc&#234; s&#243; ir&#225; encontrar as atividades e n&#227;o seus resultados. Uma das formas de entender melhor essas opera&#231;&#245;es &#233; instrumentando a aplica&#231;&#227;o com OpenTelemetry por exemplo, dessa forma voc&#234; ir&#225; conseguir correlacionar melhor em qual parte do c&#243;digo est&#225; utilizando mais rede ou disco.</p><p>Vou listar alguns nomes de fun&#231;&#245;es para dar uma ideia dessas opera&#231;&#245;es ao analisar flame graphs:</p><ul><li><p><code>ext4</code>, <code>zfs</code>, <code>xfs</code>: Opera&#231;&#245;es no file system</p></li><li><p><code>tcp</code>: Opera&#231;&#245;es de rede</p></li><li><p><code>alloc</code>: Aloca&#231;&#227;o de mem&#243;ria</p></li></ul><h3>Syscalls</h3><p>System calls tamb&#233;m podem ser instrumentadas para encontrar problemas de performance. A ideia aqui &#233; entender onde o time da syscall &#233; gasto, incluindo o tipo e o motivo dela ter sido invocada.</p><p>Existe uma documenta&#231;&#227;o muito abrangente sobre syscalls no pr&#243;prio <code>man</code>. Vou listar algumas syscalls importantes que podem ser analisadas:</p><ul><li><p>Para execu&#231;&#227;o de novos processos. Voc&#234; pode utilizar o <code>execsnoop</code> para analisar a syscall <a href="https://man7.org/linux/man-pages/man2/execve.2.html">execve(2)</a>;</p></li><li><p>Para syscalls de I/O como <a href="https://man7.org/linux/man-pages/man2/read.2.html">read(2)</a>, <a href="https://man7.org/linux/man-pages/man2/open.2.html">open(2)</a> e <a href="https://man7.org/linux/man-pages/man2/send.2.html">send(2)</a> voc&#234; pode utilizar o <code>bpftrace</code>;</p></li><li><p>J&#225; a ferramenta <code>syscount</code> pode mostrar o tempo de CPU em opera&#231;&#245;es do Kernel (Kernel time). </p></li></ul><p>Vale lembrar que dependendo da distribui&#231;&#227;o Linux, o nome desses comandos podem ser um pouquinho diferente. Por exemplo, no Ubuntu as ferramentas s&#227;o nomeadas como coloquei acima. J&#225; no PopOS! elas tem o sufixo <code>bpfcc</code>. </p><h3>USE</h3><p>Assim como mencionei no post anterior, &#233; poss&#237;vel utilizar a metodologia USE para resolver problemas em aplica&#231;&#227;o atrav&#233;s da an&#225;lise da utiliza&#231;&#227;o, satura&#231;&#227;o e erros.</p><p>Por exemplo, imagine um servi&#231;o que processa uploads de arquivos em background. Esse servi&#231;o ter&#225; utiliza uma fila de tarefas e um conjunto de processos (pool de worker threads) que ir&#227;o armazenar os arquivos no S3. Tendo esse servi&#231;o em mente poder definir tr&#234;s m&#233;tricas assim:</p><ul><li><p>Utiliza&#231;&#227;o: Percentual m&#233;dio dos processos de upload que estiveram ativos em um intervalo de tempo. Por exemplo, 80% significa que, em m&#233;dia, 8 de 10 processos estavam ocupados lidando com uploads;</p></li><li><p>Satura&#231;&#227;o: Tamanho m&#233;dio da fila de uploads pendentes no mesmo intervalo. Esse valor indica quantos uploads estavam esperando por um processo dispon&#237;vel para come&#231;ar;</p></li><li><p>Erros: Quantidade de uploads que falharam, seja por timeout, problemas de rede ou tamanho do arquivo excedido.</p></li></ul><p>A pr&#243;xima etapa seria identificar como coletar essas m&#233;tricas. Algumas podem estar expostas pela aplica&#231;&#227;o via logs e m&#233;tricas no formato timeseries para ser analisadas via Prometheus ou at&#233; utilizar eBPF para uma an&#225;lise em tempo real. Esse tema ficar&#225; para um post futuro.</p><h3>Tracing distribu&#237;do</h3><p>Por fim, temos tracing distribu&#237;do, muito utilizado em ambientes de arquitetura distribu&#237;da compostas por servi&#231;os rodando em diferentes servidores e/ou sistemas. </p><p>Tracing distribu&#237;do envolve analisar informa&#231;&#245;es de cada request realizadas nesses servi&#231;os e combin&#225;-las para ter uma vis&#227;o geral. Dessa forma saberemos quais s&#227;o as depend&#234;ncias de cada servi&#231;o, o tempo gasto em cada uma dessas depend&#234;ncias e qual servi&#231;o est&#225; gerando a lat&#234;ncia ou os erros que est&#227;o sendo retornados.</p><p>Dentro das informa&#231;&#245;es que os traces produzem podem estar:</p><ul><li><p>RequestID &#250;nico da transa&#231;&#227;o</p></li><li><p>Hor&#225;rio de in&#237;cio e fim da transa&#231;&#227;o</p></li><li><p>Status de erros</p></li></ul><p>Um dos desafios do tracing distribu&#237;do &#233; o volume de dados que pode ser gerado, onde cada requisi&#231;&#227;o na aplica&#231;&#227;o pode resultar em m&#250;ltiplos registros. Uma abordagem comum para lidar com esse problema &#233; utilizar sampling, por exemplo, &#233; poss&#237;vel coletar dados de apenas uma em cada mil (ou mais) requests. Isso costuma ser suficiente para entender o comportamento geral do sistema, mas pode dificultar a an&#225;lise de erros intermitentes.</p><p>Vale tamb&#233;m mencionar que existem dois tipos de sampling, head-based e tail-sampled. Onde o head-based a decis&#227;o se toda informa&#231;&#227;o ser&#225; armazenada &#233; feita no in&#237;cio da request e o tail-based &#233; decidido posteriormente. A diferen&#231;a entre eles &#233; que no tail-based alguns crit&#233;rios como lat&#234;ncia ou presen&#231;a de erros ser&#227;o levados em considera&#231;&#227;o se o trace ser&#225; mantido ou descartado.</p><h2>Concluindo</h2><p>Acredito que seja muito valioso abordar esses temas mais profundos, principalmente para quem trabalha com performance de aplica&#231;&#245;es, como SREs e engenheiros de software. Entender o que realmente est&#225; acontecendo em seu sistema &#233; essencial para n&#227;o ficar aquele famoso jogo de &#8220;empurra-empurra&#8221; entre infraestrutura e c&#243;digo.</p><p>Ferramentas de observabilidade ajudam bastante a mostrar sintomas e poss&#237;veis causas, mas saber como sua aplica&#231;&#227;o funciona, qual &#233; o seu papel e como iniciar uma an&#225;lise estruturada &#233; o que faz diferen&#231;a de verdade. No fim das contas, um bom troubleshooting come&#231;a com contexto, n&#227;o com achismos.</p><p>At&#233; a pr&#243;xima.</p>]]></content:encoded></item><item><title><![CDATA[Systems Performance - Capacity Planning]]></title><description><![CDATA[Estrat&#233;gias para planejar recursos com m&#225;xima efici&#234;ncia sem quebrar o or&#231;amento]]></description><link>https://blog.padz.dev/p/systems-performance-capacity-planning</link><guid isPermaLink="false">https://blog.padz.dev/p/systems-performance-capacity-planning</guid><dc:creator><![CDATA[Bruno Padilha]]></dc:creator><pubDate>Wed, 05 Mar 2025 16:28:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VOnR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fcdbc34-ef1d-4175-8f41-a8ec77214088_6000x4000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VOnR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fcdbc34-ef1d-4175-8f41-a8ec77214088_6000x4000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VOnR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fcdbc34-ef1d-4175-8f41-a8ec77214088_6000x4000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!VOnR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fcdbc34-ef1d-4175-8f41-a8ec77214088_6000x4000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!VOnR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fcdbc34-ef1d-4175-8f41-a8ec77214088_6000x4000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!VOnR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fcdbc34-ef1d-4175-8f41-a8ec77214088_6000x4000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VOnR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fcdbc34-ef1d-4175-8f41-a8ec77214088_6000x4000.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4fcdbc34-ef1d-4175-8f41-a8ec77214088_6000x4000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2785068,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/157681504?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fcdbc34-ef1d-4175-8f41-a8ec77214088_6000x4000.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VOnR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fcdbc34-ef1d-4175-8f41-a8ec77214088_6000x4000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!VOnR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fcdbc34-ef1d-4175-8f41-a8ec77214088_6000x4000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!VOnR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fcdbc34-ef1d-4175-8f41-a8ec77214088_6000x4000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!VOnR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fcdbc34-ef1d-4175-8f41-a8ec77214088_6000x4000.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Imagem por <a href="https://unsplash.com/@jrkorpa?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Jr Korpa</a> no <a href="https://unsplash.com/photos/pink-and-black-wallpaper-9XngoIpxcEo?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></figcaption></figure></div><p>Bem vindos a mais um post da s&#233;rie sobre Systems Performance. Agora vou abordar um tema que vejo que &#233; pouco discutido em times de engenharia e SREs, mas super importante. Capacity Planning.</p><p>Capacity Planning sempre existiu, n&#227;o &#233; coisa nova. Nos meus tempos de sysadmin e datacenters f&#237;sicos, planejar a capacidade dos recursos computacionais era super importante pois nos dava uma vis&#227;o de que tipo de servidores comprar, se seria necess&#225;rio investir em novos switches de fibra para interligar aquele novo storage lotado de disco SSD e por a&#237; vai. Era uma &#233;poca onde escalar horizontalmente n&#227;o era t&#227;o simples (e barato) como hoje, ent&#227;o tudo devia ser muito bem pensado.</p><p>Com avan&#231;o da cloud, ficou muito mais f&#225;cil de escalar, subir e descer recursos sob demanda, mas assim como no passado (n&#227;o t&#227;o distante), economia de custos sempre foi uma vantagem muito competitiva. E Capacity Planning &#233; isso, &#233; ter or&#231;ado e planejado a quantidade certa de recursos para desde uma aplica&#231;&#227;o at&#233; toda camada de dados e armazenamento. &#201; saber colocar na balan&#231;a performance e custo, sem levar a empresa a fal&#234;ncia. &#201; o famoso fazer mais com menos.</p><p>Capacity Planning tamb&#233;m &#233; analisar como uma aplica&#231;&#227;o vai se comportar quando come&#231;ar a receber requisi&#231;&#245;es e como ela ir&#225; escalar conforme a quantidade de requisi&#231;&#245;es aumenta. Essa an&#225;lise pode ser feita de v&#225;rias maneiras, vamos l&#225;.</p><h2>Limites de Recursos</h2><p>Encontrar o recurso que vai se tornar o gargalo sob muita carga &#233; a primeira forma de an&#225;lise. Em ambientes de containers, recursos podem ter seus limites setados por configura&#231;&#245;es e que podem vir a se tornar um gargalo. E por onde podemos come&#231;ar?</p><p>Comece identificado o papel daquele servidor e o tipo de requisi&#231;&#245;es que ele serve, por exemplo, um servidor web serve requisi&#231;&#245;es HTTP, j&#225; um servidor NFS serve requisi&#231;&#245;es atrav&#233;s do protocolo NFS e um servidor de banco de dados serve requisi&#231;&#245;es de queries.</p><p>O pr&#243;ximo passo &#233; determinar o consumo de recurso por requisi&#231;&#227;o. Para um sistema existente, voc&#234; pode medir a taxa de requisi&#231;&#245;es atuais junto com a utiliza&#231;&#227;o dos recursos, onde voc&#234; pode estimar atrav&#233;s de <a href="https://pt.wikipedia.org/wiki/Extrapola%C3%A7%C3%A3o">extrapola&#231;&#227;o</a> qual recurso ir&#225; chegar aos 100% de utiliza&#231;&#227;o primeiro e qual ser&#225; a taxa de requests. Para sistemas que est&#227;o sendo desenvolvidos, voc&#234; pode utilizar ferramentas que de load test para simular a quantidade de requests que aquele sistema deve receber e ao mesmo tempo medindo a utiliza&#231;&#227;o dos recursos. Conforme o n&#250;mero de requisi&#231;&#245;es for aumentando, com certeza voc&#234; ir&#225; encontrar o limite de utiliza&#231;&#227;o de cada recurso.</p><p>Certo, mas quais recursos eu posso monitorar?</p><p>Para hardware, utiliza&#231;&#227;o de CPU, utiliza&#231;&#227;o de mem&#243;ria, IOPS, throughput do disco e rede e espa&#231;o em disco. No lado do software, utiliza&#231;&#227;o da mem&#243;ria virtual, quantidade de threads/processos e de file descriptors.</p><p>Digamos que voc&#234; est&#225; analisando uma aplica&#231;&#227;o que est&#225; recebendo 200 requests por segundo e o recurso mais ocupado no seu servidor s&#227;o as 8 CPUs que ele possui, que est&#227;o com utiliza&#231;&#227;o m&#233;dia de 60%, ent&#227;o voc&#234; chega na conclus&#227;o que esse ser&#225; o seu gargalo assim que a CPU chegar em 100%, mas como voc&#234; vai precisar saber quantas requests por segundo o sistema precisa receber pra chegar a esse ponto, certo? A f&#243;rmula pra chegar no valor &#233; basicamente:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LktV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b56f1c3-5d30-4369-b09e-17979a502b96_603x249.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LktV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b56f1c3-5d30-4369-b09e-17979a502b96_603x249.png 424w, https://substackcdn.com/image/fetch/$s_!LktV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b56f1c3-5d30-4369-b09e-17979a502b96_603x249.png 848w, https://substackcdn.com/image/fetch/$s_!LktV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b56f1c3-5d30-4369-b09e-17979a502b96_603x249.png 1272w, https://substackcdn.com/image/fetch/$s_!LktV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b56f1c3-5d30-4369-b09e-17979a502b96_603x249.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LktV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b56f1c3-5d30-4369-b09e-17979a502b96_603x249.png" width="603" height="249" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7b56f1c3-5d30-4369-b09e-17979a502b96_603x249.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:249,&quot;width&quot;:603,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:36149,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/157681504?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b56f1c3-5d30-4369-b09e-17979a502b96_603x249.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LktV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b56f1c3-5d30-4369-b09e-17979a502b96_603x249.png 424w, https://substackcdn.com/image/fetch/$s_!LktV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b56f1c3-5d30-4369-b09e-17979a502b96_603x249.png 848w, https://substackcdn.com/image/fetch/$s_!LktV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b56f1c3-5d30-4369-b09e-17979a502b96_603x249.png 1272w, https://substackcdn.com/image/fetch/$s_!LktV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b56f1c3-5d30-4369-b09e-17979a502b96_603x249.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A predi&#231;&#227;o seria de aproximadamente 333 requests por segundo para a CPU chegar a 100% ocupada. Por&#233;m, vale lembrar que essa &#233; uma estimativa, pode ser que durante o aumento de requests algum outro fator limitante possa ser encontrado. </p><h2>An&#225;lise de Recursos</h2><p>Ao escolher uma inst&#226;ncia/VM na cloud ou adquirir novo hardware h&#225; alguns fatores que podem ser alterados para alcan&#231;ar a performance desejada. Esse processo inclui escolher o tipo e tamanho de discos e CPUs, a quantidade de mem&#243;ria, configura&#231;&#245;es do filesystem e por a&#237; vai. A ideia &#233; conseguir a performance desejada com o menor custo poss&#237;vel.</p><p>Uma ideia de como testar combina&#231;&#245;es de configura&#231;&#245;es a partir de uma configura&#231;&#227;o &#8220;m&#225;xima&#8221;:</p><ol><li><p>Teste a performance usando todos os recursos configuradas ao m&#225;ximo, por exemplo: uma inst&#226;ncia com 16 CPUs, 64GB de RAM, utilizando discos SSD ou NVMe formatados e particionados da melhor forma poss&#237;vel;</p></li><li><p>Mude os fatores um por um e continue testando a performance;</p></li><li><p>Anote a porcentagem de queda de performance para cada recurso alterado e o custo financeiro de cada altera&#231;&#227;o/configura&#231;&#227;o;</p></li><li><p>Iniciar com o m&#225;ximo de performance (e que o bolso pode pagar), escolha os recursos que voc&#234; abre m&#227;o para economizar mais, ao mesmo tempo mantendo a quantidade de requests necess&#225;rias;</p></li><li><p>Teste novamente a configura&#231;&#227;o ideal para confirmar se a performance est&#225; dentro do esperado.</p></li></ol><p>Imagine que estamos projetando a capacidade de um banco de dados distribu&#237;do para uma aplica&#231;&#227;o de recomenda&#231;&#227;o de produtos. O requisito &#233; suportar 500k queries por segundo, com um dataset de 2TB, distribu&#237;do em 10 nodes. A configura&#231;&#227;o m&#225;xima para cada node seria 2 CPUs com 32 cores, 512GB de RAM, 4 SSDs entregando 100k IOPS cada e um throughput de rede de 40Gbps.</p><p>Se reduzirmos os recursos, vamos observar as seguintes quedas na performance:</p><ul><li><p>Reduzindo para 1 CPU: 45%</p></li><li><p>Utilizando metade de RAM (256GB): 60%</p></li><li><p>Usando 2 SSDs: 35%</p></li><li><p>Reduzindo a rede para 10Gbps: 30%</p></li></ul><p>Com essa configura&#231;&#227;o, vamos estimar a performance estimada por cada node:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W3TW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bb7e2a-5159-48ee-bc08-5c90684ce5f6_703x267.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W3TW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bb7e2a-5159-48ee-bc08-5c90684ce5f6_703x267.png 424w, https://substackcdn.com/image/fetch/$s_!W3TW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bb7e2a-5159-48ee-bc08-5c90684ce5f6_703x267.png 848w, https://substackcdn.com/image/fetch/$s_!W3TW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bb7e2a-5159-48ee-bc08-5c90684ce5f6_703x267.png 1272w, https://substackcdn.com/image/fetch/$s_!W3TW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bb7e2a-5159-48ee-bc08-5c90684ce5f6_703x267.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W3TW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bb7e2a-5159-48ee-bc08-5c90684ce5f6_703x267.png" width="703" height="267" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/96bb7e2a-5159-48ee-bc08-5c90684ce5f6_703x267.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:267,&quot;width&quot;:703,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:30635,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/157681504?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bb7e2a-5159-48ee-bc08-5c90684ce5f6_703x267.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!W3TW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bb7e2a-5159-48ee-bc08-5c90684ce5f6_703x267.png 424w, https://substackcdn.com/image/fetch/$s_!W3TW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bb7e2a-5159-48ee-bc08-5c90684ce5f6_703x267.png 848w, https://substackcdn.com/image/fetch/$s_!W3TW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bb7e2a-5159-48ee-bc08-5c90684ce5f6_703x267.png 1272w, https://substackcdn.com/image/fetch/$s_!W3TW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96bb7e2a-5159-48ee-bc08-5c90684ce5f6_703x267.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Cada node entregaria ~5000 queries por segundo, ou seja para suportar 500k queries por segundo, precisar&#237;amos de 100 nodes. Analisando profundamente, essa configura&#231;&#227;o &#8220;econ&#244;mica&#8221; pode n&#227;o ser vi&#225;vel. Por isso, teste muito e avalie o que vale a pena no fim do dia.</p><h2>Escalando</h2><p>Quando pensamos em escalar sistemas, geralmente pensamos em duas solu&#231;&#245;es, a vertical, onde aumentamos a quantidade de recurso de um determinado servidor, ou a horizontal, onde aumentamos a quantidade de r&#233;plicas geralmente atr&#225;s de um load balancer para que esses servidores pare&#231;am ser um s&#243;.</p><p>Hoje quando s&#243; falamos em cloud, &#233; poss&#237;vel utilizar inst&#226;ncias/VMs menores e se aproveitar cada vez mais do escalonamento horizontal de forma mais eficiente, sempre adicionando novas inst&#226;ncias aos poucos, o que nos leva a um Capacity Planning menos &#8220;rigoroso&#8221; no in&#237;cio de um projeto em fase de desenvolvimento.</p><p>Como j&#225; bem conhecido e estabelecido &#233; poss&#237;vel automatizar esse escalonamento em qualquer cloud utilizando m&#233;tricas. Por exemplo, na AWS existe o <a href="https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-groups.html">Auto Scaling Group</a>, onde uma pol&#237;tica de escalonamento customizado pode ser utilizada para aumentar ou diminuir a quantidade de inst&#226;ncias baseada em uma m&#233;trica.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VUJV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdad5ee0-47cb-4048-8fb7-6eca53db09d5_801x396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VUJV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdad5ee0-47cb-4048-8fb7-6eca53db09d5_801x396.png 424w, https://substackcdn.com/image/fetch/$s_!VUJV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdad5ee0-47cb-4048-8fb7-6eca53db09d5_801x396.png 848w, https://substackcdn.com/image/fetch/$s_!VUJV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdad5ee0-47cb-4048-8fb7-6eca53db09d5_801x396.png 1272w, https://substackcdn.com/image/fetch/$s_!VUJV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdad5ee0-47cb-4048-8fb7-6eca53db09d5_801x396.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VUJV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdad5ee0-47cb-4048-8fb7-6eca53db09d5_801x396.png" width="801" height="396" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cdad5ee0-47cb-4048-8fb7-6eca53db09d5_801x396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:396,&quot;width&quot;:801,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:86896,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.padz.dev/i/157681504?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdad5ee0-47cb-4048-8fb7-6eca53db09d5_801x396.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VUJV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdad5ee0-47cb-4048-8fb7-6eca53db09d5_801x396.png 424w, https://substackcdn.com/image/fetch/$s_!VUJV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdad5ee0-47cb-4048-8fb7-6eca53db09d5_801x396.png 848w, https://substackcdn.com/image/fetch/$s_!VUJV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdad5ee0-47cb-4048-8fb7-6eca53db09d5_801x396.png 1272w, https://substackcdn.com/image/fetch/$s_!VUJV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcdad5ee0-47cb-4048-8fb7-6eca53db09d5_801x396.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Em sistemas como o Kubernetes, tamb&#233;m existe suporte a autoscaling, como por exemplo o <a href="https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/">HPA</a>, que pode escalar Pods de forma horizontal se baseando em m&#233;tricas de utiliza&#231;&#227;o de CPU ou de alguma outra m&#233;trica customizada.</p><p>J&#225; para bancos de dados, uma forma comum de escalonamento &#233; o sharding, onde o dado &#233; dividido em segmentos l&#243;gicos gerenciado por inst&#226;ncias distintas. </p><p><em>Pretendo fazer um post sobre isso mais para frente.</em></p><h2>Pontos finais</h2><p>Capacity Planning sempre existiu e sempre ir&#225; existir como uma boa pr&#225;tica, n&#227;o s&#243; para SREs, mas para arquitetos de solu&#231;&#245;es, engenheiros trabalhando em early-stage Startups ou Scaleups. &#201; uma estrat&#233;gia bem importante para definir como crescer e escalar seus sistemas.</p><p>At&#233; a pr&#243;xima!</p>]]></content:encoded></item><item><title><![CDATA[Systems Performance - Metodologias]]></title><description><![CDATA[Um deep-dive nas principais metodologias para troubleshooting de gargalos e outros problemas de performance em sistemas.]]></description><link>https://blog.padz.dev/p/systems-performance-metodologias</link><guid isPermaLink="false">https://blog.padz.dev/p/systems-performance-metodologias</guid><dc:creator><![CDATA[Bruno Padilha]]></dc:creator><pubDate>Wed, 19 Feb 2025 16:07:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5tkR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3fd5d1-5a92-4b1f-974c-5bc970f79283_1920x1280.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5tkR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3fd5d1-5a92-4b1f-974c-5bc970f79283_1920x1280.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5tkR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3fd5d1-5a92-4b1f-974c-5bc970f79283_1920x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5tkR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3fd5d1-5a92-4b1f-974c-5bc970f79283_1920x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5tkR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3fd5d1-5a92-4b1f-974c-5bc970f79283_1920x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5tkR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3fd5d1-5a92-4b1f-974c-5bc970f79283_1920x1280.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5tkR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3fd5d1-5a92-4b1f-974c-5bc970f79283_1920x1280.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7b3fd5d1-5a92-4b1f-974c-5bc970f79283_1920x1280.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:830889,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5tkR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3fd5d1-5a92-4b1f-974c-5bc970f79283_1920x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5tkR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3fd5d1-5a92-4b1f-974c-5bc970f79283_1920x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5tkR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3fd5d1-5a92-4b1f-974c-5bc970f79283_1920x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5tkR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3fd5d1-5a92-4b1f-974c-5bc970f79283_1920x1280.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Imagem criada por <a href="https://unsplash.com/@maxberg?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Maxim Berg</a> no <a href="https://unsplash.com/photos/a-colorful-abstract-background-with-wavy-lines-Ac02zYZs22Y?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></figcaption></figure></div><p>Esse &#233; mais um post da s&#233;rie sobre Systems Performance. Dessa vez, irei abordar sobre metodologias, ou seja, por onde come&#231;ar suas an&#225;lises em ambientes e aplica&#231;&#245;es que n&#227;o est&#227;o performando bem. Vou abordar sobre as principais utilizadas hoje em dia, como USE e RED, mas tamb&#233;m comentar sobre formas mais simples que as vezes, podem dar uma luz s&#243; pelo fato de fazer algumas perguntas.</p><p>Mas antes disso, vamos dar um passo para tr&#225;s e falar sobre perspectivas de an&#225;lises.</p><h2>Perspectivas</h2><p>Existem duas perspectivas comuns para a an&#225;lise de performance, cada uma direcionada a &#8220;alvos&#8221; diferentes e utilizando m&#233;tricas e abordagens distintas. Essas perspectivas s&#227;o: as an&#225;lises de workloads e as an&#225;lises de recursos.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZyGY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F850dc513-d023-44f4-a464-e6bc2af9b30c_921x476.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZyGY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F850dc513-d023-44f4-a464-e6bc2af9b30c_921x476.png 424w, https://substackcdn.com/image/fetch/$s_!ZyGY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F850dc513-d023-44f4-a464-e6bc2af9b30c_921x476.png 848w, https://substackcdn.com/image/fetch/$s_!ZyGY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F850dc513-d023-44f4-a464-e6bc2af9b30c_921x476.png 1272w, https://substackcdn.com/image/fetch/$s_!ZyGY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F850dc513-d023-44f4-a464-e6bc2af9b30c_921x476.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZyGY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F850dc513-d023-44f4-a464-e6bc2af9b30c_921x476.png" width="921" height="476" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/850dc513-d023-44f4-a464-e6bc2af9b30c_921x476.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:476,&quot;width&quot;:921,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:90283,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZyGY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F850dc513-d023-44f4-a464-e6bc2af9b30c_921x476.png 424w, https://substackcdn.com/image/fetch/$s_!ZyGY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F850dc513-d023-44f4-a464-e6bc2af9b30c_921x476.png 848w, https://substackcdn.com/image/fetch/$s_!ZyGY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F850dc513-d023-44f4-a464-e6bc2af9b30c_921x476.png 1272w, https://substackcdn.com/image/fetch/$s_!ZyGY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F850dc513-d023-44f4-a464-e6bc2af9b30c_921x476.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A an&#225;lise de recursos come&#231;a examinando os principais componentes do sistema, como CPU, mem&#243;ria, discos, interfaces de rede e etc... O foco aqui est&#225; na utiliza&#231;&#227;o, com o objetivo de identificar quando os recursos est&#227;o pr&#243;ximos de atingir ou se j&#225; excederam seus limites. Alguns recursos, como a CPU, possuem m&#233;tricas de utiliza&#231;&#227;o diretamente acess&#237;veis. Para outros, &#233; necess&#225;rio fazer estimativas baseadas em dados dispon&#237;veis, como calcular a utiliza&#231;&#227;o de interfaces de rede comparando o tr&#225;fego de sa&#237;da (egress) e entrada (ingress) com a largura de banda m&#225;xima.</p><p>As m&#233;tricas mais adequadas para an&#225;lise de recursos incluem: IOPS, Throughput, Utiliza&#231;&#227;o e Satura&#231;&#227;o. Vou entrar em detalhes sobre isso mais a diante.</p><p>Essas m&#233;tricas revelam n&#227;o apenas a carga aplicada a cada recurso, mas tamb&#233;m o qu&#227;o pr&#243;ximos eles est&#227;o de seus limites operacionais. M&#233;tricas adicionais, como lat&#234;ncia, fornecem uma vis&#227;o complementar, ajudando a avaliar como os recursos est&#227;o lidando com os workloads em termos de tempo de resposta. Existem ferramentas nativas no Linux como <code>vmstat</code>, <code>mpstat</code> e <code>iostat</code>, que fornecem dados detalhados para uma an&#225;lise mais certeira.</p><p>J&#225; a an&#225;lise de workload foca no desempenho das aplica&#231;&#245;es, avaliando a carga aplicada e como a aplica&#231;&#227;o responde a ela. As principais m&#233;tricas para an&#225;lise s&#227;o taxa de requests e lat&#234;ncia.</p><p>Essa an&#225;lise envolve examinar os atributos das requests, como o quantidade de clients, tabelas mais acessadas ou as queries mais realizadas. Isso ajuda a identificar cargas desnecess&#225;rias ou desbalanceadas. Mesmo em sistemas com baixa lat&#234;ncia, entender os padr&#245;es de workload pode revelar algumas oportunidades de otimiza&#231;&#227;o.</p><p>A lat&#234;ncia &#233; o indicador mais importante de desempenho da aplica&#231;&#227;o, representando o tempo de resposta. Para diferentes sistemas, como bancos de dados ou servidores web, a lat&#234;ncia equivale ao tempo para processar queries ou requisi&#231;&#245;es HTTP.</p><p>Com isso alinhado, vamos nos aprofundar em algumas metodologias.</p><h2>Metodologias</h2><p>Ao trabalhar com aplica&#231;&#245;es e ambientes n&#227;o perform&#225;ticos, geralmente o primeiro desafio &#233;: Por onde devemos come&#231;ar?</p><p>Assim como mencionei no primeiro <a href="https://blog.padz.dev/p/systems-performance-overview">post</a> dessa s&#233;rie, problemas de performance podem aparecer de qualquer lugar, software, hardware ou qualquer componente que esteja no fluxo dos dados. As metodologias de an&#225;lise podem ajudar por onde iniciar a an&#225;lise com processos mais efetivos.</p><h3>Entendendo o problema</h3><p>Entender o que de fato est&#225; acontecendo &#233; a primeira coisa a ser feita. N&#227;o importa o tipo de problema. Com uma s&#233;rie de perguntas b&#225;sicas, as vezes &#233; poss&#237;vel chegar a uma causa e a solu&#231;&#227;o do problema s&#243; respondendo essas perguntas.</p><ol><li><p>O que te faz pensar que existe um problema de performance?</p></li><li><p>Essa aplica&#231;&#227;o j&#225; teve boa performance anteriormente? Se sim, h&#225; quanto tempo?</p></li><li><p>O que mudou nos &#250;ltimos dias? C&#243;digo? Altera&#231;&#227;o no workload? Hardware?</p></li><li><p>&#201; um problema no tempo de resposta?</p></li><li><p>O problema est&#225; afetando outras aplica&#231;&#245;es?</p></li><li><p>Como est&#225; o ambiente? Quais libs s&#227;o utilizadas? Existem vers&#245;es mais novas? Qual a configura&#231;&#227;o da aplica&#231;&#227;o?</p></li></ol><p>Obviamente que isso se torna cada vez mais &#8220;flu&#237;do&#8221; e natural uma vez que a senioridade da pessoa vai aumentando. Uma dica que eu dou para enriquecer ainda mais a an&#225;lise &#233; testar a hip&#243;tese de um problema com base em dados.</p><p>Outra dica que eu dou &#233;, cuidado com o n&#250;mero de ferramentas ao analisar e entender o problema. Sempre que poss&#237;vel, tente correlacionar as m&#233;tricas em um &#250;nico lugar.</p><h3>USE - Utilization, Saturation, Errors</h3><p>O m&#233;todo USE &#233; uma das abordagens para identificar gargalos e desempenho em sistemas. Ele se concentra na an&#225;lise de recursos como CPUs, mem&#243;ria e disco, seguindo tr&#234;s m&#233;tricas-chave:</p><ol><li><p>Utilization: Mede o percentual de tempo ou capacidade que um recurso est&#225; ocupado processando algum workload. Para mem&#243;ria, a utiliza&#231;&#227;o se refere &#224; porcentagem da capacidade total em uso.</p></li><li><p>Saturation: Indica a &#8220;press&#227;o&#8221; sobre o recurso, geralmente manifestada por filas de espera quando o recurso n&#227;o consegue atender &#224; toda demanda.</p></li><li><p>Errors: Mede eventos de falha, incluindo opera&#231;&#245;es que precisam ser repetidas ou dispositivos com falhas.</p></li></ol><p>Essa metodologia prioriza a verifica&#231;&#227;o r&#225;pida dessas m&#233;tricas para todos os recursos do sistema, criando uma lista de "known-unknowns" quando os dados est&#227;o indispon&#237;veis.</p><p>Uma dica aqui &#233; a investiga&#231;&#227;o de erros, que podem degradar o desempenho sem serem identificados de imediato, especialmente em sistemas que possuem algum tipo de mecanismo de recupera&#231;&#227;o autom&#225;tica.</p><p>No fluxograma abaixo, demonstro de forma pr&#225;tica como iniciar uma an&#225;lise utilizando o m&#233;todo USE.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2ghe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611efdbb-8ee8-45de-a5c6-836d1f0f84a5_720x1138.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2ghe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611efdbb-8ee8-45de-a5c6-836d1f0f84a5_720x1138.png 424w, https://substackcdn.com/image/fetch/$s_!2ghe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611efdbb-8ee8-45de-a5c6-836d1f0f84a5_720x1138.png 848w, https://substackcdn.com/image/fetch/$s_!2ghe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611efdbb-8ee8-45de-a5c6-836d1f0f84a5_720x1138.png 1272w, https://substackcdn.com/image/fetch/$s_!2ghe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611efdbb-8ee8-45de-a5c6-836d1f0f84a5_720x1138.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2ghe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611efdbb-8ee8-45de-a5c6-836d1f0f84a5_720x1138.png" width="594" height="938.85" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/611efdbb-8ee8-45de-a5c6-836d1f0f84a5_720x1138.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1138,&quot;width&quot;:720,&quot;resizeWidth&quot;:594,&quot;bytes&quot;:137516,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2ghe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611efdbb-8ee8-45de-a5c6-836d1f0f84a5_720x1138.png 424w, https://substackcdn.com/image/fetch/$s_!2ghe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611efdbb-8ee8-45de-a5c6-836d1f0f84a5_720x1138.png 848w, https://substackcdn.com/image/fetch/$s_!2ghe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611efdbb-8ee8-45de-a5c6-836d1f0f84a5_720x1138.png 1272w, https://substackcdn.com/image/fetch/$s_!2ghe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F611efdbb-8ee8-45de-a5c6-836d1f0f84a5_720x1138.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Erros geralmente s&#227;o verificados primeiro, j&#225; que eles s&#227;o r&#225;pidos e f&#225;ceis de interpretar. Satura&#231;&#227;o &#233; verificado em um segundo passo devido a facilidade de interpretar se comparado com a Utiliza&#231;&#227;o, j&#225; que qualquer n&#237;vel de satura&#231;&#227;o pode ser um problema.</p><p>Um ponto importante de destacar &#233; que picos curtos de alta utiliza&#231;&#227;o podem causar satura&#231;&#227;o e consequentemente, problemas de desempenho, mesmo que a utiliza&#231;&#227;o m&#233;dia em intervalos maiores pare&#231;a baixa. Ferramentas de monitoramento que usam m&#233;dias de 5 minutos por exemplo, podem mascarar esses picos, como no caso de CPUs que atingem 100% brevemente, gerando gargalos n&#227;o detect&#225;veis em m&#233;dias mais extensas.</p><p>Assim que voc&#234; tiver em m&#227;os os recursos a serem analisados, pense nas m&#233;tricas para cada um deles se baseando em utiliza&#231;&#227;o, satura&#231;&#227;o e erros, por exemplo:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HZZj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb470095e-882d-4ac6-9e2e-5fefb5ba478f_838x505.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HZZj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb470095e-882d-4ac6-9e2e-5fefb5ba478f_838x505.png 424w, https://substackcdn.com/image/fetch/$s_!HZZj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb470095e-882d-4ac6-9e2e-5fefb5ba478f_838x505.png 848w, https://substackcdn.com/image/fetch/$s_!HZZj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb470095e-882d-4ac6-9e2e-5fefb5ba478f_838x505.png 1272w, https://substackcdn.com/image/fetch/$s_!HZZj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb470095e-882d-4ac6-9e2e-5fefb5ba478f_838x505.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HZZj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb470095e-882d-4ac6-9e2e-5fefb5ba478f_838x505.png" width="838" height="505" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b470095e-882d-4ac6-9e2e-5fefb5ba478f_838x505.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:505,&quot;width&quot;:838,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:87803,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HZZj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb470095e-882d-4ac6-9e2e-5fefb5ba478f_838x505.png 424w, https://substackcdn.com/image/fetch/$s_!HZZj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb470095e-882d-4ac6-9e2e-5fefb5ba478f_838x505.png 848w, https://substackcdn.com/image/fetch/$s_!HZZj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb470095e-882d-4ac6-9e2e-5fefb5ba478f_838x505.png 1272w, https://substackcdn.com/image/fetch/$s_!HZZj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb470095e-882d-4ac6-9e2e-5fefb5ba478f_838x505.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Algumas dessas m&#233;tricas podem n&#227;o estar dispon&#237;veis em ferramentas padr&#245;es que j&#225; acompanham o sistema operacional e podem necessitar de uma monitoria adicional.</p><p>Gosto de pensar nessas m&#233;tricas da seguinte forma:</p><ul><li><p>Utiliza&#231;&#227;o: Geralmente utiliza&#231;&#227;o em 100% &#233; um sinal de gargalo. Acima de 60% j&#225; pode ser um problema em alguns casos. Dependendo do intervalo de monitora&#231;&#227;o, ele pode esconder os picos de alta utiliza&#231;&#227;o;</p></li><li><p>Satura&#231;&#227;o: Qualquer n&#237;vel de satura&#231;&#227;o pode ser um problema. Medir o tamanho da fila de espera ou o tempo aguardando na fila &#233; uma boa tamb&#233;m;</p></li><li><p>Erros: Igual a Satura&#231;&#227;o, qualquer evento de erro &#233; v&#225;lido investigar, ainda mais se a performance est&#225; degradada e os erros continuam aumentando.</p></li></ul><h4>E recursos de sistemas?</h4><p>Alguns recursos de software ou sistemas tamb&#233;m podem ser analisados dessa forma. Isso geralmente se aplica a componentes menores e n&#227;o aplica&#231;&#245;es inteiras, vamos aos exemplos:</p><ul><li><p>Thread pools: A Utiliza&#231;&#227;o pode ser definida pelo tempo que as threads estavam ocupadas (busy) processando algum workload, j&#225; a Satura&#231;&#227;o pode ser definida pela quantidade de requests aguardando serem processadas;</p></li><li><p>Capacidade de thread ou processo: O sistema pode ter uma quantidade limitada de processos ou threads, o qual o uso naquele momento pode ser definida para Utiliza&#231;&#227;o. J&#225; o tempo de espera de aloca&#231;&#227;o de novas threads pode indicar Satura&#231;&#227;o e por fim Erros &#233; quando a aloca&#231;&#227;o falhou, no caso gerando um <code>cannot fork</code>;</p></li><li><p>Capacidade do file descriptor: Similar a capacidade de threads e processos, por&#233;m para file descriptors.</p></li></ul><p>Em casos de microsservi&#231;os rodando no Kubernetes por exemplo, podemos pensar da seguinte forma:</p><ul><li><p>Utiliza&#231;&#227;o: A m&#233;dia de utiliza&#231;&#227;o de CPU se comparado ao total de CPU dispon&#237;vel no cluster;</p></li><li><p>Satura&#231;&#227;o: A diferen&#231;a entre o p99 e a m&#233;dia da lat&#234;ncia;</p></li><li><p>Erros: Erros de requests.</p></li></ul><p>Por&#233;m, h&#225; uma metodologia que foi criada especificamente para servi&#231;os, a RED.</p><h3>RED - Request Rate, Errors, Duration</h3><p>O objetivo da RED &#233; acompanhar m&#233;tricas de servi&#231;os, j&#225; que podemos verificar a sa&#250;de do sistema com a perspectiva do usu&#225;rio.</p><p>As m&#233;tricas s&#227;o:</p><ul><li><p>Request rate: O n&#250;mero de requisi&#231;&#245;es por segundo;</p></li><li><p>Errors: A quantidade de requisi&#231;&#245;es que falharam;</p></li><li><p>Duration: O tempo que levou para completar uma requisi&#231;&#227;o.</p></li></ul><p>As vantagens de utilizar a metodologia RED s&#227;o similares ao USE. &#201; f&#225;cil e r&#225;pido de identificar problemas. Vale ressaltar que ambas metodologias se complementam, voc&#234; pode utilizar a USE para sa&#250;de de recursos do servidor e RED para aplica&#231;&#227;o.</p><p>Medir a taxa de requisi&#231;&#245;es (request rate), d&#225; uma boa ideia de onde come&#231;ar a investigar o problema, se &#233; um problema de performance ou &#233; pela quantidade (de requisi&#231;&#245;es) ou um problema arquitetural (meu <a href="https://blog.padz.dev/i/149414880/diferenciando-carga-de-trabalho-e-problemas-arquiteturais">post anterior</a> fala um pouco disso). Se a taxa de requisi&#231;&#245;es est&#225; est&#225;vel, mas a dura&#231;&#227;o delas est&#225; aumentando possivelmente &#233; um problema de arquitetura. Se ambos aumentam, ent&#227;o o problema pode ser o workload.</p><h4>Investigando o workload</h4><p>Workloads podem ser caracterizados respondendo algumas perguntas:</p><ul><li><p>Quem causou a carga? Foi um processo, usu&#225;rio (aplica&#231;&#227;o) ou um IP remoto?</p></li><li><p>Por que essa carga excessiva? Existe um stack trace para an&#225;lise?</p></li><li><p>Quais s&#227;o as caracter&#237;sticas dessa carga? Aumento de IOPS, throughput?</p></li><li><p>Como a carga muda conforme o tempo? Existe um padr&#227;o? &#201; um padr&#227;o di&#225;rio?</p></li></ul><p>Imagine este cen&#225;rio: voc&#234; est&#225; investigando um problema de desempenho em microsservi&#231;os em um cluster Kubernetes. O tr&#225;fego esperado deveria vir de servi&#231;os internos, mas voc&#234; decide verificar as m&#233;tricas de rede. Para sua surpresa, descobre que um &#250;nico n&#243; est&#225; recebendo uma quantidade anormal de conex&#245;es de outro servi&#231;o, enquanto os demais est&#227;o praticamente ociosos. Ap&#243;s uma investiga&#231;&#227;o mais profunda, percebe que um erro na configura&#231;&#227;o do service discovery est&#225; direcionando todas as requisi&#231;&#245;es para apenas um pod, causando um hotspot e degradando o desempenho da aplica&#231;&#227;o.</p><h3>Five whys</h3><p>Um m&#233;todo adicional que voc&#234; pode utilizar &#233; o Five Whys, onde voc&#234; se pergunta &#8220;Por que?&#8221; por cinco vezes (ou mais) at&#233; encontrar a causa ra&#237;z.</p><ol><li><p>Uma inst&#226;ncia de banco de dados come&#231;ou a degradar performance conforme a quantidade de queries aumentou. Por que?</p></li><li><p>&#201; um problema de IO devido a pagina&#231;&#227;o de mem&#243;ria. Por que?</p></li><li><p>A utiliza&#231;&#227;o de mem&#243;ria aumentou. Por que?</p></li><li><p>O alocador est&#225; consumindo mais mem&#243;ria do que o previsto. Por que?</p></li><li><p>A vers&#227;o do banco de dados tem um bug no alocador de mem&#243;ria.</p></li></ol><p>Esse &#233; um caso real que pode ser resolvido atualizando a vers&#227;o do banco de dados. O problema foi encontrado se questionando e indo a fundo para entender a causa ra&#237;z.</p><h2>Anti-patterns</h2><p>Para fechar o post, vale mencionar dois anti-patterns muito comuns de acontecer. Principalmente se quando existem silos muito bem definidos na estrutura de engenharia da empresa.</p><p>O primeiro deles &#233; quando a pessoa respons&#225;vel por solucionar um problema, vai tentando adivinhar onde est&#225; a causa ra&#237;z e sai mudando v&#225;rias configura&#231;&#245;es, aloca&#231;&#227;o de recursos, atualiza&#231;&#227;o de libs at&#233; o problema desaparecer. Al&#233;m de ser um processo custoso, a pessoa pode ter alterado algo que n&#227;o faz o menor sentido.</p><p>Outro exemplo que &#233; cl&#225;ssico &#233; jogar o problema no colo do colega. Imagine o seguinte cen&#225;rio, a pessoa come&#231;ou a analisar um problema, sem nenhuma an&#225;lise muito profunda, ela acha que o problema pode ser a rede. Por ter um time especializado naquele tema, ela joga o problema para o time. Caso o problema n&#227;o seja aquele, a pessoa volta para a an&#225;lise desde o in&#237;cio e continua jogando o problema para os outros.</p><p>A dica nesse caso para n&#227;o se tornar dono de um problema que n&#227;o &#233; seu, pe&#231;a a pessoa que est&#225; analisando o problema, evid&#234;ncias que comprovem o que ela est&#225; dizendo.</p><h2>Conclus&#245;es</h2><p>Acredito que abordei nesse post a maioria dos temas sobre metodologias que conhe&#231;o e utilizo. Minhas dicas para SREs e SWEs que gostam do tema &#233;, tenham em mente as metodologias como USE e RED. Elas fornecem um caminho estruturado para identificar e solucionar gargalos. Al&#233;m disso, a abordagem investigativa baseada em perguntas e t&#233;cnicas como Five Whys ajudam a enxergar al&#233;m dos sintomas, chegando &#224; verdadeira causa dos problemas.</p><p>No final das contas, resolver problemas de performance &#233; tanto uma quest&#227;o t&#233;cnica quanto um exerc&#237;cio de an&#225;lise cr&#237;tica. N&#227;o tenha medo de perguntar e questionar. Ferramentas e m&#233;tricas s&#227;o essenciais, mas uma abordagem baseada em evid&#234;ncias &#233; o que vai diferenciar um troubleshooting eficaz de um processo meia boca.</p><p>At&#233; a pr&#243;xima!</p>]]></content:encoded></item><item><title><![CDATA[Atualizando Keycloak usando Helm Chart da Bitnami]]></title><description><![CDATA[Um guia r&#225;pido e f&#225;cil de seguir, escrito com base em desafios enfrentados ao atualizar o Keycloak provisionado com Helm Chart da Bitnami.]]></description><link>https://blog.padz.dev/p/atualizando-keycloak-usando-helm</link><guid isPermaLink="false">https://blog.padz.dev/p/atualizando-keycloak-usando-helm</guid><dc:creator><![CDATA[Bruno Padilha]]></dc:creator><pubDate>Mon, 13 Jan 2025 13:30:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!o-PF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o-PF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o-PF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!o-PF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!o-PF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!o-PF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o-PF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg" width="1456" height="968" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:968,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8617529,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!o-PF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!o-PF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!o-PF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!o-PF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6cf31ed-df68-44eb-ace1-2b7b8ac3ab06_6016x4000.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Foto por <a href="https://unsplash.com/@miracleday?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Elena Mozhvilo</a> no <a href="https://unsplash.com/photos/black-and-silver-hand-tool-set-RhXAO8OXyDY?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></figcaption></figure></div><p><em>An english version is coming soon. Stay tuned. &#128515;</em></p><h2>Uma breve introdu&#231;&#227;o</h2><p>Sempre fui contra utilizar os <a href="https://github.com/bitnami/charts">Helm Charts da Bitnami</a> - as imagens dos conteineres s&#227;o super modificadas e no caso do Keycloak especificamente, &#233; uma confus&#227;o enorme com as ENV VARs para configur&#225;-lo (<code>KC_*</code>), as ENV VARs para configurar o conteiner da Bitnami (<code>KEYCLOAK_*</code>) e a documenta&#231;&#227;o n&#227;o &#233; das melhores. Mas n&#227;o posso negar que em alguns momentos esses Charts ajudam a subir algo r&#225;pido, e foi por esse motivo que o time que trabalho decidiu subir dessa forma, ao inv&#233;s de utilizar o <a href="https://www.keycloak.org/operator/installation">Keycloak Operator</a>. </p><p>No fim do ano passado, puxei a iniciativa de atualizar as int&#226;ncias de Keycloak que utilizamos na <a href="https://pier.digital">Pier</a> com outros Staff Engineers para suportar algumas funcionalidades que seriam interessantes implementar em algumas aplica&#231;&#245;es. Foi um trabalho de formiguinha, mas deu certo. Nesse post, irei explicar o processo e dar algumas dicas.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XQzP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XQzP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png 424w, https://substackcdn.com/image/fetch/$s_!XQzP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png 848w, https://substackcdn.com/image/fetch/$s_!XQzP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png 1272w, https://substackcdn.com/image/fetch/$s_!XQzP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XQzP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png" width="641" height="760" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:760,&quot;width&quot;:641,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:55636,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XQzP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png 424w, https://substackcdn.com/image/fetch/$s_!XQzP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png 848w, https://substackcdn.com/image/fetch/$s_!XQzP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png 1272w, https://substackcdn.com/image/fetch/$s_!XQzP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0624f49b-3356-4d44-89a9-e1e640535c00_641x760.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Print do doc no Notion que montei para o processo. Foram 20 tentativas. &#128558;&#8205;&#128168;</figcaption></figure></div><p>Vale ressaltar que nem todos ambientes s&#227;o iguais, no nosso caso, utilizamos <a href="https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/">ALB Ingress Controller</a> no AWS EKS, rodando Kubernetes 1.31.</p><p>Ap&#243;s uma pergunta no grupo Cloud &amp; Infra da comunidade <a href="https://www.linkedin.com/company/platformrocks/posts/?feedView=all">Platform Engineering</a> no Whatsapp, resolvi escrever esse post para ajudar outras pessoas. Espero que possa te ajudar tamb&#233;m!</p><h2>Dicas de ouro</h2><p>A ideia era atualizar para a &#250;ltima vers&#227;o do Keycloak (26.0.7) e meu primeiro erro foi tentar subir da vers&#227;o 22 direto para 26 e subindo a vers&#227;o do Helm Chart da 16 para 24. E as coisas n&#227;o funcionam assim. </p><p>Por isso, <strong>fa&#231;a upgrades sequenciais</strong>, tanto do Keycloak quanto do Helm Chart. Entre as major versions do Keycloak, o banco &#233; atualizado diversas vezes e n&#227;o senti seguran&#231;a na execu&#231;&#227;o das migrations entre a 22 e a 26, principalmente pela alta customiza&#231;&#227;o da imagem feita pela Bitnami. Os Helm Charts tamb&#233;m devem ser atualizados de forma sequencial, por&#233;m, nem sempre atualiza&#231;&#245;es entre major versions funcionam bem. </p><p>Segunda dica, antes de cada upgrade <strong>leia o <a href="https://www.keycloak.org/docs/latest/upgrading/">Upgrading Guide</a></strong> na documenta&#231;&#227;o oficial do Keycloak. A doc n&#227;o &#233; das melhores, mas explica mudan&#231;as significativas como altera&#231;&#227;o do <a href="https://www.keycloak.org/docs/latest/upgrading/#new-hostname-options">hostname_v1 para hostname_v2</a> e na API.</p><p>A terceira dica &#233;, <strong>testar, testar e testar</strong>. Verifique se o login na console de administra&#231;&#227;o est&#225; funcionando e o principal, se sua aplica&#231;&#227;o continua funcionando conforme o esperado.</p><h2>Atualizando</h2><p>Os values utilizados a partir da vers&#227;o 16.0.3 do Chart (Keycloak 22.0.1) est&#227;o nesse <a href="https://gist.github.com/brunopadz/8fa2f5e67a458f5fd880399dc812c4e3">Gist</a>. Eu usarei o mesmo YAML como refer&#234;ncia at&#233; a vers&#227;o 24.2.3 e mencionando apenas as mudan&#231;as, caso voc&#234; n&#227;o queira ir at&#233; a &#250;ltima vers&#227;o do Chart. </p><h4>Upgrades sem mudan&#231;as nos values</h4><ul><li><p>Helm Chart: 16.0.3 &#8594; 17.3.6 / Keycloak: 22.0.5</p></li><li><p>Helm Chart: 17.3.6 &#8594; 18.7.1 / Keycloak: 23.0.7</p></li><li><p>Helm Chart: 18.7.1 &#8594; 19.4.1 / Keycloak: 23.0.7</p><ul><li><p>Voc&#234; pode pular esse upgrade e ir direto para a 19.4.1, caso queira ir para a vers&#227;o 24.0.2 do Keycloak.</p></li></ul></li><li><p>Helm Chart: 19.4.1 &#8594; 21.0.0 / Keycloak: 24.0.2</p></li><li><p>Helm Chart: 21.0.0 &#8594; 21.1.3 / Keycloak: 24.0.4</p></li><li><p>Helm Chart: 21.1.3 &#8594; 21.2.2 / Keycloak: 24.0.4</p><ul><li><p>Voc&#234; pode pular esse upgrade e ir direto para a 21.3.4, caso queira ir para a vers&#227;o 24.0.5 do Keycloak.</p></li></ul></li><li><p>Helm Chart: 21.2.2 &#8594; 21.3.4 / Keycloak: 24.0.5</p></li><li><p>Helm Chart: 21.3.4 &#8594; 21.4.6 / Keycloak: 24.0.5</p></li><li><p>Helm Chart: 21.4.64 &#8594; 21.5.0 / Keycloak: 24.0.5</p></li><li><p>Helm Chart: 21.5.0 &#8594; 21.6.0 / Keycloak: 24.0.5</p></li></ul><h4>Upgrades com mudan&#231;as nos values</h4><p>A partir da vers&#227;o 21.6.0, uma s&#233;rie de releases foram lan&#231;adas tentando corrigir v&#225;rios bugs, regress&#245;es e etc&#8230; um caos completo. </p><p>Voc&#234; tamb&#233;m ir&#225; notar que eu voltei para a 21.5.0. Isso se deve ao fato de puro troubleshooting, tentando quebrar minha cabe&#231;a para entender a bagun&#231;a feita pelos mantenedores e comunidade.</p><ul><li><p>Helm Chart: 21.5.0 &#8594; 22.1.0 / Keycloak: 25.0.2</p><ul><li><p>Mudan&#231;as:</p><ul><li><p><code>proxy: none</code> - Isso se deve ao fato da remo&#231;&#227;o de como o Keycloak trata requests atr&#225;s de um proxy reverso. </p></li><li><p><code>proxyHeaders: forwarded</code> - Devido a mudan&#231;a acima, existe uma nova forma de tratar e configurar os proxy headers atr&#225;s de um ingress ou proxy reverso. Vale a pena ler a <a href="https://www.keycloak.org/server/reverseproxy">documenta&#231;&#227;o oficial</a> sobre o tema.</p></li><li><p><code>ingress.controller: gce</code> - Alguns usu&#225;rios utilizando o <a href="https://github.com/kubernetes/ingress-gce">ingress-gce</a>, setam <code>/*</code> no <code>ingress.path</code>, assim como eu, utilizando o ALB Ingress Controller. Setar <code>gce</code> nesse par&#226;metro vai fazer com que ao utilizar <code>/*</code>, o ingress rule n&#227;o quebre.</p></li><li><p><code>hostnameStrict: false</code> - Ajustando o configura&#231;&#227;o de hostname v2 do Keycloak.</p></li></ul></li></ul></li><li><p>Helm Chart: 22.1.0 &#8594; 24.0.0 / Keycloak: 26.0.0</p><ul><li><p>Sem mudan&#231;as</p></li></ul></li><li><p>Helm Chart: 24.0.0 &#8594; 24.2.3 / Keycloak: 26.0.7</p><ul><li><p>As mudan&#231;as realizadas aqui foram feitas para resolver problemas que tivemos no nosso cen&#225;rio:</p><ul><li><p><code>global.security.allowInsecureImages: true</code> - Utilizamos uma imagem customizada do Keycloak onde inserimos temas e mais alguns componentes desenvolvidos internamente. Mais infos <a href="https://github.com/bitnami/charts/issues/30850">aqui</a>.</p></li><li><p><code>proxyHeaders: xforwarded</code> - Ap&#243;s iniciarmos os testes, alguns fluxos de autentica&#231;&#227;o retornavam erros relacionados aos cookies. Setar <code>xforwarded</code> resolveu o problema.</p></li></ul></li></ul></li></ul><p>O resultado final dessa saga, voc&#234; pode conferir nesse <a href="https://gist.github.com/brunopadz/99199015d5e63b4674402d40f16a6a98">Gist</a>.</p><h2>Notas finais</h2><p>Eu levei um dia e meio para ler e entender todas as mudan&#231;as feitas no Helm Chart entre as vers&#245;es 16.0.3 e a 24.2.3. Recomendo n&#227;o s&#243; para o Keycloak, mas para qualquer Chart da Bitnami fazer o mesmo. Anotar e documentar o processo &#233; importante para n&#227;o perder o fio da meada.</p><p>Se atentar as mudan&#231;as na API do Keycloak no <a href="https://www.keycloak.org/docs/latest/upgrading/">Upgrading Guide</a> &#233; super importante tamb&#233;m. No nosso caso tivemos que fazer alguns ajustes nas aplica&#231;&#245;es, ent&#227;o tenha tudo mapeado.</p><p>Espero que esse post possa ajudar a comunidade de alguma forma.</p><p>At&#233; mais!</p>]]></content:encoded></item><item><title><![CDATA[Systems Performance - Conceitos]]></title><description><![CDATA[Descubra as principais m&#233;tricas utilizadas na an&#225;lise de performance e como interpret&#225;-las corretamente]]></description><link>https://blog.padz.dev/p/systems-performance-conceitos</link><guid isPermaLink="false">https://blog.padz.dev/p/systems-performance-conceitos</guid><dc:creator><![CDATA[Bruno Padilha]]></dc:creator><pubDate>Thu, 17 Oct 2024 12:30:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!w8rm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4753412-7340-4265-9e84-9cc040f37fb2_4000x2500.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w8rm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4753412-7340-4265-9e84-9cc040f37fb2_4000x2500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w8rm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4753412-7340-4265-9e84-9cc040f37fb2_4000x2500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!w8rm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4753412-7340-4265-9e84-9cc040f37fb2_4000x2500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!w8rm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4753412-7340-4265-9e84-9cc040f37fb2_4000x2500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!w8rm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4753412-7340-4265-9e84-9cc040f37fb2_4000x2500.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!w8rm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4753412-7340-4265-9e84-9cc040f37fb2_4000x2500.jpeg" width="1456" height="910" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4753412-7340-4265-9e84-9cc040f37fb2_4000x2500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:910,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3259274,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!w8rm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4753412-7340-4265-9e84-9cc040f37fb2_4000x2500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!w8rm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4753412-7340-4265-9e84-9cc040f37fb2_4000x2500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!w8rm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4753412-7340-4265-9e84-9cc040f37fb2_4000x2500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!w8rm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4753412-7340-4265-9e84-9cc040f37fb2_4000x2500.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Imagem criada por <a href="https://unsplash.com/@maxberg?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Maxim Berg</a> no <a href="https://unsplash.com/photos/a-field-of-colorful-trees-in-the-middle-of-a-forest-24j8h-9ME8o?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></figcaption></figure></div><p>Com anos de experi&#234;ncia na &#225;rea, presenciei a evolu&#231;&#227;o da infraestrutura de TI: da transi&#231;&#227;o de servidores f&#237;sicos para virtuais &#224; administra&#231;&#227;o de storages em redes de fibra &#243;ptica, da implanta&#231;&#227;o de servidores blade &#224; migra&#231;&#227;o para a nuvem em meados de 2017. Uma constante em todas essas mudan&#231;as? A import&#226;ncia do desempenho e performance dos sistemas.</p><p>Cada desafio de performance exigia um mergulho profundo nos "bits and bytes" da tecnologia em quest&#227;o, o que me permitiu acumular uma vasta gama de conceitos e metodologias ao longo do tempo.</p><p>Este (longo) post visa compartilhar esse conhecimento, abordando m&#233;tricas de desempenho, trade-offs ao otimizar e quando parar de analisar e realizar otimiza&#231;&#245;es. Com base nisso tudo, iremos nos aprofundar posteriormente em aplicar metodologias em cima disso tudo.</p><h2>Antes de come&#231;armos</h2><p>Antes de prosseguirmos, &#233; importante esclarecer alguns termos-chave que ser&#227;o utilizados ao longo deste post.</p><ul><li><p><strong>Cache:</strong> Uma &#225;rea de armazenamento r&#225;pido que evita comunica&#231;&#227;o direta com uma camada de armazenamento mais lenta. Geralmente esse armazenamento &#233; feito em mem&#243;ria RAM, o que melhora o desempenho das opera&#231;&#245;es.</p></li><li><p><strong>Gargalo:</strong> &#201; um recurso que limita a performance do sistema. Identificar e eliminar gargalos &#233; uma atividade super importante na melhoria de desempenho de um sistema.</p></li><li><p><strong>IOPS:</strong> Opera&#231;&#245;es de entrada e sa&#237;da (I/O) por segundo &#233; uma medida da taxa de opera&#231;&#245;es de transfer&#234;ncia de dados. Para opera&#231;&#245;es de I/O em disco, IOPS se refere ao n&#250;mero de leituras e grava&#231;&#245;es por segundo.</p></li><li><p><strong>Lat&#234;ncia:</strong> Expliquei no post anterior, mas &#233; a medida do tempo que uma opera&#231;&#227;o passa aguardando para ser processada.</p></li><li><p><strong>Satura&#231;&#227;o:</strong> O grau em que um recurso tem trabalho acumulado em fila que n&#227;o consegue processar de imediato.</p></li><li><p><strong>Tempo de resposta:</strong> O tempo necess&#225;rio para uma opera&#231;&#227;o ser conclu&#237;da, incluindo o tempo de espera e o tempo gasto para processar a opera&#231;&#227;o, assim como o tempo de transfer&#234;ncia do resultado de toda opera&#231;&#227;o.</p></li><li><p><strong>Throughput:</strong> A quantidade de trabalho realizado em um determinado per&#237;odo. Em comunica&#231;&#245;es, o termo &#233; frequentemente usado para se referir &#224; taxa de dados (bytes por segundo ou bits por segundo). Em outros contextos, como em bancos de dados, throughput pode se referir &#224; taxa de opera&#231;&#245;es (opera&#231;&#245;es por segundo ou transa&#231;&#245;es por segundo).</p></li><li><p><strong>Workload:</strong> Refere-se &#224; entrada ou carga aplicada ao sistema. Em um banco de dados, a carga de trabalho consiste nas consultas e comandos enviados pelos clientes.</p></li></ul><h2>Conceitos</h2><h3>Lat&#234;ncia</h3><p>Em alguns ambientes, a lat&#234;ncia &#233; o principal ponto de desempenho, enquanto em outros ela est&#225; entre as m&#233;tricas mais importantes, junto com throughtput. A lat&#234;ncia se refere ao tempo de espera antes que uma opera&#231;&#227;o seja realizada, como o estabelecimento de uma conex&#227;o de rede antes de transferir dados em uma requisi&#231;&#227;o HTTP. Esse tempo de resposta inclui tanto a lat&#234;ncia quanto o tempo necess&#225;rio para completar toda a opera&#231;&#227;o.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!edxc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1dca5d2-fa92-422e-aa71-b62253cf80e8_808x161.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!edxc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1dca5d2-fa92-422e-aa71-b62253cf80e8_808x161.png 424w, https://substackcdn.com/image/fetch/$s_!edxc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1dca5d2-fa92-422e-aa71-b62253cf80e8_808x161.png 848w, https://substackcdn.com/image/fetch/$s_!edxc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1dca5d2-fa92-422e-aa71-b62253cf80e8_808x161.png 1272w, https://substackcdn.com/image/fetch/$s_!edxc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1dca5d2-fa92-422e-aa71-b62253cf80e8_808x161.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!edxc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1dca5d2-fa92-422e-aa71-b62253cf80e8_808x161.png" width="808" height="161" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1dca5d2-fa92-422e-aa71-b62253cf80e8_808x161.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:161,&quot;width&quot;:808,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:23416,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!edxc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1dca5d2-fa92-422e-aa71-b62253cf80e8_808x161.png 424w, https://substackcdn.com/image/fetch/$s_!edxc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1dca5d2-fa92-422e-aa71-b62253cf80e8_808x161.png 848w, https://substackcdn.com/image/fetch/$s_!edxc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1dca5d2-fa92-422e-aa71-b62253cf80e8_808x161.png 1272w, https://substackcdn.com/image/fetch/$s_!edxc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1dca5d2-fa92-422e-aa71-b62253cf80e8_808x161.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>A lat&#234;ncia pode ser medida a partir de diferentes pontos, sendo frequentemente especificada pelo alvo da medi&#231;&#227;o. Por exemplo, o tempo de carregamento de um site pode incluir a lat&#234;ncia do DNS, da conex&#227;o TCP e o tempo de transfer&#234;ncia dos dados. Em n&#237;veis mais amplos, todos esses componentes podem ser considerados parte da lat&#234;ncia geral percebida pelo usu&#225;rio, como o tempo desde o clique em um link at&#233; a p&#225;gina estar totalmente carregada.</p><p>Como a lat&#234;ncia &#233; uma m&#233;trica baseada no tempo, ela permite diversos c&#225;lculos e compara&#231;&#245;es diretas, facilitando a identifica&#231;&#227;o e prioriza&#231;&#227;o de problemas de desempenho. Por exemplo, &#233; mais simples comparar 200 ms de I/O de rede com 100 ms de I/O de disco do que comparar m&#233;tricas diferentes como IOPS. Converter outras m&#233;tricas para tempo ou lat&#234;ncia sempre que poss&#237;vel torna a an&#225;lise muito mais objetiva, permitindo assim prever aumentos de velocidade ao reduzir ou eliminar a lat&#234;ncia.</p><p>Para refer&#234;ncia, as abrevia&#231;&#245;es de unidade de tempo est&#227;o listadas abaixo:</p><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/asp4v/1/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4401461b-eb26-4053-954b-d945e34d12a6_1260x660.png&quot;,&quot;thumbnail_url_full&quot;:&quot;&quot;,&quot;height&quot;:300,&quot;title&quot;:&quot;| Created with Datawrapper&quot;,&quot;description&quot;:&quot;Create interactive, responsive &amp; beautiful charts &#8212; no code required.&quot;}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/asp4v/1/" width="730" height="300" frameborder="0" scrolling="no"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><h3>Trade-offs</h3><p>Ao otimizar o desempenho, &#233; crucial considerar os trade-offs mais comuns. O ditado popular "bom, bonito e barato" ilustra bem esse conceito. No nosso caso, iremos usar &#8220;bom, r&#225;pido e barato&#8221; e geralmente voc&#234; s&#243; pode escolher dois desses atributos ao considerar os trade-offs ao otimizar um sistema.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4rGq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2f0fb7f-df4f-4a93-abe8-f246eff2e3c5_406x315.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4rGq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2f0fb7f-df4f-4a93-abe8-f246eff2e3c5_406x315.png 424w, https://substackcdn.com/image/fetch/$s_!4rGq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2f0fb7f-df4f-4a93-abe8-f246eff2e3c5_406x315.png 848w, https://substackcdn.com/image/fetch/$s_!4rGq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2f0fb7f-df4f-4a93-abe8-f246eff2e3c5_406x315.png 1272w, https://substackcdn.com/image/fetch/$s_!4rGq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2f0fb7f-df4f-4a93-abe8-f246eff2e3c5_406x315.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4rGq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2f0fb7f-df4f-4a93-abe8-f246eff2e3c5_406x315.png" width="406" height="315" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f2f0fb7f-df4f-4a93-abe8-f246eff2e3c5_406x315.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:315,&quot;width&quot;:406,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:54065,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4rGq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2f0fb7f-df4f-4a93-abe8-f246eff2e3c5_406x315.png 424w, https://substackcdn.com/image/fetch/$s_!4rGq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2f0fb7f-df4f-4a93-abe8-f246eff2e3c5_406x315.png 848w, https://substackcdn.com/image/fetch/$s_!4rGq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2f0fb7f-df4f-4a93-abe8-f246eff2e3c5_406x315.png 1272w, https://substackcdn.com/image/fetch/$s_!4rGq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2f0fb7f-df4f-4a93-abe8-f246eff2e3c5_406x315.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Muitos projetos e times priorizam prazos e custos mais baixos, deixando o desempenho para depois. Essa abordagem pode se tornar problem&#225;tica quando decis&#245;es iniciais comprometem futuras melhorias de desempenho. Exemplos incluem a escolha de uma arquitetura de armazenamento, o uso de uma linguagem de programa&#231;&#227;o ou sistema operacional ineficientes, ou a escolha de componentes sem ferramentas robustas de an&#225;lise de desempenho.</p><p>Na otimiza&#231;&#227;o de desempenho, um trade-off comum ocorre entre CPU e mem&#243;ria. Tradicionalmente, a mem&#243;ria &#233; usada para cache, reduzindo o uso da CPU. Por&#233;m, com a abund&#226;ncia de CPU dispon&#237;vel hoje em dia, essa rela&#231;&#227;o pode se inverter, o tempo livre de CPU pode ser dedicado &#224; compress&#227;o de dados por exemplo, diminuindo assim o uso de mem&#243;ria.</p><h3>Otimiza&#231;&#245;es</h3><p>A otimiza&#231;&#227;o de desempenho &#233; mais eficaz quando realizada o mais pr&#243;ximo poss&#237;vel do local onde o workload da aplica&#231;&#227;o &#233; executado. A tabela abaixo ilustra uma aplica&#231;&#227;o com diversas possibilidades de ajustes.</p><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/fn3XX/1/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93af5fb5-faac-488c-91d9-54e8af9d9b9e_1260x660.png&quot;,&quot;thumbnail_url_full&quot;:&quot;&quot;,&quot;height&quot;:311,&quot;title&quot;:&quot;| Created with Datawrapper&quot;,&quot;description&quot;:&quot;Create interactive, responsive &amp; beautiful charts &#8212; no code required.&quot;}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/fn3XX/1/" width="730" height="311" frameborder="0" scrolling="no"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><p>Ao otimizar no n&#237;vel da aplica&#231;&#227;o, &#233; poss&#237;vel eliminar ou reduzir consultas ao banco de dados, resultando em melhorias de desempenho significativas. Se ao inv&#233;s de olharmos para as queries e otimizarmos o acesso ao disco, obviamente iremos melhorar as opera&#231;&#245;es de I/O, por&#233;m, um custo j&#225; foi incorrido na execu&#231;&#227;o de todo c&#243;digo, o que pode resultar em ganhos marginais.</p><p>Embora otimizar no n&#237;vel da aplica&#231;&#227;o seja o mais eficaz nesse caso, ele nem sempre &#233; o mais adequado em termos de observabilidade. Consultas lentas podem ser melhor entendidas ao analisar o tempo gasto na CPU ou as opera&#231;&#245;es de I/O no sistema de arquivos e disco. Essas m&#233;tricas s&#227;o facilmente observ&#225;veis por meio de ferramentas do sistema operacional.</p><p>Grandes melhorias de desempenho, incluindo corre&#231;&#245;es de regress&#245;es, s&#227;o frequentemente identificadas &#224; medida que o c&#243;digo da aplica&#231;&#227;o evolui. Nesses contextos, a otimiza&#231;&#227;o e a observabilidade a partir do sistema operacional podem ser negligenciadas. No entanto, &#233; importante lembrar que a an&#225;lise de desempenho do sistema operacional pode tamb&#233;m identificar problemas no n&#237;vel da aplica&#231;&#227;o, frequentemente de maneira mais eficiente do que a observa&#231;&#227;o apenas a partir da aplica&#231;&#227;o.</p><h3>Diferenciando carga de trabalho e problemas arquiteturais</h3><p>Uma aplica&#231;&#227;o pode apresentar um desempenho ruim devido a m&#225; configura&#231;&#227;o do software (Framework, Sistema Operacional) quanto no hardware, assim como na sua arquitetura e implementa&#231;&#227;o. No entanto, uma aplica&#231;&#227;o tamb&#233;m pode ter um desempenho ruim simplesmente por estar submetida a uma carga de trabalho excessiva, resultando em filas de espera e altas lat&#234;ncias.</p><p>Se a an&#225;lise da arquitetura mostrar muito enfileiramento, mas n&#227;o identificar problemas na execu&#231;&#227;o dessas tarefas enfileiradas, o problema pode ser a carga excessiva aplicada, este &#233; o momento de adicionar mais inst&#226;ncias/servidores/VMs para lidar com o aumento dessa carga.</p><p>J&#225; um problema de arquitetura pode ser uma aplica&#231;&#227;o single-thread e est&#225; constantemente utilizando a CPU, com requisi&#231;&#245;es enfileirando enquanto outras CPUs est&#227;o ociosas. Nesse caso, o desempenho &#233; limitado pela arquitetura single-thread da aplica&#231;&#227;o. Outro exemplo de problema de arquitetura pode ser uma aplica&#231;&#227;o multi-thread que disputa um &#250;nico bloqueio, de forma que apenas uma thread consegue avan&#231;ar enquanto as outras aguardam.</p><p>Por outro lado, um problema de carga de trabalho pode ser uma aplica&#231;&#227;o multi-thread que est&#225; utilizando todas as CPUs dispon&#237;veis. Nesse caso, o desempenho &#233; limitado pela capacidade de CPU dispon&#237;vel, ou seja, h&#225; mais carga de trabalho do que as CPUs conseguem processar.</p><h3>Escalabilidade</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RgY7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db4e63-7d94-4e4e-ba13-b21f034fb62e_598x306.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RgY7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db4e63-7d94-4e4e-ba13-b21f034fb62e_598x306.png 424w, https://substackcdn.com/image/fetch/$s_!RgY7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db4e63-7d94-4e4e-ba13-b21f034fb62e_598x306.png 848w, https://substackcdn.com/image/fetch/$s_!RgY7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db4e63-7d94-4e4e-ba13-b21f034fb62e_598x306.png 1272w, https://substackcdn.com/image/fetch/$s_!RgY7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db4e63-7d94-4e4e-ba13-b21f034fb62e_598x306.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RgY7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db4e63-7d94-4e4e-ba13-b21f034fb62e_598x306.png" width="598" height="306" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1db4e63-7d94-4e4e-ba13-b21f034fb62e_598x306.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:306,&quot;width&quot;:598,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:16349,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RgY7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db4e63-7d94-4e4e-ba13-b21f034fb62e_598x306.png 424w, https://substackcdn.com/image/fetch/$s_!RgY7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db4e63-7d94-4e4e-ba13-b21f034fb62e_598x306.png 848w, https://substackcdn.com/image/fetch/$s_!RgY7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db4e63-7d94-4e4e-ba13-b21f034fb62e_598x306.png 1272w, https://substackcdn.com/image/fetch/$s_!RgY7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db4e63-7d94-4e4e-ba13-b21f034fb62e_598x306.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A imagem acima apresenta um perfil t&#237;pico de throughput conforme a carga de trabalho do sistema cresce. Inicialmente, se observa uma escalabilidade linear, onde o throughput aumenta proporcionalmente &#224; carga. No entanto, chega um ponto (marcado pela uma linha pontilhada), onde a conten&#231;&#227;o por um recurso come&#231;a a degradar o throughput. Esse ponto &#233; chamado de knee point, representando a transi&#231;&#227;o entre duas fun&#231;&#245;es. Al&#233;m desse ponto, o throughput deixa de escalar linearmente devido ao aumento da conten&#231;&#227;o pelo recurso, e eventualmente, os custos adicionais de conten&#231;&#227;o e coer&#234;ncia fazem com que menos requisi&#231;&#245;es sejam atendidas, resultando assim em uma diminui&#231;&#227;o do throughput. Esse ponto de satura&#231;&#227;o pode ocorrer quando um componente atinge 100% de utiliza&#231;&#227;o ou quando a utiliza&#231;&#227;o se aproxima de 100%, e as filas de espera come&#231;am a se tornar frequentes e significativas.</p><p>A degrada&#231;&#227;o do desempenho em uma escalabilidade n&#227;o linear, em termos de tempo de resposta m&#233;dio ou lat&#234;ncia, &#233; representada na imagem abaixo.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Twck!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd03274-4b5e-42cc-863f-88c43ff72ac4_608x305.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Twck!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd03274-4b5e-42cc-863f-88c43ff72ac4_608x305.png 424w, https://substackcdn.com/image/fetch/$s_!Twck!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd03274-4b5e-42cc-863f-88c43ff72ac4_608x305.png 848w, https://substackcdn.com/image/fetch/$s_!Twck!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd03274-4b5e-42cc-863f-88c43ff72ac4_608x305.png 1272w, https://substackcdn.com/image/fetch/$s_!Twck!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd03274-4b5e-42cc-863f-88c43ff72ac4_608x305.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Twck!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd03274-4b5e-42cc-863f-88c43ff72ac4_608x305.png" width="608" height="305" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1dd03274-4b5e-42cc-863f-88c43ff72ac4_608x305.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:305,&quot;width&quot;:608,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:22264,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Twck!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd03274-4b5e-42cc-863f-88c43ff72ac4_608x305.png 424w, https://substackcdn.com/image/fetch/$s_!Twck!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd03274-4b5e-42cc-863f-88c43ff72ac4_608x305.png 848w, https://substackcdn.com/image/fetch/$s_!Twck!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd03274-4b5e-42cc-863f-88c43ff72ac4_608x305.png 1272w, https://substackcdn.com/image/fetch/$s_!Twck!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd03274-4b5e-42cc-863f-88c43ff72ac4_608x305.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Obviamente, tempos de resposta mais altos s&#227;o indesej&#225;veis. O perfil de degrada&#231;&#227;o "r&#225;pida" pode ocorrer com ao utilizar muita mem&#243;ria, quando o sistema come&#231;a a mover p&#225;ginas de mem&#243;ria para o disco para liberar a mem&#243;ria principal, ou seja, o sistema come&#231;a a &#8220;swapar&#8221;. J&#225; o perfil de degrada&#231;&#227;o "lenta" pode ocorrer ao utilizar mais CPU. Outro exemplo de degrada&#231;&#227;o "r&#225;pida" &#233; utiliza&#231;&#227;o de I/O do disco. &#192; medida que a carga (e a consequente utiliza&#231;&#227;o do disco) aumenta, opera&#231;&#245;es de I/O come&#231;ar&#227;o a ser enfileiradas. A escalabilidade linear do tempo de resposta pode ocorrer se a aplica&#231;&#227;o come&#231;ar a retornar erros quando os recursos n&#227;o estiverem dispon&#237;veis ao inv&#233;s de enfileirar mais opera&#231;&#245;es.</p><h3>M&#233;tricas</h3><p>M&#233;tricas de desempenho (ou performance), s&#227;o estat&#237;sticas geradas pelo sistema, aplica&#231;&#245;es ou ferramentas adicionais que medem suas atividades. Elas s&#227;o observadas para an&#225;lise e monitoramento de desempenho, atrav&#233;s da linha de comando (CLI) ou de modo gr&#225;fico (GUI).</p><p>Alguns tipos de m&#233;tricas de desempenho de sistemas:</p><ul><li><p><strong>Throughput (Taxa de Transfer&#234;ncia):</strong> Pode ser medido em opera&#231;&#245;es ou volume de dados por segundo;</p></li><li><p><strong>IOPS (Opera&#231;&#245;es de I/O por Segundo):</strong> Mede apenas opera&#231;&#245;es de input/ouput (leituras e escritas);</p></li><li><p><strong>Utiliza&#231;&#227;o:</strong> Indica o qu&#227;o ocupado est&#225; um recurso, geralmente expresso em porcentagem;</p></li><li><p><strong>Lat&#234;ncia:</strong> Tempo de opera&#231;&#227;o, apresentado como m&#233;dia ou percentil.</p></li></ul><p>O throughput depende do contexto, por exemplo, o throughput de um banco de dados geralmente mede a quantidade de queries ou requisi&#231;&#245;es por segundo, enquanto o throughput de rede mede o volume de bits ou bytes por segundo.</p><p>As m&#233;tricas de desempenho n&#227;o s&#227;o &#8220;gratuitas&#8221;, em algum momento, ciclos de CPU devem ser gastos para colet&#225;-las. Isso gera sobrecarga, que pode afetar o desempenho do que est&#225; sendo medido ou monitorado.</p><h3>Utiliza&#231;&#227;o</h3><p>O termo utiliza&#231;&#227;o &#233; frequentemente utilizado em sistemas operacionais para descrever o uso de dispositivos, como CPU e discos. A utiliza&#231;&#227;o pode ser baseada no tempo ou na capacidade.</p><p><strong>Utiliza&#231;&#227;o Baseada no Tempo</strong></p><p>A utiliza&#231;&#227;o baseada no tempo &#233; definida na teoria das filas, onde a m&#233;dia do tempo que o servidor ou recurso esteve ocupado, junto com a raz&#227;o <em>U = B/T</em>.</p><p>Onde <strong>U</strong> &#233; a utiliza&#231;&#227;o e <strong>B</strong> &#233; o tempo total que o sistema esteve ocupado durante <strong>T</strong>, o per&#237;odo de observa&#231;&#227;o.</p><p>Esta &#233; tamb&#233;m a defini&#231;&#227;o de utiliza&#231;&#227;o mais comum dispon&#237;vel nas ferramentas de monitora&#231;&#227;o dispon&#237;veis em sistemas operacionais, como por exemplo, o <code>iostat</code> que denomina essa m&#233;trica como <strong>%b</strong> (percent busy).</p><p>Esta m&#233;trica de utiliza&#231;&#227;o indica qu&#227;o ocupado est&#225; um componente. Quando um componente se aproxima de 100% de utiliza&#231;&#227;o, o desempenho pode degradar seriamente devido &#224; conten&#231;&#227;o pelo recurso. Nessa caso, outras m&#233;tricas podem ser verificadas para confirmar se o componente se tornou um gargalo no sistema.</p><p>Alguns componentes podem atender m&#250;ltiplas opera&#231;&#245;es em paralelo. Para esses, o desempenho pode n&#227;o degradar mesmo com 100% de utiliza&#231;&#227;o, pois eles podem aceitar mais carga de trabalho. Um exemplo para ilustrar melhor seria um &#244;nibus que est&#225; em constante opera&#231;&#227;o, seguindo sua rota sem interrup&#231;&#245;es. O &#244;nibus est&#225; sendo utilizado a 100% em termos de movimento, pois est&#225; sempre em servi&#231;o. No entanto, mesmo estando continuamente em opera&#231;&#227;o, ele pode aceitar mais passageiros a cada parada. Isso significa que, apesar de estar a 100% de utiliza&#231;&#227;o em termos de atividade, ainda h&#225; capacidade adicional para transportar mais pessoas.</p><p>Um disco que est&#225; 100% ocupado tamb&#233;m pode aceitar e processar mais cargas de trabalho, por exemplo, armazenando grava&#231;&#245;es no cache do disco para serem conclu&#237;das posteriormente. Um outro exemplo, arrays de disco frequentemente operam a 100% de utiliza&#231;&#227;o porque provavelmente algum disco est&#225; ocupado o tempo todo, mas o array possui discos ociosos suficientes para aceitar mais trabalho.</p><p><strong>Utiliza&#231;&#227;o Baseada na Capacidade</strong></p><p>Essa defini&#231;&#227;o de utiliza&#231;&#227;o &#233; usada no contexto de planejamento de capacidade, onde um sistema ou componente &#233; capaz de entregar uma certa quantidade de taxa de transfer&#234;ncia. Em qualquer n&#237;vel de desempenho, o sistema ou componente est&#225; operando em alguma propor&#231;&#227;o de sua capacidade. Essa propor&#231;&#227;o &#233; chamada de utiliza&#231;&#227;o.</p><p>Esta defini&#231;&#227;o de utiliza&#231;&#227;o &#233; em termos de capacidade, ao inv&#233;s de se basear no tempo, isso implica que um disco com 100% de utiliza&#231;&#227;o n&#227;o pode aceitar mais trabalho. Com a defini&#231;&#227;o baseada no tempo, 100% de utiliza&#231;&#227;o apenas significa que ele est&#225; ocupado 100% do tempo, mas n&#227;o necessariamente que est&#225; operando em sua capacidade m&#225;xima.</p><p>Para o exemplo anterior do &#244;nibus, 100% de capacidade pode significar que o &#244;nibus est&#225; cheio e n&#227;o pode aceitar mais passageiros.</p><h3>Satura&#231;&#227;o</h3><p>A satura&#231;&#227;o se refere ao grau em que mais carga de trabalho &#233; solicitado a um recurso do que ele pode processar. A satura&#231;&#227;o come&#231;a a ocorrer quando a utiliza&#231;&#227;o atinge 100% (baseada na capacidade), pois a carga de trabalho extra n&#227;o pode ser processada imediatamente e come&#231;a enfileirar.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sd_s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f32f174-03d6-446e-a604-ccd71da86a5d_464x319.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sd_s!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f32f174-03d6-446e-a604-ccd71da86a5d_464x319.png 424w, https://substackcdn.com/image/fetch/$s_!sd_s!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f32f174-03d6-446e-a604-ccd71da86a5d_464x319.png 848w, https://substackcdn.com/image/fetch/$s_!sd_s!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f32f174-03d6-446e-a604-ccd71da86a5d_464x319.png 1272w, https://substackcdn.com/image/fetch/$s_!sd_s!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f32f174-03d6-446e-a604-ccd71da86a5d_464x319.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sd_s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f32f174-03d6-446e-a604-ccd71da86a5d_464x319.png" width="464" height="319" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f32f174-03d6-446e-a604-ccd71da86a5d_464x319.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:319,&quot;width&quot;:464,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:24173,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sd_s!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f32f174-03d6-446e-a604-ccd71da86a5d_464x319.png 424w, https://substackcdn.com/image/fetch/$s_!sd_s!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f32f174-03d6-446e-a604-ccd71da86a5d_464x319.png 848w, https://substackcdn.com/image/fetch/$s_!sd_s!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f32f174-03d6-446e-a604-ccd71da86a5d_464x319.png 1272w, https://substackcdn.com/image/fetch/$s_!sd_s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f32f174-03d6-446e-a604-ccd71da86a5d_464x319.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A figura acima mostra que a satura&#231;&#227;o aumenta de forma linear al&#233;m da marca de 100% de utiliza&#231;&#227;o baseada na capacidade &#224; medida que a carga continua a crescer. Qualquer grau de satura&#231;&#227;o representa um problema de performance, j&#225; que o tempo &#233; gasto aguardando, ou seja, aumentando a lat&#234;ncia.</p><p>Para a utiliza&#231;&#227;o baseada no tempo (percentual de ocupa&#231;&#227;o), a forma&#231;&#227;o de filas e, consequentemente, a satura&#231;&#227;o podem n&#227;o iniciar exatamente na marca de 100% de utiliza&#231;&#227;o. Isso vai depender do quanto o recurso pode processar tarefas em paralelo.</p><p>Imagine um servidor de banco de dados configurado para processar at&#233; 200 queries por segundo (100% de capacidade). Se a demanda aumentar para 250 queries por segundo, as 50 queries adicionais n&#227;o poder&#227;o ser processadas imediatamente e come&#231;ar&#227;o a se acumular em uma fila, resultando em satura&#231;&#227;o. Isso causa aumento na lat&#234;ncia, pois as consultas adicionais precisam esperar para serem processadas.</p><p>Por outro lado, considere um servidor que pode processar m&#250;ltiplas requests em paralelo devido a m&#250;ltiplos n&#250;cleos de CPU. Mesmo quando a utiliza&#231;&#227;o baseada no tempo atinge 100%, ele pode continuar a aceitar novas requests sem um aumento significativo na lat&#234;ncia, desde que consiga gerenciar eficientemente o processamento de forma paralela.</p><h3>Profiling</h3><p>O profiling &#233; o processo de coleta e an&#225;lise de dados sobre o comportamento de um sistema ou aplica&#231;&#227;o para construir um modelo detalhado de desempenho. permitindo identificar gargalos com intuito de otimizar a performance. Ele &#233; normalmente realizado por meio de amostragem peri&#243;dica do estado do sistema em intervalos de tempo definidos. Isso envolve a captura de informa&#231;&#245;es como registros de utiliza&#231;&#227;o de CPU, mem&#243;ria ou atividades de I/O, que, quando agregadas, fornecem insights sobre o funcionamento do sistema ao longo do tempo.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pfF4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F077ffa5f-07e7-40d5-8edd-6aeda2bb2f70_1343x669.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pfF4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F077ffa5f-07e7-40d5-8edd-6aeda2bb2f70_1343x669.png 424w, https://substackcdn.com/image/fetch/$s_!pfF4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F077ffa5f-07e7-40d5-8edd-6aeda2bb2f70_1343x669.png 848w, https://substackcdn.com/image/fetch/$s_!pfF4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F077ffa5f-07e7-40d5-8edd-6aeda2bb2f70_1343x669.png 1272w, https://substackcdn.com/image/fetch/$s_!pfF4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F077ffa5f-07e7-40d5-8edd-6aeda2bb2f70_1343x669.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pfF4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F077ffa5f-07e7-40d5-8edd-6aeda2bb2f70_1343x669.png" width="1343" height="669" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/077ffa5f-07e7-40d5-8edd-6aeda2bb2f70_1343x669.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:669,&quot;width&quot;:1343,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pfF4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F077ffa5f-07e7-40d5-8edd-6aeda2bb2f70_1343x669.png 424w, https://substackcdn.com/image/fetch/$s_!pfF4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F077ffa5f-07e7-40d5-8edd-6aeda2bb2f70_1343x669.png 848w, https://substackcdn.com/image/fetch/$s_!pfF4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F077ffa5f-07e7-40d5-8edd-6aeda2bb2f70_1343x669.png 1272w, https://substackcdn.com/image/fetch/$s_!pfF4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F077ffa5f-07e7-40d5-8edd-6aeda2bb2f70_1343x669.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Diferentemente de m&#233;tricas como IOPS e throughput, que fornecem medidas quantitativas espec&#237;ficas, o uso de amostragem no profiling oferece uma vis&#227;o mais abrangente das atividades e intera&#231;&#245;es dentro do sistema. A granularidade e o detalhamento das informa&#231;&#245;es obtidas dependem diretamente da taxa de amostragem: taxas mais altas permitem uma resolu&#231;&#227;o temporal mais fina e detalhes mais precisos, enquanto taxas mais baixas reduzem a sobrecarga no sistema, mas podem perder eventos transit&#243;rios importantes.</p><p>Por exemplo, para compreender detalhadamente o uso da CPU, pode-se realizar uma amostra do ponteiro de instru&#231;&#227;o (instruction pointer) ou capturar stack traces em intervalos de tempo frequentes. Ao registrar onde a CPU est&#225; executando essas instru&#231;&#245;es, &#233; poss&#237;vel entender quais fun&#231;&#245;es ou trechos de c&#243;digo consomem mais recursos computacionais.</p><h3>Caching</h3><p>Cache &#233; frequentemente utilizado para melhorar o desempenho. Um cache armazena resultados de uma camada de armazenamento mais lenta em uma camada mais r&#225;pida, para ser utilizado posteriormente. Um bom exemplo disso &#233; o armazenamento em cache de blocos de disco na mem&#243;ria RAM.</p><p>Uma m&#233;trica para entender o desempenho do cache &#233; a taxa de acertos (hit rate) de cada cache. O n&#250;mero de vezes que os dados necess&#225;rios foram encontrados no cache (hits) versus o total de acessos (hits + misses):</p><p>Taxa&nbsp;de&nbsp;Hits = hits / (hits + misses)</p><p>Quanto maior, melhor, pois uma taxa mais alta reflete mais dados acessados com sucesso a partir de m&#237;dias mais r&#225;pidas. A imagem abaixo ilustra a melhoria de desempenho esperada para o aumento da taxa de hits do cache.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nQDN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2579653f-d1a0-4576-8be3-40b3f0707e11_432x320.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nQDN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2579653f-d1a0-4576-8be3-40b3f0707e11_432x320.png 424w, https://substackcdn.com/image/fetch/$s_!nQDN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2579653f-d1a0-4576-8be3-40b3f0707e11_432x320.png 848w, https://substackcdn.com/image/fetch/$s_!nQDN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2579653f-d1a0-4576-8be3-40b3f0707e11_432x320.png 1272w, https://substackcdn.com/image/fetch/$s_!nQDN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2579653f-d1a0-4576-8be3-40b3f0707e11_432x320.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nQDN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2579653f-d1a0-4576-8be3-40b3f0707e11_432x320.png" width="432" height="320" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2579653f-d1a0-4576-8be3-40b3f0707e11_432x320.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:320,&quot;width&quot;:432,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:15650,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nQDN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2579653f-d1a0-4576-8be3-40b3f0707e11_432x320.png 424w, https://substackcdn.com/image/fetch/$s_!nQDN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2579653f-d1a0-4576-8be3-40b3f0707e11_432x320.png 848w, https://substackcdn.com/image/fetch/$s_!nQDN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2579653f-d1a0-4576-8be3-40b3f0707e11_432x320.png 1272w, https://substackcdn.com/image/fetch/$s_!nQDN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2579653f-d1a0-4576-8be3-40b3f0707e11_432x320.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>Alguns exemplos de cache:</strong></p><ol><li><p><strong>Cache de CPU:</strong> As CPUs utilizam m&#250;ltiplos n&#237;veis de cache (L1, L2, L3) para acelerar o acesso &#224; mem&#243;ria principal. O cache L1 &#233; extremamente r&#225;pido, mas pequeno, enquanto o L3 &#233; maior e mais lento. Isso permite que a CPU acesse dados rapidamente sem precisar acessar a mem&#243;ria principal constantemente.</p></li><li><p><strong>Cache de disco na RAM:</strong> Um sistema operacional pode armazenar blocos de disco frequentemente acessados na mem&#243;ria RAM. Isso reduz o tempo de acesso aos dados, j&#225; que a RAM &#233; bem mais r&#225;pida que os discos.</p></li><li><p><strong>Cache de Aplica&#231;&#227;o:</strong> Aplica&#231;&#245;es web normalmente utilizam caches em mem&#243;ria, como o Redis ou Memcached, para armazenar resultados de queries do banco de dados. Isso diminui a necessidade de acesso ao banco de dados, melhorando a velocidade de resposta da aplica&#231;&#227;o.</p></li></ol><p>Quero entrar mais a fundo sobre caches em um pr&#243;ximo artigo, onde vou abordar alguns algoritmos como MRU, LRU, LFU e tamb&#233;m sobre caches Hot, Warm e Cold.</p><h3>A dificuldade de identificar os riscos</h3><p>A no&#231;&#227;o de &#8220;conhecidos-conhecidos&#8221;, &#8220;conhecidos-desconhecidos&#8221; e &#8220;desconhecidos-desconhecidos&#8221;, &#233; bem importante para o campo de desempenho. De in&#237;cio pode parecer confuso, mas vamos aos exemplos:</p><p><strong>Conhecidos-Conhecidos</strong></p><p>S&#227;o coisas que voc&#234; sabe. Voc&#234; sabe que deve verificar uma m&#233;trica de desempenho e tamb&#233;m conhece seu valor atual, por exemplo, voc&#234; sabe que deve monitorar a utiliza&#231;&#227;o da CPU e tamb&#233;m sabe que o valor est&#225;, em m&#233;dia, em 10%.</p><p><strong>Conhecidos-Desconhecidos</strong></p><p>S&#227;o coisas que voc&#234; sabe que n&#227;o sabe. Voc&#234; sabe que pode verificar uma m&#233;trica ou a exist&#234;ncia de um subsistema, mas ainda n&#227;o o observou, por exemplo, Voc&#234; sabe que pode usar profiling para verificar o que est&#225; consumindo a CPU, mas ainda n&#227;o realizou essa verifica&#231;&#227;o.</p><p><strong>Desconhecidos-Desconhecidos</strong></p><p>S&#227;o coisas que voc&#234; n&#227;o sabe que n&#227;o sabe. Voc&#234; n&#227;o tem conhecimento de certos aspectos que podem impactar o desempenho, ent&#227;o n&#227;o os est&#225; verificando. Exemplo, voc&#234; pode n&#227;o saber que interrup&#231;&#245;es de dispositivos (como uma placa de rede de alta velocidade) podem se tornar grandes consumidoras de CPU, portanto, n&#227;o est&#225; monitorando esse ponto.</p><p>Existe uma afirma&#231;&#227;o que &#233; "quanto mais voc&#234; sabe, mais voc&#234; descobre que n&#227;o sabe.", e isso &#233; verdade! &#192; medida que voc&#234; aprende mais sobre os sistemas, voc&#234; se torna ciente de mais desconhecidos-desconhecidos, que ent&#227;o se tornam conhecidos-desconhecidos  que voc&#234; pode come&#231;ar a verificar.</p><h3>Quando parar de analisar</h3><p>Analisar o desempenho de um sistema pode ser desafiador, especialmente quando n&#227;o se sabe quando parar. Com tantas ferramentas e aspectos a serem examinados, &#233; comum se perguntar qual &#233; a abordagem correta.</p><p>Existem tr&#234;s cen&#225;rios onde pode ser apropriado encerrar a an&#225;lise de desempenho:</p><ul><li><p>Primeiro, quando a maior parte do problema j&#225; foi explicado. Por exemplo, se uma aplica&#231;&#227;o estava utilizando tr&#234;s vezes mais CPU do que o esperado e, ao investigar, descobre-se que chamadas de API mal otimizadas est&#227;o consumindo 60% do tempo de execu&#231;&#227;o, voc&#234; j&#225; possui uma parte significativa do problema. Nesse caso, &#233; poss&#237;vel interromper a an&#225;lise, corrigir o que foi descoberto e reavaliar o sistema ap&#243;s as mudan&#231;as;</p></li><li><p>Segundo, quando o retorno sobre o investimento (ROI) potencial &#233; menor que o custo da an&#225;lise. Problemas que podem economizar milh&#245;es anuais justificam meses de an&#225;lise, enquanto quest&#245;es menores que geram retornos de centenas de d&#243;lares podem n&#227;o valer o tempo investido.</p></li><li><p>Terceiro, quando h&#225; oportunidades de ROI maiores em outras &#225;reas, priorizando assim onde focar os esfor&#231;os;</p></li></ul><h3>Concluindo</h3><p>Acredito que isso &#233; tudo que tenho para compartilhar a respeito de conceitos. A ideia inicial era trazer mais alguns pontos como perspectivas de an&#225;lises, mas o artigo ficaria bem maior do que j&#225; est&#225;. Ent&#227;o resolvi fazer um resum&#227;o para preparar voc&#234;s para que nos pr&#243;ximos artigos possamos nos aprofundar mais em metodologias.</p><p>At&#233; mais!</p>]]></content:encoded></item><item><title><![CDATA[Systems Performance - Overview ]]></title><description><![CDATA[Introdu&#231;&#227;o &#224; Performance de Sistemas: Fundamentos e Boas Pr&#225;ticas]]></description><link>https://blog.padz.dev/p/systems-performance-overview</link><guid isPermaLink="false">https://blog.padz.dev/p/systems-performance-overview</guid><dc:creator><![CDATA[Bruno Padilha]]></dc:creator><pubDate>Mon, 26 Aug 2024 20:05:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!zbf6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36952aa6-dd9d-42fe-a92a-7e82428862cc_5184x3456.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zbf6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36952aa6-dd9d-42fe-a92a-7e82428862cc_5184x3456.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zbf6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36952aa6-dd9d-42fe-a92a-7e82428862cc_5184x3456.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zbf6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36952aa6-dd9d-42fe-a92a-7e82428862cc_5184x3456.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zbf6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36952aa6-dd9d-42fe-a92a-7e82428862cc_5184x3456.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zbf6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36952aa6-dd9d-42fe-a92a-7e82428862cc_5184x3456.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zbf6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36952aa6-dd9d-42fe-a92a-7e82428862cc_5184x3456.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/36952aa6-dd9d-42fe-a92a-7e82428862cc_5184x3456.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2914569,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zbf6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36952aa6-dd9d-42fe-a92a-7e82428862cc_5184x3456.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zbf6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36952aa6-dd9d-42fe-a92a-7e82428862cc_5184x3456.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zbf6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36952aa6-dd9d-42fe-a92a-7e82428862cc_5184x3456.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zbf6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36952aa6-dd9d-42fe-a92a-7e82428862cc_5184x3456.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Foto por <a href="https://unsplash.com/@polarmermaid?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Anne Nyg&#229;rd</a> no <a href="https://unsplash.com/photos/a-close-up-of-a-circuit-board-6BCgNl-UY6A?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></figcaption></figure></div><p>Essa &#233; a primeira parte de uma s&#233;rie de posts sobre performance de sistemas, um t&#243;pico que sempre chamou minha aten&#231;&#227;o e algo que tenho estudado bastante nos &#250;ltimos tempos. </p><p>A ideia desse primeiro artigo &#233; trazer uma introdu&#231;&#227;o ao tema, falar um pouco sobre onde SRE se encaixa nisso, os desafios e observabilidade.</p><h2>Performance de Sistemas</h2><p>Quando falamos sobre performance de sistemas, precisamos ter em mente que a disciplina contempla todos os componentes de um computador, ou seja, hardware e software, at&#233; mesmo tudo que est&#225; no fluxo de dados como dispositivos de armazenamento at&#233; a aplica&#231;&#227;o. Em sistemas distribu&#237;dos, essa abrang&#234;ncia inclui v&#225;rios servidores e servi&#231;os replicados. </p><p>Como uma boa pr&#225;tica &#233; interessante ter um diagrama do seu ambiente mostrando tudo isso, se voc&#234; n&#227;o tem ainda, pode ser uma &#243;tima hora para come&#231;ar agora, desta forma ser&#225; mais f&#225;cil compreender as conex&#245;es ou relacionamentos entre os componentes e garantir que voc&#234; tenha a vis&#227;o do todo.</p><p>Ao final do dia, ser&#225; poss&#237;vel entender a performance de sistemas e garantir uma melhor experi&#234;ncia para o usu&#225;rio final. Seja reduzindo lat&#234;ncia, custo de processamento, otimiza&#231;&#227;o de queries, e redu&#231;&#227;o de saltos na rede.</p><p>A figura abaixo mostra uma stack super simples de um aplica&#231;&#227;o rodando em um &#250;nico servidor.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SE2e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57222d56-b1be-4d51-bd78-65ff7e4b2303_793x651.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SE2e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57222d56-b1be-4d51-bd78-65ff7e4b2303_793x651.png 424w, https://substackcdn.com/image/fetch/$s_!SE2e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57222d56-b1be-4d51-bd78-65ff7e4b2303_793x651.png 848w, https://substackcdn.com/image/fetch/$s_!SE2e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57222d56-b1be-4d51-bd78-65ff7e4b2303_793x651.png 1272w, https://substackcdn.com/image/fetch/$s_!SE2e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57222d56-b1be-4d51-bd78-65ff7e4b2303_793x651.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SE2e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57222d56-b1be-4d51-bd78-65ff7e4b2303_793x651.png" width="793" height="651" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/57222d56-b1be-4d51-bd78-65ff7e4b2303_793x651.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:651,&quot;width&quot;:793,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:175720,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SE2e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57222d56-b1be-4d51-bd78-65ff7e4b2303_793x651.png 424w, https://substackcdn.com/image/fetch/$s_!SE2e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57222d56-b1be-4d51-bd78-65ff7e4b2303_793x651.png 848w, https://substackcdn.com/image/fetch/$s_!SE2e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57222d56-b1be-4d51-bd78-65ff7e4b2303_793x651.png 1272w, https://substackcdn.com/image/fetch/$s_!SE2e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57222d56-b1be-4d51-bd78-65ff7e4b2303_793x651.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Stack de um sistema</figcaption></figure></div><h2>Atividades e pap&#233;is</h2><p>A an&#225;lise de performance de sistemas envolve uma s&#233;rie de atividades que podem (e devem) ser feitas por diversos profissionais de forma hol&#237;stica, independente de suas fun&#231;&#245;es e especialidades, pois a composi&#231;&#227;o de sistemas complexos necessita de integra&#231;&#227;o cont&#237;nua e colaborativa de diversas disciplinas. Equipes compostas por pessoas SysAdmin, SREs, SWEs, analistas de rede, DBAs s&#227;o um bom exemplo de equipes multidisciplinares. O ideal &#233; que a an&#225;lise de performance seja  apenas uma parte do dia a dia de trabalho das equipes, podendo atuarem tamb&#233;m, de forma mais eficaz na maioria dos casos. Entretanto, existem empresas que contratam pessoas focadas em performance com intuito de criar ferramentas e auxiliar outros times com an&#225;lises.</p><p>No mundo perfeito, sabemos que pensar em performance deveria ser algo inicial, antes mesmo da primeira linha de c&#243;digo, por&#233;m, grande parte desse processo &#233; realizado posteriormente, quando o produto j&#225; est&#225; em produ&#231;&#227;o ou quando um problema surge. No entanto, realizar testes e an&#225;lises de performance em produ&#231;&#227;o n&#227;o &#233; errado e pra isso que servem as Feature Flags, Canary Releases e Blue-Green deployments, o que nos permite controlar melhor como uma nova feature &#233; enviada para produ&#231;&#227;o e se necess&#225;rio, realizar rollback para uma vers&#227;o mais est&#225;vel.</p><p>&#201; poss&#237;vel tamb&#233;m realizar capacity planning (planejamento de capacidade), que n&#227;o se limita apenas ao hardware e software de forma isolada, as iniciativas mais eficientes desse tipo de a&#231;&#227;o s&#227;o as que levam em conta a revis&#227;o de uma arquitetura de solu&#231;&#227;o por completo para atender as expectativas de uso, sejam eles focados em otimiza&#231;&#227;o de uso intensivo ou para expectativas de neg&#243;cio.</p><p>A an&#225;lise de performance em produ&#231;&#227;o pode envolver SREs, geralmente seguido incident reviews ou durante a escrita de postmortems, com intuito de analisar o que aconteceu, compartilhar m&#233;todos para &#8220;debugar&#8221; o problema e encontrar maneiras de prevenir incidentes no futuro. Uma boa dica aqui, &#233; utilizar a t&#233;cnica dos 5 Whys (5 porqu&#234;s), onde atrav&#233;s da aplica&#231;&#227;o de questionamentos &#233; poss&#237;vel que o time encontre a causa ra&#237;z do incidente. Claro que cada empresa tem suas peculiaridades no papel do SRE, mas o correto &#233; que algu&#233;m que esteja na frente de resili&#234;ncia participe dessas an&#225;lises, seja ele um SRE ou SWE.</p><h2>Desafios</h2><p>A an&#225;lise (ou engenharia) de desempenho de sistemas &#233; desafiadora em alguns momentos por ser subjetiva, complexa e muitas vezes envolver m&#250;ltiplos problemas sem uma causa raiz clara.</p><p>Diferente de outras disciplinas, quest&#245;es de desempenho podem ser dif&#237;ceis de identificar e resolver, principalmente classfic&#225;-los como "bom" ou "ruim" sem metas claras. Al&#233;m disso, a complexidade dos sistemas e das intera&#231;&#245;es entre seus componentes torna dif&#237;cil identificar e solucionar problemas de desempenho, que podem n&#227;o se manifestar de maneira reproduz&#237;vel em ambientes que n&#227;o sejam produtivos.</p><p>Problemas de desempenho podem tamb&#233;m podem ter m&#250;ltiplas causas, onde eventos normais ocorrem simultaneamente e juntos podem criar um problema. Al&#233;m disso, em sistemas mais complexos, n&#227;o &#233; raro haver v&#225;rios problemas de performance simult&#226;neas. O desafio n&#227;o &#233; tanto encontrar um problema, mas identificar quais problemas s&#227;o os mais importantes. Sim, &#233; complexo.</p><p>Para isso, a pessoa respons&#225;vel pela an&#225;lise deve tentar quantificar a gravidade dos problemas e estimar o potencial de melhoria, ajudando a justificar a aloca&#231;&#227;o de recursos para sua resolu&#231;&#227;o. E um &#243;timo indicador para essa quantifica&#231;&#227;o, &#233; a lat&#234;ncia.</p><h2>Lat&#234;ncia</h2><p>Lat&#234;ncia &#233; a medida do tempo que um sistema leva para responder a uma solicita&#231;&#227;o e &#233; uma m&#233;trica super essencial. Por exemplo, o tempo de um clique em um site at&#233; o carregamento total da p&#225;gina.</p><p>Sabe aquela ideia que &#233; melhor retornar um erro 500 do que deixar o usu&#225;rio esperando? Pois &#233;, a lat&#234;ncia alta pode causar at&#233; perda de clientes. Al&#233;m disso, a lat&#234;ncia permite estimar o potencial de melhoria do desempenho, quantificando o impacto de fatores como leituras de disco em uma opera&#231;&#227;o e indicando onde aprimoramentos podem ser realizados para aumentar a velocidade. Vamos para um exemplo:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fzi0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b9bccf-8548-4d7a-bf7f-2008e521d870_570x161.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fzi0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b9bccf-8548-4d7a-bf7f-2008e521d870_570x161.png 424w, https://substackcdn.com/image/fetch/$s_!fzi0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b9bccf-8548-4d7a-bf7f-2008e521d870_570x161.png 848w, https://substackcdn.com/image/fetch/$s_!fzi0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b9bccf-8548-4d7a-bf7f-2008e521d870_570x161.png 1272w, https://substackcdn.com/image/fetch/$s_!fzi0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b9bccf-8548-4d7a-bf7f-2008e521d870_570x161.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fzi0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b9bccf-8548-4d7a-bf7f-2008e521d870_570x161.png" width="570" height="161" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/34b9bccf-8548-4d7a-bf7f-2008e521d870_570x161.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:161,&quot;width&quot;:570,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:21434,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fzi0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b9bccf-8548-4d7a-bf7f-2008e521d870_570x161.png 424w, https://substackcdn.com/image/fetch/$s_!fzi0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b9bccf-8548-4d7a-bf7f-2008e521d870_570x161.png 848w, https://substackcdn.com/image/fetch/$s_!fzi0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b9bccf-8548-4d7a-bf7f-2008e521d870_570x161.png 1272w, https://substackcdn.com/image/fetch/$s_!fzi0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34b9bccf-8548-4d7a-bf7f-2008e521d870_570x161.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Exemplo de lat&#234;ncia de uma opera&#231;&#227;o de disco</figcaption></figure></div><p>Na imagem acima, temos uma query que leva 200ms para ser executada (isso &#233; a lat&#234;ncia), no qual 180ms foi s&#243; de espera para leitura de disco. Eliminando a leitura de disco, por meio de estrat&#233;gias como cache, &#233; poss&#237;vel reduzir o tempo de execu&#231;&#227;o de 200ms para 20ms, ou seja, tornar a opera&#231;&#227;o 10 vezes mais r&#225;pida</p><p>Ao contr&#225;rio de outras m&#233;tricas, como opera&#231;&#245;es de I/O por segundo (IOPS), a lat&#234;ncia permite estimar com clareza o impacto de mudan&#231;as no desempenho. Contudo, a lat&#234;ncia pode ser amb&#237;gua sem qualificadores e quantitativos. Por exemplo, em redes, ela pode se referir ao tempo necess&#225;rio para estabelecer uma conex&#227;o entre uma origem e um destino, ou &#224; dura&#231;&#227;o total de uma conex&#227;o considerando todo tempo de processamento at&#233; uma resposta conclusiva da opera&#231;&#227;o. Tendo isso em mente, a lat&#234;ncia nem sempre est&#225; dispon&#237;vel em todos os pontos do sistema. &#201; onde entra o <a href="https://ebpf.io/pt-br/">eBPF</a>, permitindo medir a lat&#234;ncia de forma mais &#8220;customizada&#8221; e ao mesmo tempo fornecendo dados detalhados sobre sua distribui&#231;&#227;o.</p><h2>Observabilidade</h2><p>Observabilidade &#233; uma pr&#225;tica de entendimento do comportamento de um sistema por meio de observa&#231;&#227;o, utilizando ferramentas como contadores, profiling e tracing. Vale ressaltar que ferramentas de load test ou stress test, que alteram o estado do sistema n&#227;o s&#227;o consideradas ferramentas de observabilidade. O motivo &#233; simples, elas criam um tipo de workload com finalidade de experimenta&#231;&#227;o. Em ambientes produtivos, &#233; recomend&#225;vel utilizar ferramentas de observabilidade ao inv&#233;s de ferramentas de experimenta&#231;&#227;o e em ambientes de teste inativos, essas ferramentas podem ser utilizadas para avaliar o desempenho do hardware.</p><p>Aplica&#231;&#245;es e o kernel geralmente fornecem dados sobre seu estado e suas atividades, como contagem de opera&#231;&#245;es, bytes, medi&#231;&#245;es de lat&#234;ncia, utiliza&#231;&#227;o de recursos e taxas de erro. Esses dados s&#227;o geralmente implementados como vari&#225;veis do tipo inteiro chamados counters (contadores), que s&#227;o inseridas nas aplica&#231;&#245;es e algumas delas acumulam valores de forma cont&#237;nua, o que permite l&#234;-los em v&#225;rios momentos para an&#225;lise de performance e desempenho.</p><p>No exemplo abaixo, vemos o utilit&#225;rio <code>vmstat</code>, que mostra um resumo de estat&#237;sticas da mem&#243;ria virtual baseadas nos contadores do kernel presentes no <code>/proc</code>. <strong>Abordarei o </strong><code>vmstat</code><strong> com mais detalhes nos pr&#243;ximos posts.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w16e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50371b32-daf8-44da-aab3-a84ddfab5f98_911x286.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w16e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50371b32-daf8-44da-aab3-a84ddfab5f98_911x286.png 424w, https://substackcdn.com/image/fetch/$s_!w16e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50371b32-daf8-44da-aab3-a84ddfab5f98_911x286.png 848w, https://substackcdn.com/image/fetch/$s_!w16e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50371b32-daf8-44da-aab3-a84ddfab5f98_911x286.png 1272w, https://substackcdn.com/image/fetch/$s_!w16e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50371b32-daf8-44da-aab3-a84ddfab5f98_911x286.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!w16e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50371b32-daf8-44da-aab3-a84ddfab5f98_911x286.png" width="911" height="286" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/50371b32-daf8-44da-aab3-a84ddfab5f98_911x286.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:286,&quot;width&quot;:911,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:45807,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!w16e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50371b32-daf8-44da-aab3-a84ddfab5f98_911x286.png 424w, https://substackcdn.com/image/fetch/$s_!w16e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50371b32-daf8-44da-aab3-a84ddfab5f98_911x286.png 848w, https://substackcdn.com/image/fetch/$s_!w16e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50371b32-daf8-44da-aab3-a84ddfab5f98_911x286.png 1272w, https://substackcdn.com/image/fetch/$s_!w16e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50371b32-daf8-44da-aab3-a84ddfab5f98_911x286.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Exemplo da sa&#237;da de comando vmstat</figcaption></figure></div><p>Em observabilidade, o termo profiling geralmente se refere ao uso de ferramentas que realizam amostragem, coletando um subconjunto de medi&#231;&#245;es para criar uma vis&#227;o geral do sistema. Por exemplo, CPU &#233; um recurso comum para profiling, onde a an&#225;lise &#233; feita de forma frequente atrav&#233;s de amostragens em intervalos de tempo durante a execu&#231;&#227;o da aplica&#231;&#227;o. Uma visualiza&#231;&#227;o eficaz dessas amostragens s&#227;o os flame graphs, que ajudam a identificar problemas de desempenho n&#227;o apenas relacionados &#224; CPU, mas tamb&#233;m a outros aspectos como problemas de mem&#243;ria ao analisar o tempo de CPU em fun&#231;&#245;es de aloca&#231;&#227;o de mem&#243;ria.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!44wf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71319efd-a109-4b84-897d-e8a6c1d549ee_1200x626.svg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!44wf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71319efd-a109-4b84-897d-e8a6c1d549ee_1200x626.svg 424w, https://substackcdn.com/image/fetch/$s_!44wf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71319efd-a109-4b84-897d-e8a6c1d549ee_1200x626.svg 848w, https://substackcdn.com/image/fetch/$s_!44wf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71319efd-a109-4b84-897d-e8a6c1d549ee_1200x626.svg 1272w, https://substackcdn.com/image/fetch/$s_!44wf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71319efd-a109-4b84-897d-e8a6c1d549ee_1200x626.svg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!44wf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71319efd-a109-4b84-897d-e8a6c1d549ee_1200x626.svg" width="1456" height="760" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/71319efd-a109-4b84-897d-e8a6c1d549ee_1200x626.svg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:760,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Example&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Example" title="Example" srcset="https://substackcdn.com/image/fetch/$s_!44wf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71319efd-a109-4b84-897d-e8a6c1d549ee_1200x626.svg 424w, https://substackcdn.com/image/fetch/$s_!44wf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71319efd-a109-4b84-897d-e8a6c1d549ee_1200x626.svg 848w, https://substackcdn.com/image/fetch/$s_!44wf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71319efd-a109-4b84-897d-e8a6c1d549ee_1200x626.svg 1272w, https://substackcdn.com/image/fetch/$s_!44wf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71319efd-a109-4b84-897d-e8a6c1d549ee_1200x626.svg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Exemplo de um flame graph</figcaption></figure></div><p>J&#225; o termo tracing se refere a um registro baseado em eventos, onde esses dados s&#227;o capturados e armazenados para an&#225;lise posterior ou processados em tempo. Existem ferramentas espec&#237;ficas para captura de traces de syscalls como o <code>strace</code> e o <code>tcpdump</code>. Essas ferramentas utilizam v&#225;rias fontes para capturar os eventos, incluindo instrumenta&#231;&#227;o din&#226;mica e est&#225;tica, al&#233;m da utiliza&#231;&#227;o do eBPF.</p><p>A instrumenta&#231;&#227;o est&#225;tica refere-se a pontos de instrumenta&#231;&#227;o adicionados diretamente ao c&#243;digo-fonte da aplica&#231;&#227;o. No kernel do Linux, existem v&#225;rios desses pontos que monitoram opera&#231;&#245;es como I/O do disco, eventos do scheduler, syscalls e entre outros. Para software em espa&#231;o de usu&#225;rio, existe uma tecnologia semelhante chamada USDT (User Statically Defined Tracing). O USDT &#233; utilizado por bibliotecas (como a libc) para instrumentar chamadas de biblioteca e por muitas aplica&#231;&#245;es para instrumentar requisi&#231;&#245;es de servi&#231;o. J&#225; a instrumenta&#231;&#227;o din&#226;mica, cria pontos de instrumenta&#231;&#227;o enquanto o aplica&#231;&#227;o est&#225; em execu&#231;&#227;o, modificando instru&#231;&#245;es na mem&#243;ria para inserir rotinas de instrumenta&#231;&#227;o. Isso permite gerar estat&#237;sticas de desempenho em qualquer aplica&#231;&#227;o.</p><h2>Finalizando</h2><p>Essa foi a primeira parte de uma s&#233;rie de posts sobre performance de sistemas. O intuito foi dar uma introdu&#231;&#227;o ao tema, abordar os principais termos e ferramentas para que possamos nos aprofundar sobre metodologias, capacity planning e benchmarking nos pr&#243;ximos posts.</p><p>Se voc&#234; curtiu essa primeira parte, compartilhe esse post com seus colegas de trabalho e em redes sociais. Feedbacks s&#227;o sempre muito bem vindos tamb&#233;m!</p><p>At&#233; mais. :)</p>]]></content:encoded></item><item><title><![CDATA[Como medir a produtividade de um time de engenharia de software? ]]></title><description><![CDATA[A resposta &#233; simples, DORA Metrics!]]></description><link>https://blog.padz.dev/p/como-medir-a-produtividade-de-um</link><guid isPermaLink="false">https://blog.padz.dev/p/como-medir-a-produtividade-de-um</guid><dc:creator><![CDATA[Bruno Padilha]]></dc:creator><pubDate>Tue, 30 Jul 2024 15:12:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!V3Gr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9928ee66-be47-4ac8-ab1c-5871340967e8_1920x1280.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!V3Gr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9928ee66-be47-4ac8-ab1c-5871340967e8_1920x1280.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!V3Gr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9928ee66-be47-4ac8-ab1c-5871340967e8_1920x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!V3Gr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9928ee66-be47-4ac8-ab1c-5871340967e8_1920x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!V3Gr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9928ee66-be47-4ac8-ab1c-5871340967e8_1920x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!V3Gr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9928ee66-be47-4ac8-ab1c-5871340967e8_1920x1280.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!V3Gr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9928ee66-be47-4ac8-ab1c-5871340967e8_1920x1280.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9928ee66-be47-4ac8-ab1c-5871340967e8_1920x1280.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:390888,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!V3Gr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9928ee66-be47-4ac8-ab1c-5871340967e8_1920x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!V3Gr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9928ee66-be47-4ac8-ab1c-5871340967e8_1920x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!V3Gr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9928ee66-be47-4ac8-ab1c-5871340967e8_1920x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!V3Gr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9928ee66-be47-4ac8-ab1c-5871340967e8_1920x1280.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Foto por <a href="https://unsplash.com/@mcverry?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Mikail McVerry</a> no <a href="https://unsplash.com/photos/black-speedometer--yBvef_mAaQ?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></figcaption></figure></div><p>Imagine voc&#234;, como Engenheiro/a DevOps ou Engenheiro/a de Software, como voc&#234; mediria seu desempenho, do seu time ou da engenharia como um todo? Existe algum framework ou m&#233;todo para isso? A resposta &#233; &#8220;sim&#8221;, como o <a href="https://blog.codacy.com/space-framework">SPACE</a> e o <a href="https://getdx.com/blog/measuring-developer-productivity/">DevEx</a>, mas o framework que vou abordar hoje &#233; o DORA Metrics.</p><p>Medir a efic&#225;cia das pr&#225;ticas de DevOps vai al&#233;m de apenas implementar CI/CD e afirmar que se est&#225; praticando DevOps. As DORA Metrics, desenvolvidas pela <a href="https://dora.dev/">DevOps Research and Assessment</a>, s&#227;o fundamentais para obter uma vis&#227;o precisa e baseada em dados sobre o desempenho de entrega de software. Elas se concentram em quatro m&#233;tricas principais que revelam o desempenho real das equipes de engenharia, destacando de forma clara as &#225;reas que precisam de melhorias. Com essas m&#233;tricas, voc&#234; consegue ir direto ao ponto, identificando gargalos e oportunidades para otimizar processos e entregar mais valor.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.padz.dev/subscribe?&quot;,&quot;text&quot;:&quot;Inscreva-se&quot;,&quot;language&quot;:&quot;pt-br&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">padz.dev &#233; uma publica&#231;&#227;o apoiada por leitores. Para receber novos posts e apoiar meu trabalho, considere tornar-se um assinante gratuito ou pago.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Digite seu e-mail&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Inscreva-se"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Al&#233;m disso, as DORA Metrics podem ser alinhadas com os objetivos estrat&#233;gicos da empresa, garantindo que as pr&#225;ticas de DevOps estejam em sintonia com as metas de neg&#243;cio. Por exemplo, ao melhorar a Frequ&#234;ncia de Deploys e reduzir o tempo m&#233;dio de recupera&#231;&#227;o de um incidente, a empresa pode acelerar o tempo de lan&#231;amento de novos produtos no mercado e consequentemente aumentando sua competitividade e satisfa&#231;&#227;o do cliente.</p><h2>As quatro m&#233;tricas</h2><p>Entendido o que s&#227;o as DORA Metrics, vamos passar por cada uma delas e dar mais contexto:</p><p><strong>Deployment Frequency</strong></p><p>Deployment Frequency mede quantas vezes novas vers&#245;es de c&#243;digo sobem para produ&#231;&#227;o em um determinado per&#237;odo. &#201; um indicador que mede a agilidade da equipe de desenvolvimento e da capacidade de entregar valor continuamente aos usu&#225;rios e ao neg&#243;cio. Ou seja, uma alta frequ&#234;ncia de deploy corresponde a equipes que respondem rapidamente a feedbacks (feedback loops) e mudan&#231;as nas regras de neg&#243;cios. </p><p>Para medir, basta calcular o n&#250;mero de deploys realizados em um per&#237;odo espec&#237;fico, como por dia ou semana. Um processo importante, que minimiza depend&#234;ncias e &#8220;burocracias&#8221; no processo de deploy e que j&#225; &#233; bem difundido &#233; o CI/CD. Vale ressaltar que CI/CD n&#227;o &#233; ter um Jenkins ou GitHub Actions rodando, CI/CD &#233; de fato o processo cont&#237;nuo e sem interven&#231;&#245;es manuais para rodar uma su&#237;te de testes, processo de build e deploy.</p><p><strong>Lead Time for Changes</strong></p><p>Mede o tempo que leva desde o commit inicial at&#233; o deploy para produ&#231;&#227;o. Essa m&#233;trica reflete a efici&#234;ncia das pipelines, fluxos de desenvolvimento e a capacidade e velocidade de entregar valor.</p><p>Diferente do deployment frequency, a ideia &#233; ter essa m&#233;trica com indicadores baixos, ou seja, subir pequenas altera&#231;&#245;es para produ&#231;&#227;o e com mais frequ&#234;ncia. A utiliza&#231;&#227;o de metodologias &#225;geis, tamb&#233;m ajuda muito no processo.  </p><p><strong>Mean Time to Recovery ou MTTR</strong></p><p>O MTTR mede o tempo m&#233;dio que um time leva para recuperar um sistema ap&#243;s uma falha em produ&#231;&#227;o. &#201; um indicador da resili&#234;ncia e estabilidade do sistema. Adotar pr&#225;ticas SRE, como a cria&#231;&#227;o de playbooks para incidentes, observabilidade, e chaos engineering, pode melhorar significativamente o MTTR.</p><p>Ter um bom processo de gerenciamento de incidentes, com revis&#227;o de post-mortems e ferramentas que alertem a qualquer comportamento an&#244;malo e que possam indicar uma poss&#237;vel falha, ajudam na identifica&#231;&#227;o de melhorias e recupera&#231;&#227;o/corre&#231;&#227;o mais r&#225;pida. </p><p><strong>Change Failure Rate</strong></p><p>Mede a porcentagem de deploys que resultam em falhas em produ&#231;&#227;o. &#201; um indicador importante para avaliar a qualidade do processo de desenvolvimento e a estabilidade do sistema.</p><p>Implementar su&#237;te de testes automatizados, realizar revis&#245;es de c&#243;digo de forma mais regular e utilizar pipelines de CI/CD para valida&#231;&#227;o cont&#237;nua s&#227;o m&#233;todos eficazes para reduzir a taxa de falhas.</p><h2>Como implementar</h2><p>A maior parte das ferramentas de CI/CD e observabilidade atualmente conseguem demonstrar os indicadores das quatro m&#233;tricas. Por exemplo, a <a href="https://docs.datadoghq.com/dora_metrics/">Datadog</a> possui em beta uma funcionalidade para extra&#231;&#227;o e an&#225;lise, a <a href="https://developer.harness.io/docs/continuous-delivery/monitor-deployments/dora-metrics-dashboard/">Harness</a> tem algo um pouco mais s&#243;lido, por&#233;m mais simples. J&#225; o GitLab oferece uma <a href="https://docs.gitlab.com/ee/user/analytics/dora_metrics.html">an&#225;lise bem mais completa</a>, por&#233;m apenas no plano Ultimate.</p><p>Por&#233;m, ambas solu&#231;&#245;es s&#227;o pagas e isso vai muito da ferramenta que voc&#234; utiliza, por isso, recomendo uma ferramenta que tenho estudado h&#225; algumas semanas, o <a href="https://devlake.apache.org/">Apache DevLake</a>. Nela, &#233; poss&#237;vel plugar v&#225;rias solu&#231;&#245;es de mercado e centralizar a extra&#231;&#227;o e visualiza&#231;&#227;o de m&#233;tricas em um s&#243; lugar. Outro ponto bem positivo, &#233; que caso na sua empresa seja utilizado alguma ferramenta desenvolvida internamente, o DevLake aceita Webhooks.</p><p>Al&#233;m das quatro m&#233;tricas, o DevLake consolida <a href="https://devlake.apache.org/docs/Metrics">v&#225;rias outras adicionais</a>, como tamanho das Pull Requests, dura&#231;&#227;o dos builds, linhas adicionadas ou deletadas em um commit e por a&#237; vai.</p><p>Obviamente, que conseguir integrar a medi&#231;&#227;o das m&#233;tricas no dia a dia, requer pr&#225;ticas e processos bem definidos. Uma dica &#233; incorporar revisar essas m&#233;tricas durante as dailies ou em retrospectivas. Criar uma dashboard para que todo time possa acompanhar as m&#233;tricas pode aumentar a transpar&#234;ncia e incentivar a responsabilidade compartilhada.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YzHF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1f52d2a-77fa-4a81-8cb5-4ed0f6d66f25_4088x2783.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YzHF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1f52d2a-77fa-4a81-8cb5-4ed0f6d66f25_4088x2783.png 424w, https://substackcdn.com/image/fetch/$s_!YzHF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1f52d2a-77fa-4a81-8cb5-4ed0f6d66f25_4088x2783.png 848w, https://substackcdn.com/image/fetch/$s_!YzHF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1f52d2a-77fa-4a81-8cb5-4ed0f6d66f25_4088x2783.png 1272w, https://substackcdn.com/image/fetch/$s_!YzHF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1f52d2a-77fa-4a81-8cb5-4ed0f6d66f25_4088x2783.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YzHF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1f52d2a-77fa-4a81-8cb5-4ed0f6d66f25_4088x2783.png" width="1456" height="991" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1f52d2a-77fa-4a81-8cb5-4ed0f6d66f25_4088x2783.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:991,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;DORA&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="DORA" title="DORA" srcset="https://substackcdn.com/image/fetch/$s_!YzHF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1f52d2a-77fa-4a81-8cb5-4ed0f6d66f25_4088x2783.png 424w, https://substackcdn.com/image/fetch/$s_!YzHF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1f52d2a-77fa-4a81-8cb5-4ed0f6d66f25_4088x2783.png 848w, https://substackcdn.com/image/fetch/$s_!YzHF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1f52d2a-77fa-4a81-8cb5-4ed0f6d66f25_4088x2783.png 1272w, https://substackcdn.com/image/fetch/$s_!YzHF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1f52d2a-77fa-4a81-8cb5-4ed0f6d66f25_4088x2783.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Exemplo de dashboard DORA Metrics com Grafana e Apache DevLake</figcaption></figure></div><h2>Estabilidade e Velocidade</h2><p>Todo mundo quer uma baixa taxa de erros e que sistemas sejam restaurados rapidamente em caso de falha, &#233; uma verdade que todo mundo tamb&#233;m quer colocar features de forma mais r&#225;pida em produ&#231;&#227;o. E inicialmente, parece que h&#225; uma diverg&#234;ncia entre elas, certo? Se o time colocar mais features em produ&#231;&#227;o sem bons testes ou controle de qualidade, a taxa de erros pode aumentar.</p><p>Algo muito importante, &#233; que observabilidade vai muito de encontro com o tema. Quando h&#225; um incidente em produ&#231;&#227;o, &#233; poss&#237;vel entender de forma mais r&#225;pida, o problema olhando para qual foi a mudan&#231;a. Com um lead time mais curto, a compreens&#227;o da mudan&#231;a &#233; mais f&#225;cil e consequentemente, sabemos qual &#233; o problema. Ou seja, entender a causa ra&#237;z reduz o MTTR, que tamb&#233;m reduz a taxa de falhas em mudan&#231;as (Change Failure Rate).</p><p>O contexto e os recursos s&#227;o importantes nesses momentos. Por&#233;m, essas quatro m&#233;tricas se influenciam mutuamente e muitas vezes ajudam dar insights que seriam mais dif&#237;ceis de compreender de outra forma. Analisar essa &#8220;dualidade&#8221; entre velocidade e estabilidade &#233; uma abordagem eficaz para avaliar o desempenho das pr&#225;ticas DevOps.</p><p>Vou deixar alguns livros que recomendo demais para quem quer se aventurar mais na melhoria de fluxo de entrega de software e DevOps.</p><ul><li><p><a href="https://amzn.to/3LJS2s9">Accelerate: The Science of Lean Software and DevOps</a> (<a href="https://amzn.to/46H8wuZ">Vers&#227;o Kindle</a>)</p></li><li><p><a href="https://amzn.to/3YHqZFN">The DevOps Handbook</a> (<a href="https://amzn.to/46p9YSu">Vers&#227;o Kindle</a>)</p></li><li><p><a href="https://amzn.to/4cWcodE">Measuring Continuous Delivery</a></p></li><li><p><a href="https://amzn.to/3zVP2pR">Observability Engineering</a> (<a href="https://amzn.to/3SupKpo">Vers&#227;o Kindle</a>)</p></li></ul><p>Boa leitura e at&#233; a pr&#243;xima.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.padz.dev/subscribe?&quot;,&quot;text&quot;:&quot;Inscreva-se&quot;,&quot;language&quot;:&quot;pt-br&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">padz.dev &#233; uma publica&#231;&#227;o apoiada por leitores. Para receber novos posts e apoiar meu trabalho, considere tornar-se um assinante gratuito ou pago.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Digite seu e-mail&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Inscreva-se"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>