Optimieren und Überwachen der Leistung
Bezüglich der Synchronisierungsleistung wird folgender Ansatz empfohlen:
Konfigurieren aller Server und Datenbanken sowie des Anwendungscodes für optimale Leistung
Entwickeln von Leistungsbaselines
Überwachen und Optimieren zum Erreichen oder Übertreffen der Baselines
Konfiguration
Im ersten Schritt zur Leistungsoptimierung wird sichergestellt, dass Hard- und Software ordnungsgemäß konfiguriert sind.
Überlegungen zu Server und Netzwerk
Stellen Sie sicher, dass alle Computer über ein ausreichendes E/A-Subsystem verfügen, und dass die Datenbankdateien ordnungsgemäß zugeordnet wurden.
Die Geschwindigkeit des Lesens und Schreibens von Änderungen auf Datenträgern ist in der Regel wichtiger als die Netzwerkgeschwindigkeit. Daher ist ein ausreichendes E/A-Subsystem von grundlegender Bedeutung. Es wird empfohlen, mehrere RAID-Datenträgerarrays zu verwenden, und für „tempdb“, Benutzerdatenbanken und Transaktionsprotokolle jeweils ein dediziertes Array auf dem Server bereitzustellen. „tempdb“, die Benutzerdatenbanken und Transaktionsprotokolle sollten in separaten Dateigruppen erstellt werden. Wenn sich Benutzertabellen als Verarbeitungsengpass erweisen, sollten Sie diese in separate Dateigruppen verschieben.
Fügen Sie Computern in Synchronisierungstopologien ggf. Arbeitsspeicher hinzu.
Dies ist besonders für Server wichtig, die an einer großen Anzahl gleichzeitiger Synchronisierungssitzungen teilnehmen. Synchronisierungssitzungen umfassen in der Regel Transaktionen mit langer Laufzeit. Es ist daher wichtig, genügend Arbeitsspeicher zur Verfügung zu stellen, auf den die Serverdatenbank direkt zugreifen kann. Verwenden Sie für SQL Server für 32-Bit-Systeme den Parameter „/3GB“, oder ziehen Sie ein 64-Bit-System in Betracht. Weitere Informationen finden Sie in der SQL Server-Onlinedokumentation unter „Prozessadressraum“.
Legen Sie das Minimum und das Maximum für den Arbeitsspeicher fest, der der Serverdatenbank zugeordnet ist.
Beispielsweise ändert Database Engine (Datenbankmodul) die Arbeitsspeicheranforderungen standardmäßig dynamisch auf Grundlage der verfügbaren Systemressourcen. Wenn verhindert werden soll, dass bei Synchronisierungsaktivitäten nur wenig Arbeitsspeicher zur Verfügung steht, verwenden Sie die Option min server memory, um den Mindestarbeitsspeicher festzulegen. Um zu verhindern, dass das Betriebssystem Speicher auslagern muss, können Sie auch ein Maximum an Arbeitsspeicher mit der Option max server memory festlegen. Weitere Informationen finden Sie in der SQL Server-Onlinedokumentation.
Datenbank- und Anwendungsentwurf
Beachten Sie die bewährten Methoden für den Datenbankentwurf.
Eine an der Synchronisierung beteiligte Datenbank profitiert im Allgemeinen von den gleichen Leistungsoptimierungen wie beliebige ähnliche Datenbanken. Weitere Informationen zum Optimieren von Datenbanken finden Sie in der SQL Server-Onlinedokumentation. Beachten Sie die folgenden Überlegungen zu Indizes:
Indizes für Basistabellen sollten unter Berücksichtigung der Synchronisierungsaktivität getestet werden, da sie die Leistung beim Auswählen, Einfügen, Aktualisieren und Löschen beeinflussen können.
Metadatentabellen sollten ordnungsgemäß indiziert werden. In Sync Framework werden allen neu erstellten Tabellen Indizes hinzugefügt. Weitere Informationen zum Erstellen von Metadatentabellen für DbSyncProvider finden Sie unter Vorgehensweise: Bereitstellen einer Serverdatenbank für die Synchronisierung für die Zusammenarbeit (Nicht-SQL Server). Weitere Informationen zu DbServerSyncProvider finden Sie unter Vorgehensweise: Verwenden eines benutzerdefinierten Systems zur Änderungsnachverfolgung.
Legen Sie geeignete Timeoutwerte für Datenbanksperren und -abfragen fest.
Minimieren Sie Konflikte über den Veröffentlichungsentwurf und das Anwendungsverhalten.
Anwendungen sollten so entworfen sein, dass Konflikte möglichst vermieden werden, da die Erkennung und Auflösung von Konflikten mehr Komplexität, einen höheren Verarbeitungsaufwand und mehr Netzwerkverkehr mit sich bringen. Im Folgenden finden Sie häufig für die Konfliktvermeidung verwendete Methoden:
Aktualisieren Sie eine Tabelle an nur einem Knoten, oder:
Filtern Sie Daten so, dass nur in einem Knoten ein bestimmter Zeilensatz aktualisiert wird. In einem Client-/Serverszenario können Sie beispielsweise Daten clientübergreifend horizontal partitionieren, damit auf jedem Client nur ein Teil der Daten geändert wird, z. B. die Kontaktinformationen von Kunden in Washington.
Verwenden Sie Filter mit Umsicht.
Datenfilterung ist eine gute Möglichkeit, um Konflikten zu verringern und weniger Daten in die einzelnen Knoten zu kopieren. Beachten Sie jedoch, dass komplexe Filterklauseln die Leistung beeinträchtigen können. Wenn mit einem Filter viele Tabellen zusammengeführt werden, sollten Sie andere Möglichkeiten in Betracht ziehen, um dieselbe Logik zu implementieren.
Gehen Sie bei der Anwendungslogik in Triggern und Synchronisierungsabfragen mit Bedacht vor.
Das Ausführen zusätzlicher Logik in Abfragen und Triggern kann die Leistung wesentlich beeinträchtigen.
Verwenden Sie gespeicherte Prozeduren für Datenbankbefehle.
In Sync Framework werden verschiedene Abfragen verwendet, um in einer Synchronisierungssitzung Daten- und Metadatenänderungen auszuwählen und zu übernehmen. Wenn Sie diese Abfragen manuell erstellen, schließen Sie sie in gespeicherte Prozeduren ein. Dies bietet in der Regel bessere Leistung und Verwaltbarkeit und kann auch beim Sichern von Anwendungen hilfreich sein. Wenn für die Anwendung anstelle gespeicherter Prozeduren Inline-SQL erforderlich ist, verwenden Sie für alle Befehle die ADO.NET Prepare()-Methode. Dadurch wird die Leistung für Inline-SQL verbessert.
Synchronisieren Sie nur die Daten, die an den einzelnen Knoten erforderlich sind.
Es kann verlockend sein, „für alle Fälle“ alle oder die meisten Tabellen einer Datenbank zu veröffentlichen. Vermeiden Sie die Veröffentlichung von Tabellen, die für eine Anwendung nicht tatsächlich erforderlich sind, und ziehen Sie in Betracht, die einzelnen Knoten seltener zu synchronisieren.
Entwerfen Sie angemessene Synchronisierungsgruppen und -bereiche, und verwenden Sie für die einzelnen Bereiche die richtige Synchronisierungsrichtung.
Bei einem Bereich handelt es sich um einen Satz von Tabellen, der als Einheit synchronisiert wird. Eine oder mehrere Tabellen eines Bereichs können gefiltert werden. Zudem können Tabellen zu mehreren Bereichen gehören. Stellen Sie sicher, dass die Bereiche der Struktur und den Verwendungsmustern der enthaltenen Tabellen entsprechen. Als Beispiel dienen die folgenden vier Tabellen einer Außendienstanwendung:
Bestellungen und Bestelldetails
Diesen Tabellen werden nur auf einem Clientcomputer Zeilen hinzugefügt, auf dem Server werden sie jedoch möglicherweise aktualisiert. Der Commit für die Änderungen muss in derselben Transaktion ausgeführt werden. Diese Tabellen sollten sich im selben Bereich befinden und eine bidirektionale Synchronisierungsrichtung aufweisen.
Preise
Es werden häufig Zeilen eingefügt und aktualisiert. Dies erfolgt jedoch lediglich auf dem Server. Diese und ähnliche Tabellen sollten sich in einem Bereich befinden, für den aus Sicht des Client als Synchronisierungsrichtung nur Downloads möglich sind.
Produkte
Die Zeilen werden selten eingefügt und auf dem Server aktualisiert. Diese Tabelle sollte sich in einem anderen Bereich als die Preise befinden, da sie nicht mit derselben Häufigkeit aktualisiert und vermutlich seltener synchronisiert wird.
Hinweis
Die Synchronisierungsrichtung kann für die einzelnen Sitzungen geändert werden, wohingegen der Bereich sitzungsübergreifend beibehalten wird. Es gibt keine direkte Verbindung zwischen dem Bereich und der Synchronisierungsrichtung. Dieses Beispiel veranschaulicht jedoch, wie beide Elemente beim Entwerfen einer Anwendung berücksichtigt werden müssen.
Verwenden Sie für DbSyncProvider zum Optimieren der Enumeration SelectTableMaxTimestampsCommand.
Mit der für diese Eigenschaft festgelegten Abfrage wird der maximale Timestampwert der einzelnen Basis- oder Nachverfolgungstabellen ausgewählt. Dieser Timestamp wird verwendet, um zu ermitteln, ob das Ziel bereits über alle Änderungen an den einzelnen Tabellen von der Quelle verfügt. Wenn das Ziel bereits über die Änderungen verfügt, kann in Sync Framework häufig das Ausführen von Enumerationsabfragen vermieden werden, sodass die Leistung verbessert werden kann.
Verwenden Sie Batchverarbeitung, um unzuverlässige Netzwerke und Probleme mit unzureichendem Arbeitsspeicher auszugleichen.
Standardmäßig werden in Sync Framework Änderungen zu den einzelnen Knoten in einem einzelnen DataSet-Objekt übermittelt. Dieses Objekt wird im Arbeitsspeicher beibehalten, wenn für einen Knoten Änderungen übernommen werden. Das Standardverhalten gilt, wenn auf dem Computer, auf dem Änderungen übernommen werden, genügend Arbeitsspeicher vorhanden ist und wenn die Verbindung mit diesem Computer zuverlässig ist. Für einige Anwendungen ist es jedoch vorteilhaft, Änderungen in Batches zu unterteilen. Eine Batchverarbeitung führt zu zusätzlichem Aufwand, für einige Anwendungen stellt sie jedoch einen Leistungsvorteil dar. Weitere Informationen finden Sie unter Vorgehensweise: Übermitteln von Änderungen in Batches (SQL Server).
Staffeln Sie die Zeitpläne für die Synchronisierung.
Wenn eine große Anzahl von Knoten mit einem zentralen Knoten synchronisiert wird, sollten Sie die Zeitpläne staffeln, um unzureichenden Arbeitsspeicher und Konflikte im zentralen Knoten zu vermeiden. Die Zeitpläne können auf der Uhrzeit oder auf relativen Zeitpunkten beruhen. So kann eine Anwendung beispielsweise stündlich synchronisiert werden, oder Sie können eine Synchronisierungssitzung eine Stunde nach Abschluss der letzten erfolgreichen Sitzung für diesen Knoten starten.
Verwenden Sie geeignete Metadatenbereinigungs-Zeitpläne.
Große Mengen an Metadaten können die Leistung der Synchronisierungsabfragen beeinträchtigen.
Baselines
Es wird empfohlen, im Anschluss an die Konfiguration der Synchronisierung Leistungsbaselines zu entwickeln, die es Ihnen ermöglichen, das Synchronisierungsverhalten bei einer typischen Auslastung Ihrer Anwendungen und Topologie zu ermitteln. Verwenden Sie Synchronisierungsereignisse und den Systemmonitor, um die typischen Zahlen für die folgenden fünf Dimensionen der Synchronisierungsleistung zu ermitteln:
Latenzzeit: die erforderliche Zeit für die Weitergabe einer Datenänderung zwischen den Knoten in einer Topologie.
Durchsatz: der Umfang der Synchronisierungsaktivität, die ein System unterstützt (gemessen in Zeilen, die in einem Zeitraum übermittelt werden).
Parallelität: die Anzahl von Knoten, die gleichzeitig mit einem bestimmten Knoten synchronisiert werden können. Hierbei handelt es sich häufig um die Anzahl von Clients, die mit einem bestimmten Server synchronisiert werden können.
Dauer der Synchronisierung: der Zeitraum, bis eine bestimmte Synchronisierungssitzung abgeschlossen ist.
Ressourcenverbrauch: die Hardware- und Netzwerkressourcen, die im Rahmen der Synchronisierungsverarbeitung verwendet werden.
Abhängig von der Anwendung können einige dieser Leistungskennzahlen wichtiger als andere sein. So kann z. B. ein relativ niedriger Durchsatz akzeptabel sein, sofern ein hoher Grad an Parallelität beibehalten werden kann. Beim Festlegen einer Leistungsbaseline sollten Sie beachten, dass es sich bei Sync Framework nicht um ein Server-zu-Server-System mit niedriger Latenzzeit und hohem Durchsatz wie etwa bei der SQL Server-Transaktionsreplikation handelt. Es handelt sich um eine Client-zu-Server- und Client-zu-Client-Synchronisierung, die Offline- und Zusammenarbeitsanwendungen unterstützt.
Nachdem Sie die Baselinezahlen festgelegt haben, sollten Sie das System überwachen, um Leistungs- und Skalierbarkeitsengpässe zu ermitteln und diese gegebenenfalls zu optimieren.
Überwachung und Wartung
Die Überwachung wird bei der Entwicklung von Leistungsbaselines, mitunter in Produktionsumgebungen und in größerem Umfang im Fall von Leistungsproblemen verwendet. Es werden folgende Tools zum Überwachen der Synchronisierungsaktivität und -leistung empfohlen:
Synchronisierungsereignisse
Verwenden Sie die folgenden Ereignisse, um zu ermitteln, wie viel Zeit bestimmte Phasen benötigen:
Tabellenbasierte Ereignisse für jeden Anbieter: SelectingChanges, ChangesSelected, ApplyingChanges und ChangesApplied
Sitzungsbasierte Ereignisse für jeden Anbieter: SyncProgress
Halten Sie die Dauer der einzelnen Phasen im Arbeitsspeicher, und schreiben Sie sie nach Abschluss der Synchronisierungssitzung in eine Protokolldatei oder Leistungsdatenbank.
SQL Server Profiler
Verwenden Sie die Vorlage „TSQL_SPs“, und ermitteln Sie alle Abfragen, die länger als ein bestimmter Schwellenwert dauern, z. B. zehn Sekunden. Wenn Sie Ablaufverfolgungsinformationen in eine Protokolldatei oder eine Leistungsdatenbank schreiben, speichern Sie die Daten im Arbeitsspeicher zwischen, und führen Sie im Anschluss an die Synchronisierungssitzung Schreibvorgänge aus.
SQL Server Management Studio
Mithilfe von Management Studio kann der Abfrageplan für die einzelnen Synchronisierungsabfragen überprüft werden, um sicherzustellen, dass der beste Plan verwendet wird.
Systemmonitor
Verwenden Sie die folgenden Leistungsobjekte und -indikatoren, um die für die Synchronisierung wichtigen Bereiche zu überwachen:
Indikatoren unter SQL Server: Speicher-Manager Sie können z. B. überprüfen, ob SQL Server den verfügbaren Arbeitsspeicher belegt, indem Sie den Zielserverspeicher mit dem Gesamtserverspeicher vergleichen.
Indikatoren unter „PhysicalDisk“. Mit „Avg. Disk Read Queue Length“ und „Avg. Disk Write Queue Length“ können Sie beispielsweise ermitteln, ob die Synchronisierungsleistung E/A-gebunden ist, oder ob der Computer über unzureichenden Arbeitsspeicher verfügt. Wenn die Warteschlangen zu lang sind, sollten Sie Arbeitsspeicher hinzuzufügen und Laufwerke aktualisieren oder hinzufügen.
In der Standardeinstellung sollen die Indikatoren die Mittelwerte für alle Laufwerken angeben. Stellen Sie sicher, für jedes Laufwerk einen Indikator hinzufügen.
Indikatoren unter SQL Server: Transaktionen. Sie können beispielsweise Momentaufnahmentransaktionen und die Versionsspeichergröße verwenden, um zu ermitteln, ob Änderungsenumerationsabfragen ein erhebliches Anwachsen von „tempdb“ verursachen. Die Änderungsenumerationssabfragen verwenden Momentaufnahmentransaktionen, und die Momentaufnahmen-Versionsinformationen werden in „tempdb“ gespeichert. Ein großer Versionsspeicher bedeutet, dass die Größe von „tempdb“ möglicherweise angepasst werden muss.
Indikatoren unter SQL Server: Sperren. Sie können beispielsweise die Wartezeit für Sperren und die Anzahl der Deadlocks verwenden, um zu ermitteln, ob bei gleichzeitiger Aktivität in der Datenbank Konflikte auftreten.
Synchronisierungsablaufverfolgung
Sync Framework enthält eine Ablaufverfolgung, die auf der TraceListener-Klasse beruht. Die Ablaufverfolgung kann verwendet werden, um Informationen zu Synchronisierungssitzungen zu erfassen, die bei der Überwachung und Problembehandlung hilfreich sein können. Beachten Sie jedoch, dass eine Ablaufverfolgung zu zusätzlichem Aufwand führt und hauptsächlich bei der Entwicklung verwendet werden sollte. Weitere Informationen finden Sie unter Vorgehensweise: Ablaufverfolgung des Synchronisierungsvorgangs. (Dieses Thema behandelt hauptsächlich DbServerSyncProvider, die Informationen gelten jedoch auch für andere Anbieter.)
Zusätzlich zur Überwachung wird empfohlen, regelmäßig die folgenden Wartungsaufgaben auszuführen:
Abhängig vom Defragmentierungsgrad sollten Sie die Indizes der Basis- und Metadatentabellen reorganisieren oder neu erstellen.
Aktualisieren Sie die Indexstatistiken.
Bereinigen Sie die Synchronisierungsmetadaten.
Siehe auch
Konzepte
Überlegungen zum Entwurf und zur Bereitstellung von Anwendungen