Test di carico di SQL Server tramite HammerDB


Questo tutorial mostra come utilizzare HammerDB per eseguire test di carico su un'istanza SQL Server di Compute Engine. Puoi imparare a installare un'istanza di SQL Server utilizzando i seguenti tutorial:

Sono disponibili diversi strumenti per i test di carico. Alcune sono gratuite e open source, mentre altre richiedono licenze. HammerDB è uno strumento open source che in genere funziona bene per dimostrare le prestazioni del tuo database SQL Server. Questo tutorial illustra i passaggi di base per utilizzare HammerDB, ma sono disponibili altri strumenti e dovresti selezionare quelli più in linea con i tuoi carichi di lavoro specifici.

Obiettivi

  • È in corso la configurazione di SQL Server per i test di carico.
  • Installazione ed esecuzione di HammerDB.
  • Raccolta di statistiche sul runtime.
  • Esecuzione del test di carico TPC-C.

Costi

Oltre a qualsiasi istanza SQL Server esistente in esecuzione su Compute Engine, questo tutorial utilizza componenti fatturabili di Google Cloud, tra cui:

  • Compute Engine
  • Windows Server

Il Calcolatore prezzi può generare una stima dei costi in base all'utilizzo previsto. Il link fornito mostra la stima dei costi per i prodotti utilizzati in questo tutorial, che può essere in media 16 dollari al giorno. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  5. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  6. Se non utilizzi Windows sulla tua macchina locale, installa un client Remote Desktop Protocol (RDP) di terze parti. Per ulteriori informazioni, vedi Client Microsoft Remote Desktop.

Configurazione dell'istanza SQL Server per i test di carico

Prima di iniziare, devi verificare che le regole firewall di Windows siano configurate in modo da consentire il traffico dall'indirizzo IP della nuova istanza di Windows che hai creato. Quindi, crea un nuovo database per i test di carico TPCC e configura un account utente seguendo questa procedura:

  1. Fai clic con il pulsante destro del mouse sulla cartella Database in SQL Server Management Studio e scegli Nuovo database.
  2. Assegna al nuovo database il nome "TPCC".
  3. Imposta le dimensioni iniziali del file di dati su 190.000 MB e il file di log su 65.000 MB.
  4. Imposta i limiti di Crescita automatica su valori più alti facendo clic sui pulsanti con i puntini di sospensione, come mostrato nello screenshot seguente:

    Impostazione dei limiti di crescita automatica

  5. Imposta il file di dati in modo che aumenti di 64 MB fino a raggiungere dimensioni illimitate.

  6. Imposta il file di log per disattivare la crescita automatica.

  7. Fai clic su Ok.

  8. Nel riquadro a sinistra della finestra di dialogo Nuovo database, scegli la pagina Opzioni.

  9. Imposta Livello di compatibilità su SQL Server 2012 (110).

  10. Imposta il Modello di recupero su Semplice in modo che il caricamento non riempia i log delle transazioni.

    Impostazione del modello di recupero su Semplice

  11. Fai clic su OK per creare il database TPCC, il cui completamento può richiedere alcuni minuti.

  12. Nell'immagine SQL Server preconfigurata è abilitata solo l'autenticazione di Windows, dovrai abilitare l'autenticazione in modalità mista in SSMS seguendo questa guida.

  13. Segui questi passaggi per creare un nuovo account utente SQL Server sul server di database con l'autorizzazione DBOwner. Assegna all'account il nome "loaduser" e assegnagli una password sicura.

  14. Prendi nota dell'indirizzo IP interno di SQL Server utilizzando il commandlet Get-NetIPAddress, poiché è importante per le prestazioni e la sicurezza utilizzare l'IP interno.

Installazione di HammerDB

Puoi eseguire HammerDB direttamente sulla tua istanza SQL Server. Tuttavia, per un test più preciso, crea una nuova istanza Windows e testa l'istanza SQL Server da remoto.

Creazione di un'istanza

