<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Camila</title>
    <description>The latest articles on DEV Community by Camila (@camilacodes).</description>
    <link>https://dev.to/camilacodes</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F719040%2Fe9be486f-1f3d-4f6a-95f2-e525b0f994f7.jpg</url>
      <title>DEV Community: Camila</title>
      <link>https://dev.to/camilacodes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/camilacodes"/>
    <language>en</language>
    <item>
      <title>Understanding Gitaly and Kernel Memory Consumption in Kubernetes on Self-Hosted GitLab</title>
      <dc:creator>Camila</dc:creator>
      <pubDate>Tue, 24 Feb 2026 19:26:42 +0000</pubDate>
      <link>https://dev.to/camilacodes/understanding-gitaly-and-kernel-memory-consumption-in-kubernetes-on-self-hosted-gitlab-2je3</link>
      <guid>https://dev.to/camilacodes/understanding-gitaly-and-kernel-memory-consumption-in-kubernetes-on-self-hosted-gitlab-2je3</guid>
      <description>&lt;p&gt;During the early hours of the morning, I started receiving Gitaly alerts — memory spikes that weren't being released automatically after the daily backup.&lt;/p&gt;

&lt;p&gt;This article is about a &lt;strong&gt;self-hosted GitLab on EKS&lt;/strong&gt; and the behavior of some GitLab components in Kubernetes.&lt;/p&gt;

&lt;p&gt;If you also run GitLab on Kubernetes, it's worth understanding what's really happening — and why &lt;strong&gt;Cgroup v2&lt;/strong&gt; is the definitive solution to this kind of problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;GITALY&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Gitaly is the GitLab component responsible for all Git operations: clone, push, pull, merge, diff, and blame. It isolates repository storage from the web application and communicates with other services via gRPC, optimizing performance and concurrency control.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────┐
│ GitLab Webservice   │
│              │
└──────────┬──────────┘
           │ gRPC
           ↓
┌─────────────────────┐
│ Gitaly              │
│ - Git operations    │
│ - Repository access │
└──────────┬──────────┘
           ↓
┌─────────────────────┐
│ Persistent Volume   │
│ /home/git/repos     │
└─────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;GITLAB TOOLBOX BACKUP&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;It's a GitLab component used to perform backups in Kubernetes environments (specifically deployed using Helm charts). It's a pod/container that contains tools and scripts to execute GitLab backup and restore operations. When does it interact with Gitaly? During repository backups.&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Connects to Gitaly via gRPC&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Requests a backup of each repository&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Receives Git bundles from Gitaly&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processes and compresses the data&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sends everything to object storage (S3, GCS, etc.)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;During the execution of the &lt;strong&gt;gitlab-toolbox-backup&lt;/strong&gt; cronjob in the early morning, I observed high memory usage on the Gitaly pod. This consumption is caused by the default behavior of the &lt;strong&gt;Linux kernel&lt;/strong&gt;, which uses RAM as a cache for files read from disk (page cache).&lt;/p&gt;

&lt;p&gt;In Kubernetes environments, this behavior can create resource allocation problems, since the kernel is shared across all pods on the node.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Symptoms:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;High memory usage&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdqcsee4k2a4xunv21yu2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdqcsee4k2a4xunv21yu2.png" alt="High memory usage" width="317" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fblvkpjpej8kef2z576r6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fblvkpjpej8kef2z576r6.png" alt="High memory usage" width="410" height="38"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Critical implications:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The kernel is &lt;strong&gt;shared&lt;/strong&gt; across the entire node&lt;/li&gt;
&lt;li&gt;Page Cache is global and shared&lt;/li&gt;
&lt;li&gt;Cgroups v1 only limits how much each container &lt;em&gt;can&lt;/em&gt; use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The kernel has no concept of "pod" or "container" — if the node has plenty of RAM, the kernel considers memory available even when a pod is about to be OOM-killed.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────┐
│                     NODE                        │
│                                                 │
│  ┌──────────────────────────────────────────┐   │
│  │         LINUX KERNEL (single)            │   │
│  │  - Manages ALL node RAM                  │   │
│  │  - Page Cache is SHARED                  │   │
│  │  - Has no concept of "pod"               │   │
│  └──────────────────────────────────────────┘   │
│                                                 │
│  ┌────────────┐  ┌────────────┐  ┌──────────┐   │
│  │  Pod A     │  │  Pod B     │  │  Pod C   │   │
│  │  (Gitaly)  │  │  (Redis)   │  │  (Web)   │   │
│  │            │  │            │  │          │   │
│  │  Sees:     │  │  Sees:     │  │  Sees:   │   │
│  │  Limit:8GB │  │  Limit:4GB │  │ Limit:2GB│   │
│  └────────────┘  └────────────┘  └──────────┘   │
│                                                 │
│  Total RAM: 32GB                                │
│  Total Cache: 20GB (visible to ALL)             │
└─────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note: Page Cache is the &lt;strong&gt;RAM used by the kernel to cache files from disk&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Backup Flow&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fch89rjmyfegi0b2tcio7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fch89rjmyfegi0b2tcio7.png" alt=" " width="800" height="684"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What happens?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;During the backup (1h):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gitaly reads hundreds of Git repositories&lt;/li&gt;
&lt;li&gt;Kernel caches everything: "I'll keep these .git files in RAM"&lt;/li&gt;
&lt;li&gt;Backup ends: Gitaly process returns to normal (195MB)&lt;/li&gt;
&lt;li&gt;Kernel doesn't clean up: Cache stays marked as "active_file" = 35.6GB&lt;/li&gt;
&lt;li&gt;Kubernetes sees: Pod using 37GB → OOM danger!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why doesn't it clean up automatically?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The cache is marked as "active" (not "inactive"), so the kernel thinks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"These files were recently used"&lt;br&gt;
"They'll probably be used again soon"&lt;br&gt;
"I'll keep them in RAM"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But since this is a backup that runs once a day, those files won't be accessed again until tomorrow!&lt;/p&gt;

