83 lines
2.9 KiB
Markdown
83 lines
2.9 KiB
Markdown
# MANUAL TÉCNICO - TUNING E PERFORMANCE DE BANCOS DE DADOS
|
|
|
|
**Código:** ITGENG 0020/26 | **Classificação:** CONFIDENCIAL
|
|
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
|
|
|
|
## 1. HISTÓRICO DE REVISÃO
|
|
|
|
| Data | Versão | Descrição | Autor |
|
|
| :--- | :--- | :--- | :--- |
|
|
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
|
|
|
|
## 2. OBJETIVO
|
|
Guiar a identificação de gargalos (Slow Queries) e aplicar otimizações seguras (Universais) e agressivas (Tailored) para PostgreSQL, MySQL e Redis.
|
|
|
|
---
|
|
|
|
## 3. PREPARAÇÃO PROATIVA (MONITORAMENTO)
|
|
|
|
Não espere o problema acontecer. Ative isso AGORA.
|
|
|
|
1. **MySQL Slow Query Log:**
|
|
* No `my.cnf`: `slow_query_log = 1`, `long_query_time = 2` (segundos).
|
|
2. **Postgres pg_stat_statements:**
|
|
* Instale a extensão: `CREATE EXTENSION pg_stat_statements;`
|
|
* Veja as queries mais lentas: `SELECT * FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 5;`
|
|
3. **Redis Latency Monitor:**
|
|
* Config: `CONFIG SET latency-monitor-threshold 100` (ms).
|
|
|
|
---
|
|
|
|
## 4. OTIMIZAÇÕES UNIVERSAIS (SEGURO PARA TODOS)
|
|
|
|
Alterações de Sistema Operacional (Linux) que beneficiam qualquer DB.
|
|
|
|
### 1. Swappiness (Evitar Swap)
|
|
Bancos de dados odeiam Swap. O padrão do Linux (60) é ruim.
|
|
* **Ação:** Mude para 1 ou 10.
|
|
* Arquivo `/etc/sysctl.conf`:
|
|
```ini
|
|
vm.swappiness = 10
|
|
```
|
|
|
|
### 2. Transparent Huge Pages (THP) - DESATIVAR
|
|
O THP causa picos de lag no Redis e MongoDB.
|
|
* **Ação:** Desative no boot (varie conforme distro, geralmente via GRUB ou Systemd service).
|
|
* Verifique: `cat /sys/kernel/mm/transparent_hugepage/enabled` (Deve estar `[never]`).
|
|
|
|
---
|
|
|
|
## 5. TUNING TAILORED (CENÁRIOS ESPECÍFICOS)
|
|
|
|
### Cenário A: Hardware com MUITA RAM (Cache Heavy)
|
|
O objetivo é manter o [Working Set] na RAM.
|
|
|
|
* **Postgres (`shared_buffers`):** Defina como 25% a 40% da RAM Total.
|
|
* **MySQL (`innodb_buffer_pool_size`):** Defina como 70-80% da RAM Total (Se o servidor for dedicado apenas ao DB).
|
|
|
|
### Cenário B: Aplicação Write-Heavy (Muita Escrita)
|
|
O gargalo é o disco (I/O).
|
|
|
|
* **Postgres:** Aumente `max_wal_size` (ex: 4GB) para reduzir checkpoints frequentes.
|
|
* **Redis:** Evite `AOF everysec` se puder tolerar perda de 1s. Use persistência mista (RDB + AOF).
|
|
|
|
---
|
|
|
|
## 6. DIAGNÓSTICO DE QUERIES (EXPLAIN)
|
|
|
|
O desenvolvedor diz que "o banco está lento". Prove que é a query.
|
|
|
|
1. Pegue a query lenta no log.
|
|
2. Rode com `EXPLAIN` (MySQL) ou `EXPLAIN ANALYZE` (Postgres).
|
|
```sql
|
|
EXPLAIN ANALYZE SELECT * FROM pedidos WHERE data < '2023-01-01';
|
|
```
|
|
3. **Analise:**
|
|
* **Seq Scan:** Leu a tabela inteira do inicio ao fim. **RUIM**. Falta índice.
|
|
* **Index Scan:** Usou o índice. **BOM**.
|
|
|
|
## 7. VALIDAÇÃO FINAL
|
|
- [ ] O Swappiness está baixo (1-10)?
|
|
- [ ] Slow Query Log está capturando consultas lentas?
|
|
- [ ] Índices foram criados para eliminar "Seq Scans" críticos?
|