Per creare una nuova istanza di Compute Engine, segui questi passaggi:

  1. Nella console Google Cloud, vai alla pagina Crea un'istanza.

    Vai a Crea un'istanza

  2. In Nome, inserisci hammerdb-instance.

  3. Nella sezione Configurazione macchina, seleziona il tipo di macchina con almeno metà del numero di CPU come istanza di database.

  4. Nella sezione Disco di avvio, fai clic su Cambia ed esegui le seguenti operazioni:

    1. Nella scheda Immagini pubbliche, scegli un sistema operativo Windows Server.
    2. Nell'elenco Versione, fai clic su Windows Server 2012 R2 o Windows Server 2012 R2 Core.
    3. Nell'elenco Tipo di disco di avvio, seleziona Disco permanente standard.
    4. Per confermare le opzioni del disco di avvio, fai clic su Seleziona.
  5. Per creare e avviare la VM, fai clic su Crea.

Installazione del software

Quando è pronto, utilizza un client RDP per connetterti alla nuova istanza di Windows Server e installa il seguente software:

HammerDB in esecuzione

Dopo aver installato HammerDB, esegui il file hammerdb.bat. HammberDB non compare nell'elenco delle applicazioni del menu Start. Usa questo comando per eseguire HammerDB:

C:\Program Files\HammerDB-2.20\hammerdb.bat

Creazione della connessione e dello schema

Quando l'applicazione è in esecuzione, la prima cosa da fare è configurare la connessione per creare lo schema.

  1. Fai doppio clic su SQL Server nel riquadro Benchmark.
  2. Scegli TPC-C, l'acronimo di Transaction Processing Performance Council - Benchmark C. Dal sito di TPC.org:
    TPC-C prevede una combinazione di cinque transazioni simultanee di diversi tipi e complessità eseguite online o in coda per l'esecuzione differita. Il database è composto da nove tipi di tabelle con un'ampia gamma di dimensioni di record e popolazioni. Il TPC-C viene misurato in transazioni al minuto (tpmC).
  3. Fai clic su OK.

    Impostazione delle opzioni del benchmark TPC-C

  4. Nel riquadro Benchmark, accanto a SQL Server, fai clic sul segno più (+) per espandere le opzioni.

  5. Sotto TPC-C, fai clic su Creazione schema, quindi fai doppio clic su Opzioni.

  6. Compila il modulo in modo simile all'immagine seguente, utilizzando il tuo indirizzo IP, il tuo nome utente e la tua password.

    Impostazione delle opzioni di compilazione TPC-C

  7. Per l'opzione Schema, scegli Aggiornato, che crea uno schema TPC-C migliore con struttura più appropriata e indici migliori.

  8. In questo caso, il numero di warehouse (la scala) è impostato su 2000, ma non è necessario impostarlo su così alto, perché la creazione di 2000 warehouse richiederà diverse ore. Alcune linee guida suggeriscono da 10 a 100 warehouse per CPU. Per questo tutorial, imposta questo valore su 10 volte il numero di core: 160 per un'istanza a 16 core.

  9. Per Utenti virtuali per creare schema, scegli un numero compreso tra 1 e 2 volte il numero di vCPU client. Puoi fare clic sulla barra grigia accanto al dispositivo di scorrimento per incrementare il numero.

  10. Fai clic su OK.

  11. Fai doppio clic sull'opzione Crea nella sezione Creazione schema per creare lo schema e caricare le tabelle. Al termine, fai clic sull'icona a forma di luce rossa lampeggiante in alto al centro dello schermo per distruggere l'utente virtuale e andare al passaggio successivo.

Se hai creato il database con il modello di recupero Simple, a questo punto potrebbe essere necessario ripristinare Full per eseguire un test più accurato di uno scenario di produzione. Questa operazione avrà effetto solo dopo aver eseguito un backup completo o differenziale per attivare l'avvio della nuova catena di log.

Creazione dello script del driver