&lt;h3&gt;
  
  
  Possible solutions evaluated:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Effort&lt;/th&gt;
&lt;th&gt;Benefit&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Migrate to cgroup v2&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;High (node reboot)&lt;/td&gt;
&lt;td&gt;Definitive fix&lt;/td&gt;
&lt;td&gt;Best long-term option&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Privileged CronJob to drop cache&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Low (15min)&lt;/td&gt;
&lt;td&gt;Solves the problem&lt;/td&gt;
&lt;td&gt;If you need a quick fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;DaemonSet monitor&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Medium (1h)&lt;/td&gt;
&lt;td&gt;Automated&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Increase memory limit&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Temporary workaround&lt;/td&gt;
&lt;td&gt;Emergency only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As we can see, there are workarounds — but the best long-term option is Cgroup v2. It requires a bit more effort to implement, but the benefits make it stand out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current Cgroup v1 data:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cache: 38829035520           # 36.2 GB !!!!!
rss: 204779520               # 195 MB
inactive_file: 568246272     # 542 MB
active_file: 38260654080     # 35.6 GB !!!!!


**35.6GB of `active_file`** = actively cached files (page cache)!

Breakdown:
- Gitaly process (RSS): 195 MB
- Active file cache: 35.6 GB  ← HERE!
- Inactive file cache: 542 MB
- Total cache: 36.2 GB
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Total pod usage: ~37 GB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Cgroup v2&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Cgroup v2 has a feature called PSI that detects when there is memory "pressure":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# cgroup v2 exposes:
/sys/fs/cgroup/memory.pressure
# Content:
some avg10=0.00 avg60=0.00 avg300=0.00 total=0
full avg10=0.00 avg60=0.00 avg300=0.00 total=0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When pressure is detected, the &lt;strong&gt;kernel automatically&lt;/strong&gt; releases cache even if it's marked as "active"!&lt;/p&gt;

&lt;p&gt;Cgroup v2 is the second generation of the Linux kernel's control groups system, with significant improvements over v1. Our GitLab EKS cluster is currently running Cgroup v1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cgroup v1&lt;/strong&gt; has multiple independent hierarchies (memory, cpu, io), which can cause inconsistencies. Cgroup v2 uses a single unified tree:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feu3im3dtnt76jolslsdz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feu3im3dtnt76jolslsdz.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's it! I had the chance to dig into this topic this week and wanted to share what I learned.&lt;/p&gt;

&lt;p&gt;Docs: &lt;a href="https://docs.gitlab.com/charts/backup-restore/" rel="noopener noreferrer"&gt;backup-restore&lt;/a&gt;&lt;br&gt;
&lt;a href="https://overcast.blog/kernel-tuning-and-optimization-for-kubernetes-a-guide-a3bdc8f7d255" rel="noopener noreferrer"&gt;Kernel Tuning and Optimization for Kubernetes: A Guide&lt;/a&gt;&lt;br&gt;
&lt;a href="https://kubernetes.io/docs/reference/node/kernel-version-requirements/" rel="noopener noreferrer"&gt;Linux Kernel Version Requirements&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gitlab</category>
      <category>linux</category>
      <category>kernel</category>
      <category>devops</category>
    </item>
    <item>
      <title>Entendendo o consumo de memória do Gitaly e Kernel no Kubernetes em Gitlab self-hosted</title>
      <dc:creator>Camila</dc:creator>
      <pubDate>Fri, 07 Nov 2025 20:38:53 +0000</pubDate>
      <link>https://dev.to/camilacodes/entendendo-o-consumo-de-memoria-do-gitaly-no-kubernetes-2ha2</link>
      <guid>https://dev.to/camilacodes/entendendo-o-consumo-de-memoria-do-gitaly-no-kubernetes-2ha2</guid>
      <description>&lt;p&gt;Durante uma madrugada, comecei a receber alertas do Gitaly, o mesmo estava com picos de uso de memória que não eram liberados automaticamente após Backup diário. &lt;/p&gt;

&lt;p&gt;Esse artigo se trata de um &lt;strong&gt;GitLab self hosted no EKS&lt;/strong&gt; e o comportamento de alguns componentes do gitlab no Kubernetes.&lt;/p&gt;

&lt;p&gt;Se você também roda GitLab em Kubernetes, vale entender o que realmente acontece — e por que o &lt;strong&gt;Cgroup v2&lt;/strong&gt; é a solução definitiva pra esse tipo de problema.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;GITALY&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;O Gitaly é o componente do GitLab responsável por todas as operações Git, como clone, push, pull, merge, diff e blame. Ele isola o armazenamento dos repositórios da aplicação web e se comunica com os demais serviços via gRPC, otimizando a performance e o controle de concorrência.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────┐
│ GitLab Webservice   │
│              │
└──────────┬──────────┘
           │ gRPC
           ↓
┌─────────────────────┐
│ Gitaly              │
│ - Git operations    │
│ - Repository access │
└──────────┬──────────┘
           ↓
┌─────────────────────┐
│ Persistent Volume   │
│ /home/git/repos     │
└─────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;GITLAB TOOLBOX BACKUP&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;É um componente do Gitlab usado para realizar backups em ambientes Kubernetes (especificamente deployado usando helm charts). É um pod/container que contém ferramentas e scripts para executar operações de backup e restore do Gitlab. E quando ele aciona o Gitaly? durante o Backup dos repositórios.&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;-&lt;strong&gt;Conecta ao Gitaly via gRPC&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;-&lt;strong&gt;Solicita backup de cada repositório&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;-&lt;strong&gt;Recebe bundles Git do Gitaly&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;-&lt;strong&gt;Processa e comprime os dados&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;-&lt;strong&gt;Envia para algum object storage (S3, GCS, etc)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;Durante a execução do cronjob &lt;strong&gt;gitlab-toolbox-backup&lt;/strong&gt; na madrugada, observei um uso elevado de memória no pod do Gitaly. Esse consumo é causado pelo comportamento padrão do &lt;strong&gt;kernel Linux&lt;/strong&gt;, que utiliza a RAM como cache de arquivos lidos do disco (page cache). &lt;/p&gt;

