Práticas recomendadas de desempenho

Use essas informações para aplicar as práticas recomendadas à sua implementação do Databases for MongoDB em execução no IBM Cloud.

Fluxograma de solução de problemas de desempenho

Use o fluxograma para determinar como solucionar problemas de desempenho e as etapas a seguir.

┌─────────────────────────────────┐
│   Performance issue detected    │
└────────────┬────────────────────┘
             │
             ▼
┌─────────────────────────────────┐
│  Check IBM Cloud Monitoring     │
│  - CPU > 80%?                   │
│  - Memory > 80%?                │
│  - Disk latency high?           │
└────────────┬────────────────────┘
             │
        ┌────┴────┐
        │  YES    │
        ▼         │
┌──────────────┐  │
│ Scale        │  │
│ resources    │  │
└──────────────┘  │
                  │ NO
                  ▼
        ┌─────────────────────┐
        │ Check slow queries  │
        │ db.system.profile   │
        └─────────┬───────────┘
                  │
             ┌────┴────┐
             │  Found? │
             ▼         │
        ┌─────────┐    │
        │ Optimize│    │
        │ queries │    │
        │ & indexes│   │
        └─────────┘    │
                       │ NO
                       ▼
              ┌────────────────┐
              │ Check Locks    │
              │ currentOp()    │
              └────────┬───────┘
                       │
                  ┌────┴────┐
                  │ Locked? │
                  ▼         │
             ┌─────────┐    │
             │ Kill or │    │
             │ optimize│    │
             └─────────┘    │
                            │ NO
                            ▼
                   ┌────────────────┐
                   │ Check cache    │
                   │ hit ratio      │
                   └────────┬───────┘
                            │
                       ┌────┴────┐
                       │ < 95%?  │
                       ▼         │
                  ┌─────────┐    │
                  │ Scale   │    │
                  │ memory  │    │
                  └─────────┘    │
                                 │ NO
                                 ▼
                        ┌────────────────┐
                        │ Check          │
                        │ replication    │
                        └────────┬───────┘
                                 │
                            ┌────┴────┐
                            │ Lagging?│
                            ▼         │
                       ┌─────────┐    │
                       │ Scale   │    │
                       │ or fix  │    │
                       └─────────┘    │
                                      │ NO
                                      ▼
                             ┌────────────────┐
                             │ Contact IBM    │
                             │ Support        │
                             └────────────────┘

Antipadrões comuns

Evite esses erros comuns que levam a problemas de desempenho.

Antipadrões de consulta

1. Índices ausentes

Problema:

// No index on 'email' field
db.users.find({ email: "user@example.com" })

Solução:

// Create index
db.users.createIndex({ email: 1 })

2. Consultas regex ineficientes

Problema:

// Case-insensitive regex without index
db.users.find({ name: /john/i })

Solução:

// Use text index or exact match
db.users.createIndex({ name: "text" })
db.users.find({ $text: { $search: "john" } })

3. Operações grandes de skip()

Problema:

// Skipping thousands of documents
db.collection.find().skip(10000).limit(10)

Solução:

// Use range queries with indexed field
db.collection.find({ _id: { $gt: lastSeenId } }).limit(10)

4. Seleção de campos desnecessários

Problema:

// Fetching entire documents
db.users.find({ status: "active" })

Solução:

// Use projection
db.users.find({ status: "active" }, { name: 1, email: 1 })

5. Pipelines de agregação ineficientes

Problema:

// $match after $lookup
db.orders.aggregate([
  { $lookup: { ... } },
  { $match: { status: "completed" } }
])

Solução:

// $match first to reduce documents
db.orders.aggregate([
  { $match: { status: "completed" } },
  { $lookup: { ... } }
])

Problemas de design de esquema

1. Matrizes sem limites

Problema:

// Array grows indefinitely
{
  userId: 123,
  activities: [/* thousands of items */]
}

Solução:

// Use separate collection or bucketing
{
  userId: 123,
  month: "2024-01",
  activities: [/* limited items */]
}

2. Incorporação excessiva

Problema:

// Deeply nested documents
{
  user: {
    profile: {
      settings: {
        preferences: {
          // many levels deep
        }
      }
    }
  }
}

Solução:

// Flatten or use references
{
  userId: 123,
  profileId: 456
}

3. Documentos grandes

Problema:

// Documents approaching 16MB limit
{
  data: "very large string...",
  attachments: [/* large binary data */]
}

Solução:

// Store large data separately (GridFS or object storage)
{
  dataRef: "s3://bucket/key",
  attachments: [{ ref: "gridfs://id" }]
}

Erros no gerenciamento de conexões

1. Não usar pooling de conexões

Problema:

// Creating new connection per request
app.get('/api/users', async (req, res) => {
  const client = await MongoClient.connect(uri);
  // ...
  await client.close();
});

Solução:

// Reuse connection pool
const client = new MongoClient(uri, { maxPoolSize: 50 });
await client.connect();

app.get('/api/users', async (req, res) => {
  const db = client.db();
  // ...
});

2. Não fechar os cursores

Problema:

// Cursor left open
const cursor = db.collection.find();
// Never closed