HammerDB utilizza lo script del driver per orchestrare il flusso di istruzioni SQL verso il database in modo da generare il carico richiesto.

  1. Nel riquadro Benchmark, espandi la sezione Script del driver e fai doppio clic su Opzioni.
  2. Verifica che le impostazioni corrispondano a quelle utilizzate nella finestra di dialogo Creazione schema.
  3. Scegli Script per il test dei driver a tempo.
  4. L'opzione Checkpoint al completamento obbliga il database a scrivere tutto sul disco alla fine del test, quindi controlla questa opzione solo se prevedi di eseguire più test in una riga.
  5. Per garantire un test accurato, imposta Minuti di autonomia su 5 e Minuti per la durata del test su 20.
  6. Fai clic su OK per uscire dalla finestra di dialogo.
  7. Fai doppio clic su Carica nella sezione Script del driver del riquadro Benchmark per attivare lo script del driver.

Impostazione delle opzioni del driver TPC-C

Creazione di utenti virtuali

La creazione di un caricamento realistico richiede in genere l'esecuzione di script con più utenti diversi. Crea alcuni utenti virtuali per il test.

  1. Espandi la sezione Utenti virtuali e fai doppio clic su Opzioni.
  2. Se imposti il conteggio dei warehouse (scala) su 160, imposti gli Utenti virtuali su 16, perché le linee guida di TPC-C consigliano un rapporto 10x per evitare il blocco delle righe. Seleziona la casella di controllo Mostra output per abilitare i messaggi di errore nella console.
  3. Fai clic su OK.

Raccolta di statistiche sul runtime

HammerDB e SQL Server non raccolgono facilmente statistiche di runtime dettagliate. Sebbene le statistiche siano disponibili all'interno di SQL Server, devono essere acquisite e calcolate regolarmente. Se non disponi già di una procedura o di uno strumento per acquisire questi dati, puoi utilizzare la procedura riportata di seguito per acquisire alcune metriche utili durante il test. I risultati verranno scritti in un file CSV nella directory temp di Windows. Puoi copiare i dati in un foglio Google utilizzando l'opzione Incolla speciale > Incolla CSV.

Per utilizzare questa procedura, devi prima abilitare temporaneamente Procedure di automazione OLE per scrivere il file su disco. Ricordati di disabilitarla dopo il test:

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO

Ecco il codice per creare la procedura sp_write_performance_counters in SQLServer Management Studio. Prima di iniziare il test di carico, esegui questa procedura in Management Studio.

USE [master]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

/***
LogFile path has to be in a directory that SQL Server can Write To.
*/
CREATE PROCEDURE [dbo].[sp_write_performance_counters] @LogFile varchar (2000) = 'C:\\WINDOWS\\TEMP\\sqlPerf.log', @SecondsToRun int =1600, @RunIntervalSeconds int = 2

AS

BEGIN
--File writing variables
DECLARE @OACreate INT, @OAFile INT, @FileName VARCHAR(2000), @RowText VARCHAR(500), @Loops int, @LoopCounter int, @WaitForSeconds varchar (10)
--Variables to save last counter values
DECLARE @LastTPS BIGINT, @LastLRS BIGINT, @LastLTS BIGINT, @LastLWS BIGINT, @LastNDS BIGINT, @LastAWT BIGINT, @LastAWT_Base BIGINT, @LastALWT BIGINT, @LastALWT_Base BIGINT
--Variables to save current counter values
DECLARE @TPS BIGINT, @Active BIGINT, @SCM BIGINT, @LRS BIGINT, @LTS BIGINT, @LWS BIGINT, @NDS BIGINT, @AWT BIGINT, @AWT_Base BIGINT, @ALWT BIGINT, @ALWT_Base BIGINT, @ALWT_DIV BIGINT, @AWT_DIV BIGINT