&lt;p&gt;Em ambientes Kubernetes, esse comportamento pode gerar problemas de alocação de recursos, pois o kernel é compartilhado entre todos os pods do node.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Sintomas:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Alto uso de memória &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdqcsee4k2a4xunv21yu2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdqcsee4k2a4xunv21yu2.png" alt="Alto uso de memória" width="317" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fblvkpjpej8kef2z576r6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fblvkpjpej8kef2z576r6.png" alt="Alto uso de memória" width="410" height="38"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implicações críticas:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;O kernel é &lt;strong&gt;único&lt;/strong&gt; para todo o node&lt;/li&gt;
&lt;li&gt;O Page Cache é global e compartilhado&lt;/li&gt;
&lt;li&gt;CgroupsV1 apenas limitam quanto cada container pode usar&lt;/li&gt;
&lt;li&gt;** O kernel não sabe o que é um "pod" ou "container" então se o Node tiver muita memória o Kernel vai considerar que tem memória disponível mesmo o pod estourando, pedindo pra morrer. **
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────┐
│                     NODE       
│                                                 │
│  ┌──────────────────────────────────────────┐   │
│  │         KERNEL LINUX (único)             │   │
│  │  - Gerencia TODA a RAM do node           │   │
│  │  - Page Cache é COMPARTILHADO            │   │
│  │  - Não sabe o que é "pod"                │   │
│  └──────────────────────────────────────────┘   │
│                                                 │
│  ┌────────────┐  ┌────────────┐  ┌──────────┐   │
│  │  Pod A     │  │  Pod B     │  │  Pod C   │   │
│  │  (Gitaly)  │  │  (Redis)   │  │  (Web)   │   │
│  │            │  │            │  │          │   │
│  │  Vê:       │  │  Vê:       │  │  Vê:     │   │
│  │  Limit:8GB │  │  Limit:4GB │  │ Limit:2GB│   │
│  └────────────┘  └────────────┘  └──────────┘   │
│                                                 │
│  RAM Total: 32GB                                │
│  Cache Total: 20GB (visível para TODOS)         │
└─────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Obs: Page Cache é a &lt;strong&gt;RAM usada pelo kernel para cachear arquivos do disco&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Fluxo de Backup&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fch89rjmyfegi0b2tcio7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fch89rjmyfegi0b2tcio7.png" alt=" " width="800" height="684"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;O que acontece?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Durante o backup (1h):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gitaly lê centenas de repositórios Git&lt;/li&gt;
&lt;li&gt;Kernel cacheia tudo: "Vou guardar esses arquivos .git na RAM"&lt;/li&gt;
&lt;li&gt;Backup termina: Processo Gitaly volta ao normal (195MB)&lt;/li&gt;
&lt;li&gt;Kernel não limpa: Cache fica marcado como "active_file" = 35.6GB&lt;/li&gt;
&lt;li&gt;Kubernetes vê: Pod usando 37GB → perigo de OOM!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Por que não limpa automaticamente?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O cache está marcado como "active" (não "inactive"), então o kernel pensa:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Esses arquivos foram usados recentemente"&lt;br&gt;
"Provavelmente vão ser usados de novo em breve"&lt;br&gt;
"Vou manter eles na RAM"&lt;br&gt;
Mas como é um backup que roda 1x por dia, esses arquivos não vão ser usados de novo até amanhã!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Possíveis soluções estudadas:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Opção&lt;/th&gt;
&lt;th&gt;Esforço&lt;/th&gt;
&lt;th&gt;Benefício&lt;/th&gt;
&lt;th&gt;Recomendação&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Migrar para cgroup v2&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Alto (reboot nodes)&lt;/td&gt;
&lt;td&gt;Solução definitiva&lt;/td&gt;
&lt;td&gt;A melhor opção&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;CronJob privilegiado&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Baixo (15min)&lt;/td&gt;
&lt;td&gt;Resolve o problema&lt;/td&gt;
&lt;td&gt;se estiver com pressa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;DaemonSet monitor&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Médio (1h)&lt;/td&gt;
&lt;td&gt;Automático&lt;/td&gt;
&lt;td&gt;Opcional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Aumentar limite&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Baixo&lt;/td&gt;
&lt;td&gt;Paliativo&lt;/td&gt;
&lt;td&gt;Só em emergência&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Como podemos ver existem paliativos, porém a melhor opção a longo prazo é Cgroup V2. Só tem um pouco de complexidade para aplicar, mas mesmo assim se destaca pelos benefícios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dados do Cgroup V1 atual:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cache: 38829035520           # 36.2 GB !!!!!
rss: 204779520               # 195 MB
inactive_file: 568246272     # 542 MB
active_file: 38260654080     # 35.6 GB !!!!!


**35.6GB de `active_file`** = arquivos em cache ativo (page cache)!

Breakdown:
- Processo Gitaly (RSS): 195 MB
- Cache de arquivos ativos: 35.6 GB  ← AQUI!
- Cache de arquivos inativos: 542 MB
- Total cache: 36.2 GB
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Total do pod: ~37 GB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Cgroup V2&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Cgroup V2 tem um recurso chamado PSI que detecta quando há "pressão" de memória:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# cgroup v2 expõe:
/sys/fs/cgroup/memory.pressure
# Conteúdo:
some avg10=0.00 avg60=0.00 avg300=0.00 total=0
full avg10=0.00 avg60=0.00 avg300=0.00 total=0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando há pressão, o &lt;strong&gt;kernel automaticamente&lt;/strong&gt; libera cache mesmo que seja "active"!&lt;/p&gt;

