Teu progresso
0 / 83 módulos0%
Estágio 03 · 03-10
Bloqueado"O backend está lento" raramente significa "Node é lento". Significa: query sem índice, conexão saturada, JSON encode em loop, GC com pauses, event loop bloqueado por sync I/O, cache hit rate de 12%, lock no DB. Sem método, otimização vira chute. Time gasta semana otimizando função que custava 3% do tempo real.
Este módulo é perf backend com método: USE method, profiling em produção, GC, event loop, conexões, query tuning, caching tiers, batching, async patterns, load shedding. Você sai sabendo medir, identificar o gargalo verdadeiro, e otimizar com prioridade.
USE: Utilization, Saturation, Errors em cada recurso (CPU, mem, network, disk, DB conn pool, Redis, queue depth). RED em cada serviço.
Ordem:
Anti-padrão: otimizar baseado em intuição. Você quase sempre escolhe errado o gargalo.
node --prof: V8 sampling profiler. Output em isolate-*.log. Process com node --prof-process.0x: flame graph com 1 comando.clinic.js (Doctor, Flame, Bubbleprof): suite focada Node.--cpu-prof: V8 CPU profile (V8 inspector format, abre em DevTools).--heap-prof / heap snapshot via --inspect: memory.--inspect em prod (cuidado).Padrão: clinic doctor primeiro pra ver onde o gargalo é (event loop? GC? I/O?), depois ferramenta específica.
monitorEventLoopDelay (perf_hooks) ou event-loop-lag lib mede atraso. Se p99 > 100ms, algo bloqueia loop.
Causas comuns:
fs.readFileSync).Mitigação:
setImmediate pra ceder controle entre batches.V8 GC:
Sintomas de problemas:
Mitigações:
--max-old-space-size), última opção.Postgres: pg.Pool({ max: N }). Cada cliente é processo no DB. N grande mata DB; N pequeno serializa requests.
Heurística: começar max = number_of_cpus * 2 no DB, dividido por instâncias do app. Ajustar baseado em métricas.
Indicadores:
pg_stat_activity mostrando muitos idle in transaction.pool.waitingClients > 0).PgBouncer/Supavisor reduzem pressão. Em serverless, quase obrigatório.
Redis: ioredis pool implícito; pra alto throughput, múltiplas instances.
HTTP outbound: agent com keepAlive: true reusa conexões. Default node sem keep-alive é desastre em microservices.
Cobrimos em 02-09. Recap operacional:
pg_stat_statements top 10 por total time.random_page_cost pra SSD (~1.1).work_mem suficiente pra sort/hash em queries de relatório.Hierarquia:
Multi-tier: process L1 + Redis L2. Invalidate cuidadoso.
Em vez de N queries pequenas, faça 1 query maior:
INSERT ... VALUES (...), (...), (...) ou COPY.Em sistemas com webhook ou message queue, batch processing reduz overhead.
API que carrega 1M rows e responde JSON gigante:
Streaming:
Memória estável; latência início baixa.
Sistema saturado deve degradar graciosamente:
Sem load shedding: sistema para totalmente em saturação.
Node libuv usa epoll/kqueue/IOCP pra rede. Sócket scaleável até dezenas de milhares por processo. Limites:
ulimit -n).Com keep-alive e HTTP/2 multiplexing, throughput per connection cresce.
Content-Encoding: gzip reduz payload mas custa CPU. Em payloads JSON grandes, ganho de banda > custo CPU em maioria. Brotli melhor que gzip mas mais caro encoding.
fast-json-stringify (Fastify default) compila stringifier baseado em schema; 2-5x mais rápido que JSON.stringify.
Em backend, async é default. Mas há casos onde sync vence:
crypto.randomUUID).Não force async em sync curto; libuv overhead pode comer ganho.
benchmark.js, mitata, tinybench rodam funções e comparam. Cuidado com:
Use pra validar otimização local; sempre confirme em load test integrado.
Em serverless (Lambda, Cloud Run gen2):
Pra Logística: cold start não é crítico em web traffic constante. Em endpoints raros (webhooks), pode ser.
Node é coberto acima. Se você opera stack mixed ou migra de Node, vale entender perf characteristics dos runtimes vizinhos.
JVM (Java/Kotlin/Scala)
-XX:+TieredCompilation + warmup tests, ou GraalVM Native Image pra binário sem JVM).-Xmx), GC algoritmo, -XX:MaxGCPauseMillis, region size em G1. JFR (Java Flight Recorder) + Mission Control ou Async Profiler pra investigação..NET (C#)
dotnet publish -p:PublishAot=true em .NET 8+. Single binary, startup instantâneo. Compatível com subset de APIs.<ServerGarbageCollection>true</ServerGarbageCollection>. Background GC reduz pausas.ArrayPool<T>.Shared.Rent() pra reduzir alloc em hot path. Idiomático em código perf-sensitive.Go
go build -gcflags='-m' mostra decisões. Otimização: evitar variáveis que escapam pro heap em hot path.go tool pprof (CPU, heap, goroutine, block, mutex). continuous profiling com Pyroscope/Parca.-race detector em CI: detecta data races, custo de runtime ~5-10x mas pega bugs caros.sync.Pool pra objetos reusáveis (reduz GC pressure).make([]T, 0, expectedLen)).interface{} em hot path (causa boxing).bytes.Buffer em vez de string concatenação.Comparação cross-runtime (typical web service workload):
| Runtime | Cold start | Steady-state throughput | Memory overhead | Latency p99 ajustado |
|---|---|---|---|---|
| Go | <100ms | Alto | Baixo (~30-100MB) | Excelente |
| .NET 8+ AOT | <100ms | Alto | Médio | Muito bom |
| .NET JIT | 1-3s | Alto | Médio | Bom (após warmup) |
| Java GraalVM Native | <100ms | Médio-alto | Baixo | Bom |
| Java JVM (HotSpot) | 5-15s | Alto | Alto (~200MB+) | Bom (após warmup) |
| Node | 50-200ms | Médio (single-thread) | Baixo | Bom (ev loop) |
| Bun | 5-20ms | Médio-alto | Baixo | Bom |
| Python | 100-500ms | Baixo (GIL) | Médio | Mediano |
Heurísticas pragmáticas:
CDN não é "cache de estáticos". É plano de execução distribuído: cache key, edge compute, format negotiation, tag invalidation, origin shield. Domine os trade-offs ou pague egress + latência.
Decision matrix CDN 2026 (preços snapshot maio/2026, sempre confira)
| Provider | Pontos fortes | Egress (US) | Edge runtime | Use case primário |
|---|---|---|---|---|
| Cloudflare | 300+ PoPs, free tier 1TB/mês, ecossistema (Workers/R2/KV/D1) | $0.015/GB Workers; egress $0 (R2) | Workers (V8 isolates, no cold start, 50ms CPU/req) | Startup pricing, edge compute pesado |
| Vercel Edge Network | Next.js/ISR/PPR built-in, DX | $0.40/GB edge requests | Edge Runtime (V8 isolates, Middleware) | Next.js apps, time-to-market |
| Fastly | Instant purge < 150ms global, granular control | $0.12/GB | Compute@Edge (Wasm, permissive) | Media-heavy, real-time invalidation |
| AWS CloudFront | AWS-native (S3/Lambda@Edge/Origin Shield) | $0.085/GB (free tier 1TB/mês) | Lambda@Edge (Node/Python, slower cold) | Stack já em AWS |
| Bunny CDN | Cheap challenger, simples | $0.005-0.01/GB | Edge Scripting (limited) | Budget-sensitive, static-heavy |
| Akamai | Enterprise, deep customization | $$$ negociado | EdgeWorkers | Enterprise legacy |
Cache key composition — default URL path + query string. Pegadinhas:
utm_source, fbclid, gclid) inflam cache (mesmo content em N keys → hit ratio cai).Vary: User-Agent explode cardinality (cada UA é uma key). Use só Vary: Accept-Encoding e Vary: Accept (image format).anon, auth_basic, auth_premium) via Worker; use bucket no cache key.// Cloudflare Worker — normalize cache key, bucketize cookies
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
// Strip tracking params
['utm_source','utm_medium','utm_campaign','fbclid','gclid'].forEach(p => url.searchParams.delete(p));
// Cookie bucketization
const cookie = request.headers.get('Cookie') || '';
const bucket = cookie.includes('session=') ? (cookie.includes('plan=premium') ? 'auth_premium' : 'auth_basic') : 'anon';
const cacheKey = new Request(`${url.toString()}#${bucket}`, request);
const cache = caches.default;
let response = await cache.match(cacheKey);
if (!response) {
response = await fetch(request);
response = new Response(response.body, response);
response.headers.set('Cache-Control', 'public, s-maxage=60, stale-while-revalidate=300');
ctx.waitUntil(cache.put(cacheKey, response.clone()));
}
return response;
}
}
Cache TTL strategy (RFC 7234 + RFC 5861)
# Static assets versioned (hash no filename)
Cache-Control: public, max-age=31536000, immutable
# HTML SSR dinâmico
Cache-Control: public, max-age=0, s-maxage=60, stale-while-revalidate=300, stale-if-error=86400
# API GET por tenant
Cache-Control: public, max-age=0, s-maxage=30, stale-while-revalidate=120
Cache-Tag: tenant-123, orders, list
# Response personalizada (NÃO cachear)
Cache-Control: private, no-store
stale-while-revalidate (RFC 5861): serve stale instant + revalida background. Ganho de perceived perf gigante, especialmente em p99. Pegadinha: private impede CDN cache; no-cache força revalidação (origin recebe request) — só use quando estritamente necessário.
Tag-based invalidation — purge surgical, não full-CDN:
# Cloudflare Cache Tags (Enterprise) — purge tudo com tag tenant-123
curl -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE/purge_cache" \
-H "Authorization: Bearer $CF_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tags":["tenant-123","orders"]}'
# Propagação global < 200ms
// Next.js (Vercel) revalidateTag
import { revalidateTag } from 'next/cache';
// Server Action: lojista deleta order → invalida cache de listagens
export async function deleteOrder(id: string) {
await db.order.delete({ where: { id } });
revalidateTag(`tenant-${tenantId}`);
revalidateTag('orders');
}
// fetch tagged
const orders = await fetch(`/api/orders`, { next: { tags: [`tenant-${tenantId}`, 'orders'] } });
Pattern Logística: tag tenant-<id> em todo response GET; mutation purga tag → cache global invalidado em < 200ms.
Edge transformations (compute em edge, não em origin)
| Runtime | Limite CPU/req | Cold start | Use case |
|---|---|---|---|
| Cloudflare Workers (2024+) | 50ms (free) / 30s (paid) | None (V8 isolates) | Header rewrite, A/B, geo routing, SSR personalization |
| Vercel Edge Runtime | 25s | None | Next.js Middleware, redirect/rewrite |
| Fastly Compute@Edge | 50s | ~5ms | Heavy transforms (Wasm) |
| Lambda@Edge | 5s viewer / 30s origin | 100-500ms | Full Lambda, Python/Node |
// Cloudflare Worker — tenant routing por geo (Logística)
export default {
async fetch(request, env) {
const country = request.headers.get('CF-IPCountry'); // 'BR', 'AR', ...
const subdomain = new URL(request.url).hostname.split('.')[0];
const backend = country === 'BR' ? `https://br.${env.ORIGIN}` : `https://intl.${env.ORIGIN}`;
const url = new URL(request.url);
url.hostname = new URL(backend).hostname;
return fetch(url.toString(), { ...request, headers: { ...request.headers, 'X-Tenant': subdomain } });
}
}
Image optimization 2026 — AVIF é Baseline 2024 (Chrome/Firefox/Safari 16+); 30-50% smaller que WebP em equal quality. Decode levemente mais lento em devices old, irrelevante em hardware 2024+.
# Format negotiation: edge serve AVIF se browser supports
GET /img/proof.jpg HTTP/2
Accept: image/avif,image/webp,image/*
# Response edge:
Content-Type: image/avif
Vary: Accept
Cache-Control: public, max-age=31536000, immutable
# Imgproxy self-hosted (open-source, $0 license, runtime só Docker)
# URL signature: <signature>/<processing>/<encoded_source>
https://img.logistica.example.com/insecure/rs:fit:400:0/q:70/f:avif/plain/s3://bucket/proof.jpg
# 4MB JPEG → ~25KB AVIF, 400px wide, q=70
| Solução | Custo 2026 | Quando usar |
|---|---|---|
| Cloudflare Images | $5/100k stored + $1/100k delivered | Stack Cloudflare, low ops |
Vercel Image Optimization (next/image) | $5/1k optimizations (alguns tiers) | Next.js, tráfego baixo-médio |
| Imgproxy self-host | $0 license + container | High volume, controle total |
| AWS CloudFront + Lambda@Edge + Sharp | egress + Lambda cost | Stack AWS |
Pattern Logística: courier upload "delivery proof photo" 4MB → S3 → Imgproxy serve 400px wide, AVIF, q=70 (~25KB) pra dashboard lojista; CDN cacheia output 1 ano (URL versionada por hash).
Origin shield + tiered caching — regional cache antes de origin reduz origin RPS 80%+ e latência cross-region.
Brotli vs gzip vs zstd
.br pre-compressed.zstd): comparable Brotli ratio com 2-3x faster compression. Use pra dynamic content high-volume.Accept-Encoding: zstd, br, gzip
Content-Encoding: zstd
Vary: Accept-Encoding
Logística applied stack
/_next/static/* 1 year immutable, HTML SSR s-maxage=60, swr=300, API GET tagged por tenant, Workers pra geo routing + cookie bucketization.Anti-patterns observados
Cache-Control: no-cache em todas responses (defeats CDN, origin recebe 100% load).Vary: User-Agent (cardinality explode, hit ratio < 5%).utm_*/fbclid/gclid no cache key (mesmo content em N keys).Set-Cookie em response cacheável (CDN não cacheia ou cacheia errado e vaza cookie).private directive em response que NÃO é personalizado (perde cache CDN gratuito).s-maxage=0 em API GET cacheável (CDN não cacheia, perde stale-while-revalidate).Cruza com 02-05 (Next.js, ISR + revalidateTag), 03-05 (AWS, CloudFront + Lambda@Edge + Origin Shield), 03-09 (frontend perf, image LCP + format negotiation), 04-09 (scaling, CDN absorve fan-out leitura), 02-08 (backend frameworks, headers Cache-Control corretos no app).
Performance backend de 2020 a 2026 mudou de patamar no kernel Linux. Três vetores convergiram: eBPF virou observability primária em produção (kprobe/uprobe/tracepoint sem recompilar kernel, overhead < 1%), io_uring substituindo epoll em workloads de alta concorrência (completion-based, batch syscalls, zero-copy via buffer rings), e allocators modernos (mimalloc, jemalloc) trocando glibc malloc em runtimes managed. Kernel tuning deixou de ser exótico: cgroups v2 + PSI viraram default em K8s 1.30+, BBR substituiu CUBIC como congestion control padrão em cloud, e NUMA awareness importa em bare metal multi-socket que o cloud expõe cada vez mais. Linux 6.6 LTS (Q4 2023) e 6.12 LTS (Q4 2024 — major io_uring improvements) consolidaram o stack; Linux 6.13 mainline (Q1 2026) trouxe BPF scheduler (sched_ext) GA. Quem opera backend high-throughput em 2026 e ignora essa camada paga 2-3x em hardware pra mascarar inefficiency que o kernel resolve.
eBPF como observability primária. eBPF executa programs verificados no kernel em hooks: kprobe (kernel function entry), uprobe (userspace function entry — incluindo Node, JVM, Python), tracepoint (estável, ABI-stable), perf event, XDP (network fast path). libbpf + CO-RE (Compile Once Run Everywhere) significa que o BPF program compilado em um kernel roda em outros via BTF (BPF Type Format) relocation — fim do "compile per kernel version" que matava produção. bpftrace 0.21+ é a awk-do-kernel: one-liners ad-hoc para investigar latency spike sem deploy:
# latency p99 de syscall openat por processo
bpftrace -e 'tracepoint:syscalls:sys_enter_openat { @start[tid] = nsecs; }
tracepoint:syscalls:sys_exit_openat /@start[tid]/ {
@lat[comm] = hist(nsecs - @start[tid]); delete(@start[tid]); }'
# off-CPU profiling — onde threads bloqueiam (mutex, I/O)
bpftrace -e 'kprobe:finish_task_switch { @[kstack] = count(); }'
Pixie (CNCF graduated Q4 2023) auto-instrumenta K8s clusters via eBPF — instala como DaemonSet, captura HTTP/gRPC/MySQL/Postgres/Redis traffic sem code change, sem sidecar, sem mudar deployment. Service maps, latency histograms, request bodies — tudo do kernel. Cilium Hubble faz o mesmo para service mesh (L3/4/7 flow visibility via eBPF, sem Envoy sidecar overhead). Tetragon (Isovalent, GA Q4 2023) captura security events (process exec, file access, network) com policy enforcement via eBPF. Falco migrou plugin model para eBPF como driver default. Stack de profiling continuous: Parca ou Pyroscope (agora Grafana) usam eBPF para coletar stack traces de todos processos sem instrumentation:
// libbpf-bootstrap-style: trace tcp_connect latency
SEC("kprobe/tcp_connect")
int BPF_KPROBE(tcp_connect_entry, struct sock *sk) {
u64 ts = bpf_ktime_get_ns();
u32 tid = bpf_get_current_pid_tgid();
bpf_map_update_elem(&start, &tid, &ts, BPF_ANY);
return 0;
}
SEC("kretprobe/tcp_connect")
int BPF_KRETPROBE(tcp_connect_exit, int ret) {
u32 tid = bpf_get_current_pid_tgid();
u64 *tsp = bpf_map_lookup_elem(&start, &tid);
if (!tsp) return 0;
u64 lat = bpf_ktime_get_ns() - *tsp;
bpf_map_delete_elem(&start, &tid);
/* emit lat to perf buffer */
return 0;
}
io_uring — I/O kernel-bypass-style. Modelo epoll é readiness: kernel avisa "fd pronto", userspace faz read()/write() — N syscalls por op. io_uring (stable 5.1, production-ready 5.10+, hardened 6.x) é completion-based: userspace empurra sqe (submission queue entry) num ring shared com kernel, kernel processa async, devolve cqe (completion queue entry) — 1 syscall (io_uring_enter) processa batch de Ns. Buffer rings (5.19+) registram buffers pre-alocados — zero-copy real. Throughput mensurado: 30-50% acima de epoll em high-conn workloads (proxies, DBs), latência p99 menor por amortizar context switch. Node.js 22 (Q4 2024) trouxe libuv com io_uring backend opt-in (UV_USE_IO_URING=1), Tokio (Rust) tem feature flag, ScyllaDB e PostgreSQL 17 adotaram nativamente. Pré-5.10 acumulou CVEs (sandboxing fraco) — Google e Android baniram em workloads sensíveis até 6.x. Em 2026, default seguro:
struct io_uring ring;
io_uring_queue_init(256, &ring, 0);
struct io_uring_sqe *sqe = io_uring_get_sqe(&ring);
io_uring_prep_read(sqe, fd, buf, len, offset);
io_uring_submit(&ring);
struct io_uring_cqe *cqe;
io_uring_wait_cqe(&ring, &cqe);
/* cqe->res = bytes lidos */
io_uring_cqe_seen(&ring, cqe);
NUMA awareness. Servers multi-socket (2+ CPUs físicas) particionam memória por node. Acesso cross-node custa 2-5x latência vs local. Cloud expõe NUMA cada vez mais em bare metal (AWS metal, GCP C3, Azure HBv4). numactl --hardware mostra topology; numactl --cpunodebind=0 --membind=0 ./worker força afinidade. K8s 1.28+ tem Topology Manager com policy single-numa-node para garantir pod inteiro num node. Cloud VMs às vezes escondem topology (vNUMA), o que quebra otimização — testar com lscpu e numastat. Anti-pattern: assumir uniform memory em bare metal de 2 sockets — workloads JVM/Postgres ganham 15-30% throughput com pinning correto.
# pin worker em NUMA node 0 (CPUs 0-31, memória local)
numactl --cpunodebind=0 --membind=0 java -jar app.jar
# verificar que páginas estão no node certo
numastat -p $(pgrep java)
Modern allocators. glibc malloc (ptmalloc2) cria N arenas por thread → fragmentation explode em containers Java/Python/Node com muitos threads. Fix barato: MALLOC_ARENA_MAX=2 corta RSS 30-50% em workloads Java em K8s sem perda de throughput. Upgrade real: mimalloc (Microsoft, 2.x em 2024) ou jemalloc 5.3+ via LD_PRELOAD — 10-20% mais rápido que glibc em Node, redução de fragmentation, sem mudar código:
# trocar allocator sem rebuild
LD_PRELOAD=/usr/lib/libmimalloc.so.2 node server.js
LD_PRELOAD=/usr/lib/libjemalloc.so.2 java -jar app.jar
# em Dockerfile:
ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2
ENV MALLOC_ARENA_MAX=2
Redis e ScyllaDB linkam jemalloc por default. Cuidado com workloads que têm custom allocator (V8 isolates, ClickHouse) — LD_PRELOAD pode conflitar.
cgroups v2 + PSI (Pressure Stall Information). cgroups v2 (single hierarchy, default em K8s 1.25+, mandatory 1.32+) trouxe memory.high (soft limit — kernel reclaim agressivo antes de OOM) e memory.max (hard, OOM killer). PSI expõe /proc/pressure/{cpu,memory,io} com fração de tempo em pressure — sinal direto para autoscaler. K8s 1.28+ suporta PSI-based HPA via custom metrics — escalar antes de OOMKill, não depois. Pod spec:
spec:
containers:
- name: app
resources:
limits: { memory: "1Gi" }
requests: { memory: "512Mi" }
# K8s 1.28+ memoryQoS feature gate → seta memory.high = requests
BBR congestion control. CUBIC (default histórico) usa loss como sinal — em cloud com bufferbloat e WAN longa, encolhe janela à toa. BBR (Google) modela bandwidth × RTT, mantém pipe cheio sem encher buffer. Ganho típico em uploads long-fat-network: 2-25x throughput, latência menor sob carga. Default em GCP, AWS adotou em ALB/NLB. Sysctl:
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p
Cuidado: em links internos low-latency (data center fabric), BBR pode regredir vs CUBIC — testar antes de aplicar global.
Off-CPU profiling. perf top + flamegraphs (Brendan Gregg) mostram on-CPU — onde threads queimam ciclos. Mas latência alta frequentemente é off-CPU: thread bloqueado em mutex, I/O, lock. eBPF resolve via offcputime (bcc tool) — captura stack quando thread sai de runqueue, mostra exatamente onde dorme. Diferencial em diagnose de tail latency.
Stack Logística aplicada. API Node em K8s: mimalloc via LD_PRELOAD no Dockerfile, MALLOC_ARENA_MAX=2, BBR no node, cgroups v2 com memory.high, Pixie DaemonSet auto-instrumentando HTTP/Postgres/Redis sem mudar código. Workers Java em fila: jemalloc + numactl pinning + io_uring se driver suportar. Ad-hoc latency investigation: bpftrace one-liner em vez de adicionar log + redeploy. HPA usando PSI memory pressure como sinal além de CPU. Pyroscope/Parca rodando continuous profiling via eBPF — flamegraph histórico de produção sem agente intrusivo.
10 anti-patterns:
libbpf + BTF.bpftrace em prod sem rate limit ou TTL — map cresce indefinidamente, kernel memory explode.io_uring assumido seguro pré-5.10 — CVEs 2020-2022 em sandbox; exigir kernel 6.x+ em workloads multi-tenant.mimalloc LD_PRELOAD em workload com custom allocator (V8 isolates, ClickHouse) — conflict, crash ou degradation silenciosa.MALLOC_ARENA_MAX default em containers Java/Python multi-thread — RSS 2-3x esperado, OOMKill por fragmentation.isolcpus no boot do kernel — scheduler ainda agenda outros processes no core "isolado", interferência.Cruza com 03-10 §2.2 (Node profiling foundation), §2.3 (event loop lag), §2.5 (connections), §2.13 (async I/O), §2.16 (microbenchmarks), §2.17 (cold start), §2.19 (outros runtimes JVM/.NET/Go), 02-07 §2.18 (event loop blocking + worker_threads — eBPF complementar), 02-07 §2.20 (Node 24 features), 03-07 §2.16 (eBPF observability intro), 03-07 §2.21 (OTel + continuous profiling — Pyroscope/Parca complementam Pixie), 03-03 §2.23 (K8s 1.32 cgroups v2 + PSI), 04-09 (scaling — io_uring throughput).
Você precisa, sem consultar:
Profiling e tuning sistemático de Logística v1 sob carga.
pg_stat_statements durante load: top 10 queries por total time.WHERE id IN (...)) em vez de loop.Threshold de Maestria
Acerte todas as 5 pra marcar o módulo como concluído. Sem pressa, sem timer. Tudo fica salvo no teu navegador.
Q1Qual é a ordem correta do método de otimização de performance backend?
Q2Por que usar `time.After(30 * time.Second)` dentro de um select em loop é antipattern em Go?
Q3Qual é a diferença chave entre `epoll` e `io_uring` no kernel Linux?
Q4Em CDN, por que usar Vary: User-Agent é um anti-pattern?
Q5Qual problema o pattern Probabilistic Early Expiration resolve em caching?
Destrava
03-10 é prereq dos seguintes módulos: