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.
| Metrik | Warnungsschwellenwert | Kritischer Schwellenwert | Empfohlene Aktion |
|---|---|---|---|
| CPU-Auslastung |
|
|
CPU-Kerne skalieren |
| Memory Utilization |
|
|
Skalierung der Speicherzuweisung |
| Plattennutzung |
|
|
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 |
|
|
Untersuchen und bei Bedarf skalieren |
| Cachetrefferquote | < 95 % | < 90% | Speicher skalieren oder Abfragen optimieren |
| Ausführungszeit der Abfrage |
|
|
Optimieren Sie Abfragen und Indizes |
| Lock Wait Time |
|
|
Optimieren Sie Vorgänge und beenden Sie langlaufende Abfragen |
| Seitenfehler |
|
|
Skalenspeicher |
| Netzwerklatenz |
|
|
Netzwerkkonfiguration prüfen |
| Sicherungsdauer |
|
|
Skalierung oder Optimierung in Betracht ziehen |
Empfehlungen zur 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
| 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 |