SELECT @Loops = case when (@SecondsToRun % @RunIntervalSeconds) > 5 then @SecondsToRun / @RunIntervalSeconds + 1 else @SecondsToRun / @RunIntervalSeconds end
SET @LoopCounter = 0
SELECT @WaitForSeconds = CONVERT(varchar, DATEADD(s, @RunIntervalSeconds , 0), 114)
SELECT @FileName = @LogFile + FORMAT ( GETDATE(), '-MM-dd-yyyy_m', 'en-US' ) + '.txt'

--Create the File Handler and Open the File
EXECUTE sp_OACreate 'Scripting.FileSystemObject', @OACreate OUT
EXECUTE sp_OAMethod @OACreate, 'OpenTextFile', @OAFile OUT, @FileName, 2, True, -2

--Write the Header
EXECUTE sp_OAMethod @OAFile, 'WriteLine', NULL,'Transactions/sec, Active Transactions, SQL Cache Memory (KB), Lock Requests/sec, Lock Timeouts/sec, Lock Waits/sec, Number of Deadlocks/sec, Average Wait Time (ms), Average Latch Wait Time (ms)'
--Collect Initial Sample Values
SET ANSI_WARNINGS OFF
SELECT
  @LastTPS= max(case when counter_name = 'Transactions/sec' then cntr_value end),
  @LastLRS = max(case when counter_name = 'Lock Requests/sec' then cntr_value end),
  @LastLTS = max(case when counter_name = 'Lock Timeouts/sec' then cntr_value end),
  @LastLWS = max(case when counter_name = 'Lock Waits/sec' then cntr_value end),
  @LastNDS = max(case when counter_name = 'Number of Deadlocks/sec' then cntr_value end),
  @LastAWT = max(case when counter_name = 'Average Wait Time (ms)' then cntr_value end),
  @LastAWT_Base = max(case when counter_name = 'Average Wait Time base' then cntr_value end),
  @LastALWT = max(case when counter_name = 'Average Latch Wait Time (ms)' then cntr_value end),
  @LastALWT_Base = max(case when counter_name = 'Average Latch Wait Time base' then cntr_value end)
FROM sys.dm_os_performance_counters
WHERE counter_name IN (
'Transactions/sec',
'Lock Requests/sec',
'Lock Timeouts/sec',
'Lock Waits/sec',
'Number of Deadlocks/sec',
'Average Wait Time (ms)',
'Average Wait Time base',
'Average Latch Wait Time (ms)',
'Average Latch Wait Time base') AND instance_name IN( '_Total' ,'')
SET ANSI_WARNINGS ON
WHILE @LoopCounter <= @Loops
BEGIN
WAITFOR DELAY @WaitForSeconds
SET ANSI_WARNINGS OFF
SELECT
  @TPS= max(case when counter_name = 'Transactions/sec' then cntr_value end)   ,
  @Active = max(case when counter_name = 'Active Transactions' then cntr_value end)   ,
  @SCM = max(case when counter_name = 'SQL Cache Memory (KB)' then cntr_value end)   ,
  @LRS = max(case when counter_name = 'Lock Requests/sec' then cntr_value end)   ,
  @LTS = max(case when counter_name = 'Lock Timeouts/sec' then cntr_value end)   ,
  @LWS = max(case when counter_name = 'Lock Waits/sec' then cntr_value end)   ,
  @NDS = max(case when counter_name = 'Number of Deadlocks/sec' then cntr_value end)   ,
  @AWT = max(case when counter_name = 'Average Wait Time (ms)' then cntr_value end)   ,
  @AWT_Base = max(case when counter_name = 'Average Wait Time base' then cntr_value end)   ,
  @ALWT = max(case when counter_name = 'Average Latch Wait Time (ms)' then cntr_value end)   ,
  @ALWT_Base = max(case when counter_name = 'Average Latch Wait Time base' then cntr_value end)