&lt;p&gt;Cgroup v2 é a segunda geração do sistema de control groups do kernel Linux, com melhorias significativas sobre o v1, atualmente o EKS do Gitlab está com Cgroup V1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cgroup v1&lt;/strong&gt; tem múltiplas hierarquias independentes (memory, cpu, io), causando inconsistências. Cgroup v2 usa uma única árvore:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feu3im3dtnt76jolslsdz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feu3im3dtnt76jolslsdz.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bom, é isso... tive a oportunidade de estudar sobre essa semana e quis compartilhar o conhecimento. &lt;/p&gt;

&lt;p&gt;Docs: &lt;a href="https://docs.gitlab.com/charts/backup-restore/" rel="noopener noreferrer"&gt;backup-restore&lt;/a&gt;&lt;br&gt;
&lt;a href="https://overcast.blog/kernel-tuning-and-optimization-for-kubernetes-a-guide-a3bdc8f7d255" rel="noopener noreferrer"&gt;Kernel Tuning and Optimization for Kubernetes: A Guide&lt;/a&gt;&lt;br&gt;
&lt;a href="https://kubernetes.io/docs/reference/node/kernel-version-requirements/" rel="noopener noreferrer"&gt;Linux Kernel Version Requirements&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>gitlab</category>
      <category>linux</category>
      <category>devops</category>
    </item>
    <item>
      <title>#DevOps para noobs - 3 Boas Práticas de Bancos de Dados para compartilhar com os Devs (AWS RDS)</title>
      <dc:creator>Camila</dc:creator>
      <pubDate>Thu, 20 Feb 2025 20:51:20 +0000</pubDate>
      <link>https://dev.to/camilacodes/devops-para-noobs-3-boas-praticas-para-bancos-de-dados-para-compartilhar-com-os-devs-aws-rds-cgo</link>
      <guid>https://dev.to/camilacodes/devops-para-noobs-3-boas-praticas-para-bancos-de-dados-para-compartilhar-com-os-devs-aws-rds-cgo</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Como evitar noites sem dormir, garantir que seu time consiga respirar durante incidentes e deixar o SRE do seu time feliz!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Conteúdo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Índices com Concorrência: Seu SRE vai te amar &amp;lt;3!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Performance Insights: O "Raio-X" das Queries Lentas&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não use o Root: A arte de não ficar refém&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Índices com Concorrência: Seu SRE vai te amar &amp;lt;3!&lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;O Problema:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Imagine criar um índice em uma tabela de 500 GB em pleno horário de pico. O banco trava, as requisições começam a falhar, e o celular do SRE vibra sem parar com alertas de downtime. Ninguém quer ser essa pessoa. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A Solução:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use &lt;strong&gt;CREATE INDEX CONCURRENTLY&lt;/strong&gt; (&lt;a href="https://www.postgresql.org/docs/current/sql-createindex.html" rel="noopener noreferrer"&gt;PostgreSQL&lt;/a&gt;) ou ferramentas como pt-online-schema-change (&lt;a href="https://docs.percona.com/percona-toolkit/pt-online-schema-change.html" rel="noopener noreferrer"&gt;MySQL&lt;/a&gt;). Isso permite criar índices sem bloquear operações de escrita.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Exemplo no PostgreSQL: o SRE continua dormindo  
CREATE INDEX CONCURRENTLY idx_pedidos_cliente ON pedidos (cliente_id);  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Performance Insights: O "Raio-X" das Queries Lentas &amp;lt;3!&lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;O Problema:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uma query mal otimizada consome 90% da CPU do banco. O time de desenvolvimento não sabe por onde começar, e o SRE fica no escuro, tentando adivinhar o culpado.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A Solução:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ative o Performance Insights no RDS. Ele mostra em tempo real:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Queries que consomem mais CPU.&lt;/li&gt;
&lt;li&gt;Eventos de espera (ex: I/O, locks).&lt;/li&gt;
&lt;li&gt;Queries com maior latência.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Como isso Ajuda o SRE?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Diagnóstico Rápido:&lt;/strong&gt; Identifique o problema em minutos, não em horas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prevenção:&lt;/strong&gt; Antecipa gargalos antes que virmem incidentes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Colaboração com Devs:&lt;/strong&gt; Mostra dados concretos facilitando melhorias em conjunto.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Não use o Root: A arte de não ficar refém&lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;O Problema:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A aplicação está usando o usuário root e, durante um pico de tráfego, a CPU chega a 100%. Agora, ninguém consegue conectar ao banco para investigar… e o caos se instala.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O RDS tem um número máximo de conexões permitidas, definido pelo parâmetro max_connections (ex: PostgreSQL) ou max_user_connections (MySQL).&lt;br&gt;
Se a aplicação já está usando todas as conexões disponíveis (ou a maioria), novas tentativas de login são bloqueadas — inclusive as do SRE. Ou seja, o usuário root é para privilégios maiores e emergências.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A Solução:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Crie um usuário dedicado para a aplicação, com permissões mínimas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Exemplo no PostgreSQL:  
CREATE USER app_user WITH PASSWORD 'senhaSuperF0rt3!';  
GRANT SELECT, INSERT ON tabela_principal TO app_user; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Como isso Ajuda o SRE?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Acesso Garantido em Crise:&lt;/strong&gt; Mesmo se a aplicação derrubar o banco, o SRE pode conectar com uma conta privilegiada para mitigar o problema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Segurança sem Sacrifício:&lt;/strong&gt; Reduza o risco de ataques e de acidentes (ex: DROP TABLE acidental por um microsserviço com privilégios demais).&lt;/p&gt;

