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.
| Métrica | Limite de aviso | Limite crítico | Ação Recomendada |
|---|---|---|---|
| Utilização da CPU |
|
|
Dimensionar núcleos de CPU |
| Utilização de memória |
|
|
Alocação de memória em escala |
| Utilização do disco |
|
|
Dimensionar o espaço em disco |
| IOPS de disco |
|
|
Aumentar o tamanho do disco para obter mais IOPS |
| Conexões ativas |
|
|
Planejar a escala ou otimizar o pooling de conexões |
| Atraso da replicação |
|
|
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 |
|
|
Otimizar consultas e índices |
| Tempo de espera de bloqueio |
|
|
Otimize as operações e elimine as consultas de longa duração |
| Falhas de página |
|
|
Memória de escala |
| Latência de rede |
|
|
Verificar a configuração da rede |
| Duração do backup |
|
|
Considere o dimensionamento ou a otimização |
Recomendações de 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
| Á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 |