<?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: Systems Performance]]></title><description><![CDATA[Artigos relacionados a performance de sistemas, com conteúdo super técnico e profundo sobre o tema. Excelente para SREs, engenheiros de software e pessoas que trabalham com observabilidade.]]></description><link>https://blog.padz.dev/s/systems-performance</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: Systems Performance</title><link>https://blog.padz.dev/s/systems-performance</link></image><generator>Substack</generator><lastBuildDate>Wed, 06 May 2026 16:49:33 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[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[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[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></channel></rss>