&lt;p&gt;Essas são as dicas de hoje, são apenas 3 mas quebram MUITO o galho!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/pt/architecture/well-architected/?wa-lens-whitepapers.sort-by=item.additionalFields.sortDate&amp;amp;wa-lens-whitepapers.sort-order=desc&amp;amp;wa-guidance-whitepapers.sort-by=item.additionalFields.sortDate&amp;amp;wa-guidance-whitepapers.sort-order=desc" rel="noopener noreferrer"&gt;well-architected&lt;/a&gt;&lt;br&gt;
&lt;a href="https://sre.google/sre-book/table-of-contents/" rel="noopener noreferrer"&gt;Site Reliability Engineering (Google Livro)&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>DynamoDB: Query x Scan! Para de torrar dinheiro usando Scan em produção</title>
      <dc:creator>Camila</dc:creator>
      <pubDate>Mon, 28 Oct 2024 20:38:00 +0000</pubDate>
      <link>https://dev.to/camilacodes/dynamodb-query-x-scan-para-de-torrar-dinheiro-usando-scan-em-producao-548e</link>
      <guid>https://dev.to/camilacodes/dynamodb-query-x-scan-para-de-torrar-dinheiro-usando-scan-em-producao-548e</guid>
      <description>&lt;h3&gt;
  
  
  Como Economizei 50 mil dólares com DynamoDB!
&lt;/h3&gt;

&lt;p&gt;Eu já consegui economizar 50 mil dólares, só mudando o tipo de leitura no DynamoDB. Mas antes de explicar como eu fiz isso, vamos aos conceitos!&lt;/p&gt;

&lt;p&gt;Conteúdo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O que é um DynamoDB?&lt;/li&gt;
&lt;li&gt;Query: Procurando um Problema em um Servidor Específico&lt;/li&gt;
&lt;li&gt;Scan: Procurando Problemas em Todos os Servidores?&lt;/li&gt;
&lt;li&gt;Tipos de Leitura no DynamoDB&lt;/li&gt;
&lt;li&gt;Custo de Leitura no DynamoDB&lt;/li&gt;
&lt;li&gt;Resumo&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  O que é um DynamoDB? &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;O DynamoDB é um banco de dados NoSQL (chave-valor) da AWS. Quando você precisa buscar informações nele, existem duas maneiras principais de fazer isso: Query e Scan.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhnzfbxgk2x6acd6jjebo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhnzfbxgk2x6acd6jjebo.png" alt=" " width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagine que sua empresa está usando o DynamoDB para armazenar informações de eventos de monitoramento dos servidores. Cada evento contém um ID de servidor, um timestamp e mensagens de log.&lt;/p&gt;

&lt;h4&gt;
  
  
  Query: Procurando um Problema em um Servidor Específico &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;O que é?&lt;/strong&gt;&lt;br&gt;
O Query funciona como uma busca direcionada. Você já sabe qual servidor e qual período precisa analisar, então faz uma busca direta por esses critérios.&lt;/p&gt;

&lt;p&gt;Características:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rápido e eficiente para buscas específicas.&lt;/li&gt;
&lt;li&gt;Precisa de um ID de servidor (chave primária) e pode filtrar por timestamp (chave de classificação).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemplo de Query:&lt;/strong&gt;&lt;br&gt;
Imagine que você precisa verificar erros ocorridos no servidor ID_123 na última hora. Você faz a seguinte consulta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Servidor: ID_123
Horário: Entre 10:00 e 11:00
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O DynamoDB retorna apenas os eventos para o servidor específico no intervalo de tempo definido. Você lê apenas as linhas que interessam.&lt;/p&gt;

&lt;h4&gt;
  
  
  Scan: Procurando Problemas em Todos os Servidores &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;O que é?&lt;/strong&gt;&lt;br&gt;
O Scan é como uma varredura completa de todos os eventos. Se você quer procurar problemas gerais ou eventos de todos os servidores, precisa varrer a tabela inteira.&lt;/p&gt;

&lt;p&gt;Características:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lento e consome mais recursos, pois lê toda a tabela.&lt;/li&gt;
&lt;li&gt;Ideal para buscas gerais, onde você não tem um ID específico.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de Scan:&lt;br&gt;
Agora, imagine que você precisa buscar erros de alta gravidade em todos os servidores ocorridos nas últimas 24 horas. Como não tem um ID de servidor específico, é necessário fazer um Scan com filtro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Filtro: Gravidade do erro &amp;gt;= "Alto" e Horário &amp;gt;= "10:00 de ontem"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O DynamoDB varre todos os eventos de um em um de todos os servidores para aplicar o filtro e trazer os resultados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tipos de Leitura no DynamoDB &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;O DynamoDB cobra com base em unidades de leitura (RCU) e unidades de escrita (WCU) que você usa. Para entender os custos, é preciso conhecer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RCU&lt;/strong&gt; (Read Capacity Unit): Medida de capacidade de leitura. 1 RCU = 1 leitura eventual de até 4 KB por segundo.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Leitura Consistente:&lt;br&gt;
1 unidade de leitura é suficiente para ler até 4 KB de dados com total precisão.&lt;br&gt;
Sempre retorna dados mais recentes, bom para aplicações que não podem tolerar inconsistência.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leitura Eventual:&lt;br&gt;
1 unidade de leitura pode cobrir até 8 KB de dados, mas com uma chance de a informação estar ligeiramente desatualizada, o que consome menos RCU.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Custo de Leitura no DynamoDB &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Agora a parte legal! 🎉&lt;/p&gt;

&lt;p&gt;Obs: &lt;strong&gt;Os valores e informações a seguir são fictícios!&lt;/strong&gt; 🚨&lt;/p&gt;

