Bewährte Praktiken für Leistung

Nutzen Sie diese Informationen, um bewährte Verfahren für Ihre Databases for MongoDB Bereitstellung unter IBM Cloud anzuwenden.

Flussdiagramm zur Behebung von Leistungsproblemen

Verwenden Sie das Flussdiagramm, um zu ermitteln, wie die Leistung zu beheben ist und welche Schritte als nächstes zu unternehmen sind.

┌─────────────────────────────────┐
│   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        │
                             └────────────────┘

Häufige Anti-Muster

Vermeiden Sie diese häufigen Fehler, die zu Leistungsproblemen führen.

Abfrage von Anti-Mustern

1. Fehlende Indizes

Das Problem:

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

Lösung:

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

2. Ineffiziente Regex-Abfragen

Das Problem:

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

Lösung:

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

3. Große skip()-Operationen

Das Problem:

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

Lösung:

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

4. Unnötige Felder auswählen

Das Problem:

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

Lösung:

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

5. Ineffiziente Aggregationspipelines

Das Problem:

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

Lösung:

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

Probleme beim Schemadesign

1. Unbegrenzte Arrays

Das Problem:

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

Lösung:

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

2. Übermäßige Einbettung

Das Problem:

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

Lösung:

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

3. Große Dokumente

Das Problem:

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

Lösung:

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

Fehler im Verbindungsmanagement

1. Kein Pooling von Verbindungen verwenden

Das Problem:

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

Lösung:

// 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. Cursor nicht schließen

Das Problem:

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

Lösung:

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

3. Zu viele Verbindungen

Das Problem:

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

Lösung:

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

Fallstricke bei der Indizierung

1. Zu viele Indizes

Das Problem:

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

Auswirkungen: Verlangsamt die Schreibvorgänge und erhöht den Speicherplatz.

Lösung: Behalten Sie nur notwendige Indizes bei und verwenden Sie zusammengesetzte Indizes.

2. Falsche Indexreihenfolge in zusammengesetzten Indizes

Das Problem:

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

Lösung:

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

3. Keine verdeckten Abfragen verwenden

Das Problem:

// 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

Lösung:

// 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 })

Anhang: Schwellenwerte für Metriken

Empfohlene Schwellenwerte für wichtige Leistungsindikatoren.

Schwellenwerte für Metriken
Metrik Warnungsschwellenwert Kritischer Schwellenwert Empfohlene Aktion
CPU-Auslastung

75%

90%

CPU-Kerne skalieren
Memory Utilization

80%

95%

Skalierung der Speicherzuweisung
Plattennutzung

80%

90%

Speicherplatz skalieren
E/A-Operationen der Platte pro Sekunde 80% des Grenzwertes 95% des Grenzwertes Erhöhung der Festplattengröße für mehr IOPS
Active Connections 80% des Grenzwertes 95% des Grenzwertes Skalierungsplan oder Optimierung des Verbindungspoolings
Replikationsverzögerung

5 Sekunden

30 Sekunden

Untersuchen und bei Bedarf skalieren
Cachetrefferquote < 95 % < 90% Speicher skalieren oder Abfragen optimieren
Ausführungszeit der Abfrage

100ms (Durchschnitt)

1000ms (Durchschnitt)

Optimieren Sie Abfragen und Indizes
Lock Wait Time

100ms

1000ms

Optimieren Sie Vorgänge und beenden Sie langlaufende Abfragen
Seitenfehler

100/sec

1000/sec

Skalenspeicher
Netzwerklatenz

10ms

50ms

Netzwerkkonfiguration prüfen
Sicherungsdauer

1 Stunde

4 Stunden

Skalierung oder Optimierung in Betracht ziehen

Empfehlungen zur Häufigkeit der Überwachung

Häufigkeit der Überwachung
Messgrößenkategorie Prüfhäufigkeit Aufbewahrungszeitraum
Ressourcenauslastung Alle 1 Minute 30 Tage
Abfrageleistung Alle 5 Minuten 14 Tage
Replikationsstatus Alle 1 Minute 30 Tage
Verbindungsstatistik Alle 5 Minuten 14 Tage
Sicherungsstatus Jede Stunde 90 Tage
Wachstum der Festplatte Jede Stunde 90 Tage

Beispiele für die Konfiguration von Warnmeldungen

CPU-Alarm

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

Speicher-Alarm

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

Warnung vor Replikationsverzögerung

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

Speicherplatz-Warnung

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

Zusammenfassung bewährter Praktiken

Bewährte Verfahren
Bereich Empfehlung
Indexierung Regelmäßige Überprüfung und Entfernung ungenutzter Indizes
Monitoring Konfigurieren Sie Warnungen für CPU-, Speicher-, Festplatten- und Replikationsverzögerungen
Kapazitätsplanung Festplattennutzung unter 80 % halten und proaktiv skalieren
Entwurf von Abfragen Verwendung von Erklärungsplänen während der Entwicklung
Skalierung Proaktive Skalierung vor der Sättigung
Verbindungspooling Verwenden Sie Verbindungspools und vermeiden Sie Verbindungen pro Anfrage
Vorlieben lesen Verwenden Sie Secondaries für leseintensive Workloads
Anliegen schreiben Gleichgewicht zwischen Haltbarkeit und Leistungsanforderungen
Schema-Entwurf Vermeiden Sie unbeschränkte Arrays und übermäßige Einbettung
Planung der Datensicherung Zeitplan für verkehrsarme Zeiten
Netz Verwenden Sie private Endpunkte für IBM Cloud Workloads
Sicherheit Regelmäßige Rotation der Anmeldedaten und Verwendung von IP-Zulassungslisten
Dokumentation Dokumentation von Basiskennzahlen und normalen Mustern
Testen Testen Sie Leistungsänderungen zunächst im Nicht-Produktionsbetrieb
Unterstützung Sammeln Sie Diagnosen, bevor Sie den Support kontaktieren

Zusätzliche Ressourcen

Dokumentation zu IBM Cloud

MongoDB dokumentation

Community-Ressourcen