Solução:

// Always close cursors
const cursor = db.collection.find();
try {
  await cursor.forEach(doc => { /* process */ });
} finally {
  await cursor.close();
}

3. Excesso de conexões

Problema:

// One connection per user session
const connections = new Map();
users.forEach(user => {
  connections.set(user.id, new MongoClient(uri));
});

Solução:

// Share connection pool across application
const client = new MongoClient(uri);
// All users share the same pool

Armadilhas de indexação

1. Muitos índices

Problema:

// Index on every field
db.collection.createIndex({ field1: 1 })
db.collection.createIndex({ field2: 1 })
db.collection.createIndex({ field3: 1 })
// ... 20+ indexes

Impacto: Reduz a velocidade das gravações e aumenta o armazenamento.

Solução: Manter apenas os índices necessários e usar índices compostos.

2. Ordem de índice incorreta em índices compostos

Problema:

// Query: { status: "active", createdAt: { $gt: date } }
// Index: { createdAt: 1, status: 1 }  // Wrong order

Solução:

// Correct order: equality first, range second
db.collection.createIndex({ status: 1, createdAt: 1 })

3. Não usar consultas cobertas

Problema:

// Index exists but query not covered
db.users.createIndex({ email: 1 })
db.users.find({ email: "user@example.com" }, { name: 1, email: 1 })
// Still fetches documents

Solução:

// Include all projected fields in index
db.users.createIndex({ email: 1, name: 1 })
db.users.find({ email: "user@example.com" }, { name: 1, email: 1, _id: 0 })

Apêndice: limites de métricas

Limites recomendados para as principais métricas de desempenho.

Limites de métricas
Métrica Limite de aviso Limite crítico Ação Recomendada
Utilização da CPU

75%

90%

Dimensionar núcleos de CPU
Utilização de memória

80%

95%

Alocação de memória em escala
Utilização do disco

80%

90%

Dimensionar o espaço em disco
IOPS de disco

80% do limite

95% do limite

Aumentar o tamanho do disco para obter mais IOPS
Conexões ativas

80% do limite

95% do limite

Planejar a escala ou otimizar o pooling de conexões
Atraso da replicação

5 segundos

30 segundos

Investigar e dimensionar, se necessário
Taxa de acertos do cache < 95% < 90% Dimensionar a memória ou otimizar as consultas
Tempo de execução da consulta

100ms (avg)

1000ms (avg)

Otimizar consultas e índices
Tempo de espera de bloqueio

100ms

1000ms

Otimize as operações e elimine as consultas de longa duração
Falhas de página

100/sec

1000/sec

Memória de escala
Latência de rede

10ms

50ms

Verificar a configuração da rede
Duração do backup

1 hora

4 horas

Considere o dimensionamento ou a otimização

Recomendações de frequência de monitoramento

Frequência de monitoramento
Categoria da Métrica Verificar Frequência Período de retenção
Utilização de recurso A cada 1 minuto 30 dias
Desempenho da consulta A cada 5 minutos 14 dias
Status de replicação A cada 1 minuto 30 dias
Estatísticas de conexão A cada 5 minutos 14 dias
Status do backup A cada 1 hora 90 dias
Crescimento do disco A cada 1 hora 90 dias

Exemplos de configuração de alertas

Alerta de CPU

Condition: CPU > 80% for 10 consecutive minutes
Action: Send notification to ops team
Escalation: Page on-call if > 90% for 15 minutes

Alerta de memória

Condition: Memory > 85% for 15 consecutive minutes
Action: Send notification to ops team
Escalation: Auto-scale if > 95% for 10 minutes

Alerta de atraso de replicação

Condition: Lag > 10 seconds
Action: Send notification immediately
Escalation: Page on-call if > 60 seconds

Alerta de espaço em disco

Condition: Disk > 80%
Action: Send notification to ops team
Escalation: Create incident if > 90%

Resumo das práticas recomendadas

Melhores práticas
Área Recomendação
Indexando Revisar e remover regularmente os índices não utilizados
Monitoring Configurar alertas de atraso de CPU, memória, disco e replicação
Planejamento da capacidade Mantenha o uso do disco abaixo de 80% e dimensione proativamente
Design de consultas Use planos de explicação durante o desenvolvimento
Ajuste de escala Dimensione proativamente antes da saturação
Conjunto de conexões Use pools de conexão e evite conexões por solicitação
Preferências de leitura Use secundárias para cargas de trabalho de leitura intensa
Preocupação com a escrita Equilibre a durabilidade com as necessidades de desempenho
Design de esquema Evite matrizes sem limites e incorporação excessiva
Planejamento de backup Programar durante os períodos de baixo tráfego
Rede Use endpoints privados para cargas de trabalho do IBM Cloud
Segurança Faça o rodízio de credenciais regularmente e use a lista de permissões de IP
Documentação Documentar métricas de linha de base e padrões normais
Teste Teste primeiro as alterações de desempenho em não produção
Suporte Reúna diagnósticos antes de entrar em contato com o suporte

Recursos adicionais

Documentação do IBM Cloud

MongoDB documentação

Recursos da comunidade