FROM sys.dm_os_performance_counters
WHERE counter_name IN (
'Transactions/sec',
'Active Transactions',
'SQL Cache Memory (KB)',
'Lock Requests/sec',
'Lock Timeouts/sec',
'Lock Waits/sec',
'Number of Deadlocks/sec',
'Average Wait Time (ms)',
'Average Wait Time base',
'Average Latch Wait Time (ms)',
'Average Latch Wait Time base') AND instance_name IN( '_Total' ,'')
SET ANSI_WARNINGS ON

SELECT  @AWT_DIV = case when (@AWT_Base - @LastAWT_Base) > 0 then (@AWT_Base - @LastAWT_Base) else 1 end ,
    @ALWT_DIV = case when (@ALWT_Base - @LastALWT_Base) > 0 then (@ALWT_Base - @LastALWT_Base) else 1 end

SELECT @RowText = '' + convert(varchar, (@TPS - @LastTPS)/@RunIntervalSeconds) + ', ' +
          convert(varchar, @Active) + ', ' +
          convert(varchar, @SCM) + ', ' +
          convert(varchar, (@LRS - @LastLRS)/@RunIntervalSeconds) + ', ' +
          convert(varchar, (@LTS - @LastLTS)/@RunIntervalSeconds) + ', ' +
          convert(varchar, (@LWS - @LastLWS)/@RunIntervalSeconds) + ', ' +
          convert(varchar, (@NDS - @LastNDS)/@RunIntervalSeconds) + ', ' +
          convert(varchar, (@AWT - @LastAWT)/@AWT_DIV) + ', ' +
          convert(varchar, (@ALWT - @LastALWT)/@ALWT_DIV)

SELECT  @LastTPS = @TPS,
    @LastLRS = @LRS,
    @LastLTS = @LTS,
    @LastLWS = @LWS,
    @LastNDS = @NDS,
    @LastAWT = @AWT,
    @LastAWT_Base = @AWT_Base,
    @LastALWT = @ALWT,
    @LastALWT_Base = @ALWT_Base

EXECUTE sp_OAMethod @OAFile, 'WriteLine', Null, @RowText

SET @LoopCounter = @LoopCounter + 1

END

--CLEAN UP
EXECUTE sp_OADestroy @OAFile
EXECUTE sp_OADestroy @OACreate
print 'Completed Logging Performance Metrics to file: ' + @FileName

END

GO

Esecuzione del test di carico TPC-C

In SQL Server Management Studio, esegui la procedura di raccolta utilizzando il seguente script:

Use master
Go
exec dbo.sp_write_performance_counters

Nell'istanza di Compute Engine in cui hai installato HammerDB, avvia il test nell'applicazione HammerDB:

  1. Nel riquadro Benchmark, in Virtual Users, fai doppio clic su Create per creare gli utenti virtuali, in modo da attivare la scheda Virtual User Output.
  2. Fai doppio clic su Esegui sotto l'opzione Crea per avviare il test.
  3. Al termine del test, vedrai il calcolo delle transazioni al minuto (TPM) nella scheda Output utente virtuale.
  4. Puoi trovare i risultati della tua procedura di raccolta nella directory c:\Windows\temp.
  5. Salvare tutti questi valori in un foglio Google e utilizzarli per confrontare più esecuzioni di test.

Esegui la pulizia

Al termine del tutorial, puoi eseguire la pulizia delle risorse che hai creato in modo che smettano di utilizzare la quota e smettano di essere addebitati. Le sezioni seguenti descrivono come eliminare o disattivare queste risorse.

Elimina il progetto

Il modo più semplice per eliminare la fatturazione è eliminare il progetto che hai creato per il tutorial.

Per eliminare il progetto:

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Eliminazione di istanze

Per eliminare un'istanza di Compute Engine:

  1. Nella console Google Cloud, vai alla pagina Istanze VM.

    Vai a Istanze VM

  2. Seleziona la casella di controllo per l'istanza che vuoi eliminare.
  3. Per eliminare l'istanza, fai clic su Altre azioni, quindi su Elimina e segui le istruzioni.

Passaggi successivi