&lt;p&gt;Observando o cenário da imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4g5mlha45vnoz5q67ccb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4g5mlha45vnoz5q67ccb.png" alt=" " width="800" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Cenário Atual: Scan Completo&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Quantidade de Itens na Tabela: 200.547 itens armazenados.&lt;/li&gt;
&lt;li&gt;Tamanho da Tabela: 254,1 MB (convertido para 254.100 KB).&lt;/li&gt;
&lt;li&gt;RCU (Unidade de Capacidade de Leitura): Cada unidade de leitura consegue processar 4 KB de dados.&lt;/li&gt;
&lt;li&gt;ReadRequestUnits (Solicitações de Leitura): 64.483.473.398,00, que representa a quantidade de unidades de leitura necessárias. 
OBS: A cada 1 milhão de RRU's é consumida 1 RCU.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Resultado:&lt;br&gt;
O custo total de leitura de toda a tabela foi de $15.650,87 no mês!&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Mudança para Query: Cenário Otimizado&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Antes, toda vez que a aplicação precisava consultar algo, ela consultava 100% da tabela usando Scan, percorrendo todos os itens até encontrar o que precisava.&lt;/p&gt;

&lt;p&gt;Quando mudamos para Query, o cenário mudou. Agora, veja na tabela abaixo o impacto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flys96w13bkq1rp2szuc0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flys96w13bkq1rp2szuc0.png" alt=" " width="722" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se a consulta for feita em 10% da tabela, já há uma economia de $14.085,78.&lt;br&gt;
Agora, imagine cenários em que as consultas são feitas em 1% da tabela ou até menos! É babado!&lt;/p&gt;

&lt;h4&gt;
  
  
  Resumo:&lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Query é como pedir uma lista específica de itens. Você paga apenas pelos dados que realmente lê.&lt;/p&gt;

&lt;p&gt;Scan é como vasculhar uma caixa inteira para encontrar itens específicos. Você paga por todo o conteúdo da caixa, mesmo que precise de apenas algumas coisas.&lt;/p&gt;

&lt;p&gt;Então, foi assim que consegui economizar 50 mil dólares mudando apenas a estratégia de leitura no DynamoDB! 😎&lt;/p&gt;

&lt;p&gt;E aí, o que achou?&lt;/p&gt;

</description>
      <category>aws</category>
      <category>sre</category>
      <category>braziliandevs</category>
      <category>database</category>
    </item>
    <item>
      <title>#Devops para noobs - Conhecendo Boto3 na prática</title>
      <dc:creator>Camila</dc:creator>
      <pubDate>Fri, 26 Apr 2024 23:01:08 +0000</pubDate>
      <link>https://dev.to/camilacodes/devops-para-noobs-conhecendo-boto3-na-pratica-1pd2</link>
      <guid>https://dev.to/camilacodes/devops-para-noobs-conhecendo-boto3-na-pratica-1pd2</guid>
      <description>&lt;p&gt;Ta, mas o que é o Boto3?&lt;/p&gt;

&lt;p&gt;Boto3 é a biblioteca oficial da AWS (Amazon Web Services) para Python, que permite aos desenvolvedores interagir e acessar os serviços da AWS de forma programática. &lt;/p&gt;

&lt;p&gt;É uma lib assistente que faz o trabalho de se comunicar com os serviços da AWS para você.&lt;/p&gt;

&lt;h2&gt;
  
  
  Na prática!
&lt;/h2&gt;

&lt;p&gt;Em casos raros mas não impossíveis pode acontecer de você precisar recuperar um arquivo dentro de um Pod e enviar para um S3, aqui te ensino como fazer isso com o Boto3!&lt;/p&gt;

&lt;p&gt;Bora lá! &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pré-requisitos&lt;/strong&gt;&lt;br&gt;
Antes de começar, certifique-se de que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Você tem acesso ao cluster Kubernetes onde seu Pod está implantado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Possui as credenciais de acesso válidas para interagir com o Amazon S3.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Passo 1:&lt;/strong&gt;&lt;br&gt;
Instalar o Boto3 no pod. Se não estiver instalado, você pode instalar utilizando o pip:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;pip install boto3&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Passo 2:&lt;/strong&gt;&lt;br&gt;
Importe a biblioteca do Boto3 e configure as credenciais AWS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import boto3

from botocore.exceptions import NoCredentialsError
s3 = boto3.client('s3',
                  aws_access_key_id='YOUR_ACCESS_KEY_ID',
                  aws_secret_access_key='YOUR_SECRET_ACCESS_KEY')

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Passo 3:&lt;/strong&gt;&lt;br&gt;
Defina o caminho do arquivo dentro do Pod que você deseja enviar para o S3.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;local_file = 'caminho/do/seu/arquivo.txt'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Passo 4:&lt;/strong&gt;&lt;br&gt;
Especifique o nome do bucket no Amazon S3 onde você deseja enviar o arquivo e o nome que ele terá no bucket.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
# Nome do bucket s3 de destino 
bucket = 'nome-do-seu-bucket'

# Nome do arquivo que irá para o bucket de destino
s3_file = 'nome-do-seu-arquivo.txt'

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Passo 5:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use o método upload_file para enviar o arquivo para o bucket especificado no passo 4.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;try:
    s3.upload_file(local_file, bucket, s3_file)
    print("Upload do arquivo para o Amazon S3 realizado com sucesso!")
except FileNotFoundError:
    print("Arquivo não encontrado.")
except NoCredentialsError:
    print("Credenciais AWS inválidas.")

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para mais detalhes sobre o Boto3: &lt;a href="https://boto3.amazonaws.com/v1/documentation/api/latest/index.html" rel="noopener noreferrer"&gt;Doc oficial&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por hoje é isso! beijos de luz&lt;/p&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>kubernetes</category>
      <category>python</category>
    </item>
    <item>
      <title>#DevOps para noobs - Proxy Reverso</title>
      <dc:creator>Camila</dc:creator>
      <pubDate>Sat, 17 Feb 2024 18:37:10 +0000</pubDate>
      <link>https://dev.to/camilacodes/devops-para-noobs-proxy-reverso-1lg0</link>
      <guid>https://dev.to/camilacodes/devops-para-noobs-proxy-reverso-1lg0</guid>
      <description>&lt;p&gt;Já ouviu falar de proxy reverso? Vem cá que eu vou tentar te explicar!&lt;/p&gt;

