Ottimizzazione e monitoraggio delle prestazioni
Per le prestazioni della sincronizzazione, si consiglia di adottare l'approccio seguente:
Configurazione di ciascun server e database e del codice dell'applicazione per ottenere prestazioni ottimali
Sviluppo di dati di riferimento per le prestazioni
Monitoraggio e ottimizzazione per soddisfare o superare i dati di riferimento
Configurazione
Il primo passaggio per l'ottimizzazione delle prestazioni consiste nell'assicurarsi che i componenti hardware e software siano configurati in modo appropriato.
Considerazioni relative al server e alla rete
Assicurarsi che ogni computer disponga di un sottosistema di I/O appropriato e che i file di database siano correttamente allocati.
La velocità di lettura e scrittura delle modifiche su disco è generalmente più importante della velocità della rete, pertanto un sottosistema di I/O adeguato è essenziale. Si consiglia di utilizzare più array di dischi RAID e di disporre di un array dedicato nel server per tempdb, database utente e log delle transazioni. Tempdb, database utente e log delle transazioni devono essere creati in filegroup separati. Se una o più tabelle utente si rivelano colli di bottiglia per l'elaborazione, considerare il loro spostamento in filegroup separati.
Considerare l'aggiunta di memoria nei computer inclusi nelle topologie di sincronizzazione.
Ciò si rivela particolarmente importante per i server coinvolti in un numero elevato di sessioni di sincronizzazione simultanee. Le sessioni di sincronizzazione comportano in genere transazioni con esecuzione prolungata, pertanto è importante disporre di una quantità di memoria significativa direttamente indirizzabile dal database server. Nel caso di SQL Server, utilizzare l'opzione /3GB per i sistemi a 32 bit o passare a un sistema a 64 bit. Per ulteriori informazioni, vedere "Spazio degli indirizzi di processo" nella documentazione online di SQL Server.
Impostare la quantità minima e la quantità massima di memoria allocata al database server.
Ad esempio, per impostazione predefinita, nel Database Engine (Motore di database) i requisiti di memoria possono variare in modo dinamico in base alle risorse di sistema disponibili. Per evitare che durante le attività di sincronizzazione la memoria risulti insufficiente, impostare la quantità minima di memoria disponibile tramite l'opzione min server memory. Per evitare che il sistema operativo richieda memoria del disco, è possibile impostare una quantità massima di memoria mediante l'opzione max server memory. Per ulteriori informazioni, vedere la documentazione online di SQL Server.
Progettazione di database e applicazioni
Seguire le procedure consigliate per la progettazione di database.
Un database coinvolto nella sincronizzazione generalmente usufruisce delle stesse ottimizzazioni delle prestazioni di qualsiasi database simile. Per ulteriori informazioni sull'ottimizzazione dei database, vedere la documentazione online di SQL Server. Tenere presenti le considerazioni seguenti relative agli indici:
Gli indici sulle tabelle di base devono essere testati considerando le attività di sincronizzazione, poiché gli indici possono influire sulle prestazioni relative alle operazioni di selezione, inserimento, aggiornamento ed eliminazione.
Le tabelle di metadati devono essere indicizzate nel modo appropriato. Sync Framework aggiunge indici a qualsiasi tabella creata. Se si creano tabelle di metadati per DbSyncProvider, vedere Procedura: eseguire il provisioning di un database server per la sincronizzazione in scenari di collaborazione (non SQL Server); e per DbServerSyncProvider, vedere Procedura: utilizzare un sistema di rilevamento delle modifiche personalizzato.
Impostare valori appropriati per il timeout di blocco del database e per il timeout di query.
Ridurre al minimo i conflitti tramite la progettazione della pubblicazione e il comportamento delle applicazioni.
Le applicazioni devono essere progettate per evitare i conflitti perché il rilevamento e la risoluzione dei conflitti introducono complessità, elaborazione e traffico di rete aggiuntivi. Le modalità più comuni per evitare i conflitti sono le seguenti:
Aggiornare una tabella in un solo nodo oppure
Filtrare i dati in modo che un solo nodo aggiorni un particolare set di righe. Ad esempio, in uno scenario client-server, è possibile suddividere in partizioni orizzontali i dati tra i client in modo che ciascun client modifichi solo una "sezione" di dati, ad esempio le informazioni di contatto per i clienti di Washington.
Utilizzare i filtri in modo razionale.
Il filtro dei dati è un modo efficace per ridurre i conflitti e copiare meno dati in ogni nodo. È tuttavia opportuno ricordare che clausole di filtro complesse possono influire sulle prestazioni. Se un filtro unisce in join molte tabelle, considerare altri modi per implementare la stessa logica.
Prestare attenzione alla logica dell'applicazione nei trigger e nelle query di sincronizzazione.
L'esecuzione di logica aggiuntiva in ogni query e trigger può rallentare significativamente le prestazioni.
Utilizzare stored procedure per i comandi del database.
Sync Framework utilizza numerose query per selezionare e applicare modifiche a dati e metadati durante una sessione di sincronizzazione. Se queste query vengono create manualmente, incapsularle in stored procedure. In questo modo è possibile ottenere generalmente prestazioni e gestibilità migliori, oltre a migliorare la sicurezza delle applicazioni. Se l'applicazione richiede SQL inline anziché stored procedure, assicurarsi di utilizzare il metodo ADO.NET Prepare() per tutti i comandi. In questo modo è possibile migliorare le prestazioni per SQL inline.
Sincronizzare solo i dati richiesti in ciascun nodo.
Si può essere tentati di pubblicare tutte le tabelle di un database, o la maggior parte di esse, nel caso si rivelassero necessarie. Evitare di pubblicare tabelle non effettivamente richieste da un'applicazione e sincronizzare ogni nodo con una minor frequenza.
Progettare i gruppi e gli ambiti di sincronizzazione in modo appropriato e utilizzare la direzione di sincronizzazione adatta per ogni ambito.
Un ambito è un set di tabelle sincronizzate come un'unità. È possibile filtrare una o più tabelle in un ambito e le tabelle possono essere incluse in più di un ambito. Assicurarsi che gli ambiti riflettano i modelli di struttura e utilizzo delle tabelle in essi contenute. Considerare le quattro tabelle seguenti in un'applicazione per la forza vendita:
Orders e OrderDetails
Le righe vengono inserite in queste tabelle solo in un computer client, ma possono essere aggiornate nel server. Deve essere eseguito il commit delle modifiche nella stessa transazione. Queste tabelle devono trovarsi nello stesso ambito, con una direzione di sincronizzazione bidirezionale.
Pricing
Le righe vengono inserite e aggiornate frequentemente, ma solo nel server. Questa tabella e tabelle simili devono trovarsi in un ambito, con una direzione di sincronizzazione di solo download, dal punto di vista del client.
Products
Le righe non vengono inserite e aggiornate frequentemente nel server. Questa tabella deve trovarsi possibilmente in un ambito separato dalla tabella Pricing poiché non viene aggiornata alla stessa frequenza e può essere sincronizzata meno frequentemente.
Nota
È possibile modificare la direzione di sincronizzazione per ogni sessione, mentre l'ambito rimane persistente nelle sessioni. Non vi è una connessione diretta tra l'ambito e la direzione di sincronizzazione, ma in questo esempio viene illustrato come considerare entrambi gli aspetti durante la progettazione di un'applicazione.
Per DbSyncProvider, utilizzare SelectTableMaxTimestampsCommand per ottimizzare l'enumerazione.
La query specificata per questa proprietà seleziona il timestamp massimo da ogni tabella di base o tabella di rilevamento. Questo timestamp viene utilizzato per determinare se, per ogni tabella, la destinazione presenta già tutte le modifiche dall'origine. Se la destinazione presenta già le modifiche, in Sync Framework è possibile evitare di eseguire query di enumerazione con il risultato di migliorare le prestazioni.
Utilizzare l'invio in batch per compensare i problemi causati da reti non affidabili e da memoria insufficiente.
Per impostazione predefinita, Sync Framework invia le modifiche a ciascun nodo in un unico oggetto DataSet. Questo oggetto viene conservato in memoria durante l'applicazione delle modifiche a un nodo. Il comportamento predefinito è appropriato se è disponibile una quantità di memoria sufficiente nel computer in cui vengono applicate le modifiche e la connessione al computer è affidabile. Tuttavia, per alcune applicazioni può essere opportuno disporre di modifiche divise in batch. L'invio in batch implica overhead aggiuntivo, ma può rappresentare un vantaggio concreto in termini di prestazioni per alcune applicazioni. Per ulteriori informazioni, vedere Procedura: inviare modifiche in batch (SQL Server).
Scaglionare le pianificazioni di sincronizzazione.
Se viene sincronizzato un numero elevato di nodi rispetto a un nodo centrale, scaglionare le pianificazioni per ridurre le richieste di memoria e i conflitti nel nodo centrale. Le pianificazioni possono essere basate sul tempo di clock o su un'ora relativa. Ad esempio, un'applicazione potrebbe eseguire la sincronizzazione ogni ora o potrebbe avviare una sessione di sincronizzazione un'ora dopo il corretto completamento dell'ultima sessione per il nodo in questione.
Utilizzare pianificazioni della pulizia dei metadati appropriate.
Ingenti quantità di metadati possono influire sulle prestazioni delle query di sincronizzazione.
Dati di riferimento
Dopo aver configurato la sincronizzazione, è consigliabile sviluppare dati di riferimento per le prestazioni in modo da poter stabilire il comportamento della sincronizzazione in presenza del carico di lavoro tipico delle applicazioni e della topologia in uso. Utilizzare eventi di sincronizzazione e Monitor di sistema per stabilire valori tipici per le cinque dimensioni seguenti delle prestazioni della sincronizzazione:
Latenza: quantità di tempo necessaria per la propagazione di una modifica ai dati tra i nodi di una topologia.
Velocità effettiva: quantità di attività di sincronizzazione, espressa in righe recapitate in un periodo di tempo definito, che un sistema è in grado di sostenere nel tempo.
Concorrenza: numero di nodi che è possibile sincronizzare simultaneamente con un determinato nodo. Spesso si tratta del numero di client che è possibile sincronizzare con un determinato server.
Durata della sincronizzazione: tempo necessario per il completamento di una sessione di sincronizzazione specifica.
Utilizzo delle risorse: risorse hardware e di rete utilizzate come risultato dell'elaborazione della sincronizzazione.
A seconda dell'applicazione, alcuni di questi indicatori di prestazioni possono essere più importanti di altri. Ad esempio, potrebbe essere accettabile avere una velocità effettiva relativamente bassa a condizione che sia possibile conservare un elevato livello di concorrenza. Stabilendo i dati di riferimento, tenere presente che Sync Framework non è progettato come sistema server-server a bassa latenza ed elevata velocità effettiva come replica transazionale di SQL Server. È progettato per la sincronizzazione client-server e client-client che supporta applicazioni offline e di collaborazione.
Dopo aver stabilito i valori di riferimento, controllare il sistema cercando i colli di bottiglia in termini di prestazioni e di scalabilità ed eseguire l'ottimizzazione in base alle esigenze.
Monitoraggio e manutenzione
Il monitoraggio può essere utilizzato durante lo sviluppo dei dati di riferimento delle prestazioni, periodicamente negli ambienti di produzione e in modo più frequente in presenza di un problema di prestazioni. Si consigliano gli strumenti seguenti per il monitoraggio dell'attività di sincronizzazione e delle prestazioni:
Eventi di sincronizzazione
Utilizzare gli eventi seguenti per determinare il tempo impiegato da determinate fasi:
Eventi per tabella in ogni provider: SelectingChanges, ChangesSelected, ApplyingChanges e ChangesApplied
Evento per sessione in ogni provider: SyncProgress
Ricordare il tempo necessario per ciascuna fase e scrivere i risultati in un file di log o in un database delle prestazione al termine della sessione di sincronizzazione.
SQL Server Profiler
Utilizzare il modello TSQL_SPs e identificare eventuali query per le quali è necessario un tempo superiore rispetto a un determinato limite, ad esempio 10 secondi. Se vengono scritte informazioni di analisi in un file di log o in un database delle prestazioni, ricordare i dati ed eseguire scritture al termine della sessione di sincronizzazione.
SQL Server Management Studio
Management Studio può essere utilizzato per verificare il piano di query per ogni query di sincronizzazione, per accertarsi che venga utilizzato il piano ottimale.
Monitor di sistema
Utilizzare gli oggetti e i contatori delle prestazioni seguenti per controllare le aree importanti per la sincronizzazione:
Contatori in SQL Server: Gestione memoria. Ad esempio, è possibile verificare se SQL Server utilizza la memoria disponibile confrontando Memoria prevista server e Memoria totale server.
Contatori nel disco fisico. Ad esempio Lunghezza media lettura coda del disco e Lunghezza media scrittura coda del disco consentono di identificare se le prestazioni di sincronizzazione sono associate a I/O o se la memoria del computer è insufficiente. Se le lunghezze delle code sono eccessive, aggiungere memoria e aggiornare o aggiungere unità.
Per impostazione predefinita, il contatore segnala i valori medi tra tutte le unità. Assicurarsi di aver aggiunto un contatore per ogni unità.
Contatori in SQL Server: Transazioni. Ad esempio, Transazioni snapshot e Dimensioni archivio versioni possono essere utilizzati per determinare se le query di enumerazione delle modifiche determinano un notevole aumento di tempdb. Le query di enumerazione delle modifiche utilizzano transazioni snapshot e le informazioni sulla versione dello snapshot vengono archiviate in tempdb. In presenza di un archivio delle versioni di grandi dimensioni, potrebbe essere necessario ridimensionare tempdb.
Contatori in SQL Server: Blocchi. Ad esempio, Tempo di attesa blocchi e Numero di deadlock possono essere utilizzati per determinare se il conflitto è costituito da un problema durante l'attività simultanea nel database.
Analisi della sincronizzazione
Sync Framework include una funzionalità di analisi basata sulla classe TraceListener. L'analisi può essere utilizzata per raccogliere informazioni sulle sessioni di sincronizzazione che possono risultare utili per il monitoraggio e la risoluzione dei problemi. Tuttavia, è opportuno tenere presente che implica overhead aggiuntivo e deve essere utilizzata principalmente durante lo sviluppo. Per ulteriori informazioni, vedere Procedura: analizzare il processo di sincronizzazione (in questo argomento viene illustrato DbServerSyncProvider, ma le informazioni possono essere applicate anche ad altri provider).
Oltre al monitoraggio, si consiglia di eseguire regolarmente le attività di manutenzione seguenti:
A seconda del livello di deframmentazione, riorganizzare o ricompilare gli indici nelle tabelle di base e nelle tabelle dei metadati.
Aggiornare le statistiche relative agli indici.
Eseguire la pulizia dei metadati di sincronizzazione.
Vedere anche
Concetti
Considerazioni per la progettazione e la distribuzione di applicazioni