&lt;p&gt;Conteúdo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O que é Proxy?&lt;/li&gt;
&lt;li&gt;Exemplo: Proxy anônimo&lt;/li&gt;
&lt;li&gt;Proxy Reverso&lt;/li&gt;
&lt;li&gt;Exemplo: Proxy Reverso&lt;/li&gt;
&lt;li&gt;Segurança&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  O que é Proxy? &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Um proxy é como um intermediário entre o seu computador e a internet. Quando você quer acessar algo na internet, em vez de se conectar diretamente, você se conecta através do proxy, que então faz a solicitação em seu nome. Quando a resposta é recebida, o proxy a envia de volta para você.&lt;/p&gt;

&lt;p&gt;Existem diversos tipos de Proxy! &lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo: proxy anônimo &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Suponha que você queira acessar o google, mas não quer que o site saiba o seu endereço IP real. Em vez de se conectar diretamente ao site, você pode usar um proxy anônimo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5e20g6u7yddrrya6354s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5e20g6u7yddrrya6354s.png" width="800" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então, um proxy basicamente age como um "intermediário" entre você e a internet, sendo usado por razões como segurança, controle de acesso ou anonimato.&lt;/p&gt;

&lt;h3&gt;
  
  
  Proxy Reverso &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Suponha que uma empresa tenha três servidores internos, cada um hospedando um site diferente: "site1.com", "site2.com" e "site3.com". Eles configuram um servidor proxy reverso para lidar com o tráfego externo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mb5glyj2lai1rbke6j8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mb5glyj2lai1rbke6j8.png" alt=" " width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo: &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Um cliente externo tenta acessar "site1.com" digitando o endereço no navegador.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A solicitação do cliente é recebida pelo servidor proxy reverso.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O servidor proxy reverso encaminha a solicitação para o servidor interno que hospeda "site1.com".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O servidor interno processa a solicitação e envia a resposta de volta para o servidor proxy reverso.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O servidor proxy reverso recebe a resposta do servidor interno e a envia de volta para o cliente externo.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9103oqmmap419ixybyl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9103oqmmap419ixybyl.png" alt=" " width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa configuração permite que a empresa hospede vários sites em servidores internos e forneça acesso externo a eles através de um &lt;strong&gt;único ponto de entrada (o proxy reverso)&lt;/strong&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  Segurança: &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Um proxy reverso está localizado do lado do servidor diferente do proxy normal que está do lado do cliente. Isso significa que ele fica entre os servidores e a internet, protegendo os servidores internos.&lt;/p&gt;

&lt;p&gt;Além disso, o proxy reverso pode ser configurado para oferecer recursos adicionais, como balanceamento de carga, cache de conteúdo, criptografia SSL e filtragem de solicitações para melhorar a segurança e o desempenho.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusão: &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;O proxy é tipo um guardião da internet, protegendo você de sites perigosos, escondendo sua identidade online, e até mesmo driblando bloqueios de sites. Além disso, ele pode acelerar o carregamento de páginas que você visita com frequência e manter um olho nas atividades online dos funcionários em empresas. &lt;/p&gt;

&lt;p&gt;Ah, e tem também o proxy reverso, que ajuda a equilibrar o tráfego entre diferentes servidores e a manter seus sites funcionando rápido e seguro. &lt;/p&gt;

&lt;p&gt;The end.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgsv4qjf30uyx3kkzqco7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgsv4qjf30uyx3kkzqco7.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obrigada quem leu até aqui &amp;lt;3 beijos de luz&lt;/p&gt;

</description>
      <category>devops</category>
      <category>sre</category>
      <category>beginners</category>
      <category>security</category>
    </item>
    <item>
      <title>#DevOps para noobs - Requests x limits no Kubernetes</title>
      <dc:creator>Camila</dc:creator>
      <pubDate>Mon, 05 Feb 2024 23:34:53 +0000</pubDate>
      <link>https://dev.to/camilacodes/devops-diares-requests-x-limits-no-kubernetes-4355</link>
      <guid>https://dev.to/camilacodes/devops-diares-requests-x-limits-no-kubernetes-4355</guid>
      <description>&lt;p&gt;No universo do Kubernetes, é essencial não apenas implantar suas aplicações, mas também gerenciar eficientemente os recursos que elas consomem. &lt;/p&gt;

&lt;p&gt;Para isso, o Kubernetes oferece recursos como &lt;strong&gt;limits&lt;/strong&gt; (limites) e &lt;strong&gt;requests&lt;/strong&gt; (requisições), que permitem especificar tanto o mínimo quanto o máximo de recursos que uma aplicação pode utilizar. Vamos explorar esses conceitos neste artigo.&lt;/p&gt;

&lt;p&gt;O que são &lt;strong&gt;Limits&lt;/strong&gt; e &lt;strong&gt;Requests&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Em termos simples, os &lt;strong&gt;limits&lt;/strong&gt; representam a quantidade máxima de recursos, como CPU e memória, que um container pode consumir. Por outro lado, as &lt;strong&gt;requests&lt;/strong&gt; indicam a quantidade mínima de recursos que devem ser reservados para o container.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8snj4060dy0gi1c2ihh2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8snj4060dy0gi1c2ihh2.png" alt=" " width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No YAML de um Pod, podemos definir esses valores da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: images.my-company.example/app:v4
   ** resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"**

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, especificamos que nossa aplicação requer no mínimo 64 megabytes de memória e 250 milicores de CPU, enquanto o limite máximo é de 128 megabytes de memória e 500 milicores de CPU, ou seja no limit deixamos uma "brecha" caso ultrapassemos a quantidade de consumo definida no request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Por que são importantes?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ao definir esses valores, estamos dando informações valiosas ao &lt;strong&gt;Kubernetes Scheduler&lt;/strong&gt;, que utiliza esses dados para decidir em qual nó do cluster a aplicação será implantada. Isso garante que a aplicação tenha os recursos necessários para funcionar adequadamente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes Scheduler&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sua função principal é selecionar os nós (nodes) do cluster nos quais os pods serão implantados. Isso é feito com base nos requisitos de recursos dos pods, como CPU e memória.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F95j2oqxt8lrllh1bsaoz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F95j2oqxt8lrllh1bsaoz.png" alt=" " width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gerenciando Recursos Excedentes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mas e se nossa aplicação exceder os limites definidos?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Throttling (Estrangulamento):&lt;br&gt;
O Kubernetes pode limitar a quantidade de recursos disponíveis para o container, o que pode resultar em um desempenho reduzido ou mais lento para a aplicação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Termino do Container: Em situações extremas, se uma aplicação consistentemente consome mais recursos do que o especificado em seus limites, o Kubernetes pode decidir terminar ou reiniciar o container. Isso é feito para proteger a integridade do cluster e garantir que outras aplicações tenham acesso aos recursos necessários.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Estabelecer limites e requisitos adequados para suas aplicações Kubernetes é crucial para garantir um desempenho eficiente e estável do cluster. Ao entender e utilizar corretamente esses recursos, você pode maximizar a utilização dos recursos disponíveis e garantir uma operação tranquila das suas aplicações no Kubernetes.&lt;/p&gt;

&lt;p&gt;Referências:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://itnext.io/memory-requests-and-limits-in-kubernetes-1c9cd573b3ab" rel="noopener noreferrer"&gt;Memory, requests and limits in Kubernetes&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/pt-br/docs/concepts/configuration/manage-resources-containers/" rel="noopener noreferrer"&gt;Documentação do Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>devops</category>
      <category>sre</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Dicas que usei para conseguir o primeiro emprego em T.I!</title>
      <dc:creator>Camila</dc:creator>
      <pubDate>Mon, 17 Oct 2022 17:44:36 +0000</pubDate>
      <link>https://dev.to/camilacodes/dicas-que-usei-para-conseguir-o-primeiro-emprego-em-ti-3i0o</link>
      <guid>https://dev.to/camilacodes/dicas-que-usei-para-conseguir-o-primeiro-emprego-em-ti-3i0o</guid>
      <description>&lt;p&gt;Oie! Eu sou a Camila, sou trainee SRE/DevOps e trabalho na área da tecnologia há dois anos! O meu grande aliado no primeiro emprego foi o Linkedin, então fique aqui para entender como a plataforma me ajudou no meu primeiro emprego e no atual!&lt;/p&gt;

&lt;p&gt;1 - Coloque os cursos que você está estudando, poste certificados, projetos finalizados etc! isso é o básico, você precisa ser visto!&lt;/p&gt;

&lt;p&gt;2 - Palavras-Chaves: Recrutadores estão muito ocupados tentando preencher vagas e não vão ler textões, eles querem ir direto ao ponto!&lt;/p&gt;

&lt;p&gt;No seu perfil você precisa colocar a stack que está estudando ou atuando, mas lembre-se das palavras-chaves!&lt;/p&gt;

&lt;p&gt;Alguns exemplos:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi7xp0lq5562jduz1z9lf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi7xp0lq5562jduz1z9lf.png" alt=" " width="283" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2j65xk5yk5nomlqgotop.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2j65xk5yk5nomlqgotop.png" alt=" " width="497" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3 - Bio: Resuma! Qual stack você estuda? Quais projetos e skills você possui? Exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk0yc7gxc79w1vo2fv5eu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk0yc7gxc79w1vo2fv5eu.png" alt=" " width="800" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4 - Networking! Você precisa adicionar pessoas, Tech recruiters, influencers da área, lembrem-se você precisa ser visto ou seja, entra em contato com pessoas da área, você quer entrar em alguma empresa? Já pensou em entrar em contato com funcionários dessa empresa pra pedir dicas de processo seletivo ou como se preparar? Existem muitas pessoas dispostas a te ajudar! Eu juro!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F96ejshc26cob5gyaz853.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F96ejshc26cob5gyaz853.png" alt=" " width="268" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eu tenho mais de +500 pessoas adicionadas, eu conheço tudo isso? Não! mas adicionar tech recruiters, pessoas da área ajudou e ajuda meu perfil a ter mais visibilidade!&lt;/p&gt;

&lt;p&gt;5 - Currículo: Tenha um currículo! Aí meu deus mas não tenho experiência o que eu coloco? O que você estuda, seus projetos, github!!!!!&lt;br&gt;
Meu primeiro currículo em T.I:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzyhrzkknx952u0nojxtc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzyhrzkknx952u0nojxtc.png" alt=" " width="530" height="749"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como eu consegui meu primeiro estágio com esse currículo? NETWORKINNNNNNNG!&lt;br&gt;
SIM! Eu postei esse currículo no linkedin com a legenda descrevendo que eu estava a procura de uma primeira oportunidade e sabe o que aconteceu? Uma moça X que tinha bastante visibilidade no linkedin com conteúdos tech compartilhou, fazendo chegar em diversos perfis! Na mesma semana 3 empresas entraram em contato comigo e consegui meu primeiro estágio!&lt;/p&gt;

&lt;p&gt;Linkedin Premium para estudantes: &lt;a href="https://members.linkedin.com/pt-br/estudante/linkedin-premium" rel="noopener noreferrer"&gt;aqui!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Links de artigos maneiros que podem te ajudar no seu processo inicial no mercado de T.I: &lt;br&gt;
&lt;a href="https://www.programaria.org/category/programaria-sprint-processos-seletivos-tech/" rel="noopener noreferrer"&gt;Programaria: Processos Seletivos&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.programaria.org/category/sprint-programaria-comunicacao-e-autoconfianca/" rel="noopener noreferrer"&gt;Programaria: Comunicação&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Participe da &lt;a href="https://heartdevs.com/" rel="noopener noreferrer"&gt;He4rt&lt;/a&gt;! Comunidade gigante, com pessoas incríveis e muito conteúdo para te ajudar a entrar no mercado e aprender conteúdos tech!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
