Test di carico di SQL Server tramite HammerDB


Questo tutorial mostra come utilizzare HammerDB per eseguire test di carico su un'istanza Compute Engine di SQL Server. Per informazioni su come installare un'istanza SQL Server, utilizza i seguenti tutorial:

Sono disponibili diversi strumenti per l'esecuzione di test di carico, alcuni gratuiti e open source, altri che richiedono una licenza. HammerDB è uno strumento open source che in genere funziona bene per verificare le prestazioni di un database SQL Server. Questo tutorial illustra i passaggi di base per utilizzare HammerDB, ma sono disponibili altri strumenti e sta a te selezionare quelli più adeguati per i tuoi workload specifici.

Obiettivi

Questo tutorial illustra come raggiungere i seguenti obiettivi:

  • Configurare SQL Server per i test di carico
  • Installare ed eseguire HammerDB
  • Raccogliere le statistiche di runtime
  • Eseguire il benchmark di elaborazione delle transazioni derivato dal test di carico basato sulla specifica TPC "C" (TPROC-C)

Costi

Oltre alle eventuali istanze SQL Server esistenti già in esecuzione su Compute Engine, questo tutorial utilizza componenti di Google Cloudfatturabili, tra cui:

  • Compute Engine
  • Windows Server

Il Calcolatore prezzi può generare una stima dei costi in base all'utilizzo previsto. Il link fornito mostra una stima dei costi associati ai prodotti utilizzati in questo tutorial, che possono aggirarsi in media sui 16 $ al giorno.

I nuovi utenti di Google Cloud potrebbero avere diritto a una prova gratuita.

Prima di iniziare

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Se non utilizzi Windows sulla tua macchina locale, installa un client RDP (Remote Desktop Protocol) di terze parti. Per saperne di più, vedi la documentazione sui client Microsoft Remote Desktop.

Configura l'istanza SQL Server per i test di carico

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

  1. In SQL Server Management Studio, fai clic con il tasto destro del mouse sulla cartella Database e poi scegli Nuovo database.
  2. Assegna il nome "TPCC" al nuovo database.
  3. Imposta le dimensioni iniziali del file di dati su 190.000 MB e quelle del file di log su 65.000 MB.
  4. Imposta i limiti di Aumento automatico su valori più elevati facendo clic sui pulsanti con i tre puntini, come mostrato nello screenshot seguente:

    Impostazione dei limiti di aumento automatico

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

  6. Per il file di log, disabilita l'aumento automatico delle dimensioni.

  7. Fai clic su OK.

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

  9. Imposta Livello di compatibilità su SQL Server 2022 (160).

  10. Imposta Modello di recupero su Con registrazione minima, per evitare che il caricamento riempia i log delle transazioni.

    Impostazione del modello di recupero su Con registrazione minima

  11. Fai clic su OK per creare il database TPCC. La procedura può richiedere alcuni minuti.

  12. L'immagine di SQL Server preconfigurata viene fornita con la sola autenticazione di Windows, pertanto dovrai attivare 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 cmdlet Get-NetIPAddress, perché è importante per le prestazioni e la sicurezza utilizzare l'IP interno.

Installa HammerDB

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

Crea un'istanza

Per creare una nuova istanza Compute Engine:

  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 un tipo di macchina con almeno la metà del numero di CPU presenti sull'istanza del database.

  4. Nella sezione Disco di avvio, fai clic su Cambia, quindi esegui queste operazioni:

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

Installa il software

Quando l'istanza è pronta, utilizza un client RDP per connetterti alla nuova istanza Windows Server e installa i seguenti software:

Esegui HammerDB

Dopo aver installato HammerDB, esegui il file hammerdb.bat. HammberDB non viene visualizzato nell'elenco delle applicazioni del menu Start. Per eseguirlo, utilizza il seguente comando:

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

Sostituisci VERSION con la versione di HammerDB installata.

Crea la connessione e lo schema

Quando l'applicazione è in esecuzione, il primo passaggio consiste nel configurare la connessione per creare lo schema.

  1. Fai doppio clic su SQL Server nel riquadro Benchmark.
  2. Seleziona TPROC-C. Sul sito di HammerDB si legge:
    TPROC-C è il carico di lavoro OLTP (Elaborazione delle transazioni online) implementato in HammerDB derivandolo dalla specifica TPROC-C con alcune modifiche per semplificare e rendere conveniente l'esecuzione di HammerDB in qualsiasi ambiente di database supportato. Il carico di lavoro TPROC-C di HammerDB è un carico di lavoro open source basato sullo standard per il benchmarking TPROC-C e, pertanto, non è paragonabile ai risultati di TPROC-C pubblicati, in quanto questi ultimi sono conformi a un sottoinsieme dello standard TPROC-C anziché allo standard completo. Il nome del carico di lavoro HammerDB TPROC-C sta per "Benchmark di elaborazione delle transazioni derivato dalla specifica TPC "C"".
  3. Fai clic su OK.

    Impostazione delle opzioni del benchmark TPROC-C

  4. Fai clic su Schema e poi fai doppio clic su Options (Opzioni).

  5. Compila il modulo inserendo l'indirizzo IP, il nome utente e la password, come mostrato nell'immagine seguente:

    Impostazione delle opzioni per la creazione di TPROC-C

  6. Imposta l'opzione SQL Server ODBC Driver (Driver ODBC per SQL Server) su ODBC Driver 18 per SQL Server.

  7. In questo caso, Number of Warehouses (Numero di warehouse, la scala del carico di lavoro) è impostato su 460, ma puoi scegliere un valore diverso. Alcune linee guida suggeriscono di utilizzare da 10 a 100 warehouse per CPU. Per questo tutorial, imposta questo valore sul numero di core moltiplicato per 10, ovvero 160 per un'istanza a 16 core.

  8. Per Virtual Users to Build Schema (Utenti virtuali per la creazione dello schema), scegli un numero compreso tra 1 e 2 volte il numero di vCPU del client. Puoi fare clic sulla barra grigia accanto al cursore per incrementare il numero.

  9. Deseleziona l'opzione Use BPC Option (Utilizza l'opzione BPC).

  10. Fai clic su OK.

  11. Fai doppio clic sull'opzione Build (Crea) sotto la sezione Schema Build (Creazione schema) per creare lo schema e caricare le tabelle. Al termine, fai clic sull'icona della luce rossa al centro della parte alta dello schermo per eliminare l'utente virtuale e passare alla fase successiva.

Se hai creato il database con il modello di recupero Simple, a questo punto potrebbe essere opportuno reimpostarlo su Full per eseguire un test di uno scenario di produzione più accurato. Questa modifica non viene applicata finché non esegui un backup completo o differenziale per attivare l'inizio della nuova catena di log.

Crea lo script del driver

HammerDB utilizza lo script del driver per orchestrare il flusso di istruzioni SQL inviate al database al fine di generare il carico richiesto.

  1. Nel riquadro Benchmark, espandi la sezione Driver Script (Script del driver) e fai doppio clic su Options (Opzioni).
  2. Verifica che le impostazioni corrispondano a quelle utilizzate nella finestra di dialogo Schema Build (Creazione schema).
  3. Scegli Timed Driver Script (Script del driver a tempo).
  4. L'opzione Checkpoint when complete (Crea checkpoint al completamento) forza il database a scrivere tutti dati sul disco alla fine del test, quindi selezionala solo se prevedi di eseguire più test di seguito.
  5. Per garantire un test completo, imposta Minutes of Rampup Time (Minuti di preparazione) su 5 e Minutes for Test Duration (Minuti per la durata del test) su 20.
  6. Fai clic su OK per uscire dalla finestra di dialogo.
  7. Fai doppio clic su Load (Carica) nella sezione Driver Script (Script del driver) del riquadro Benchmark per attivare lo script del driver.

Impostazione delle opzioni del driver TPROC-C

Crea gli utenti virtuali

La creazione di un carico realistico richiede in genere che più utenti eseguano gli script. Crea alcuni utenti virtuali per il test.

  1. Espandi la sezione Virtual Users (Utenti virtuali) e fai doppio clic su Options (Opzioni).
  2. Se hai impostato il numero di warehouse (scala) su 160, imposta Virtual Users (Utenti virtuali) su 16, perché le linee guida di TPROC-C consigliano un rapporto di 10:1 per evitare il blocco delle righe. Seleziona la casella di controllo Show Output (Mostra output) per abilitare la visualizzazione dei messaggi di errore nella console.
  3. Fai clic su OK.

Raccogli le statistiche di runtime

Raccogliere statistiche di runtime dettagliate in HammerDB e SQL Server non è semplice. Sebbene siano disponibili nelle pieghe di SQL Server, le statistiche 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 descritta in questa sezione per acquisire alcune utili metriche durante i 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 attivare temporaneamente le procedure di automazione OLE per scrivere il file sul disco. Ricorda di disattivarle dopo aver eseguito 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 SQL Server Management Studio. Prima di avviare 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

Esegui il test di carico TPROC-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 Compute Engine in cui hai installato HammerDB, avvia il test in quest'ultima applicazione:

  1. Nel riquadro Benchmark, sotto Virtual Users (Utenti virtuali), fai doppio clic su Create (Crea) per creare gli utenti virtuali, in modo da attivare la scheda Virtual User Output (Output utente virtuale).
  2. Per avviare il test, fai doppio clic su Run (Esegui) immediatamente al di sotto dell'opzione Create (Crea).
  3. Al termine del test, il calcolo delle transazioni al minuto (TPM) sarà visualizzato nella scheda Virtual User Output (Output utente virtuale).
  4. I risultati saranno disponibili nella procedura di raccolta salvata nella directory c:\Windows\temp.
  5. Salva tutti questi valori in un foglio Google e utilizzali per confrontare le esecuzioni di più test.

Esegui la pulizia

Al termine del tutorial, puoi eliminare le risorse che hai creato in modo che non utilizzino più la quota generando addebiti. Le seguenti sezioni descrivono come eliminare o disattivare queste risorse.

Elimina il progetto

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

Per eliminare il progetto:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Elimina le istanze

Per eliminare un'istanza Compute Engine:

  1. In the Google Cloud console, go to the VM instances page.

    Go to VM instances

  2. Select the checkbox for the instance that you want to delete.
  3. To delete the instance, click More actions, click Delete, and then follow the instructions.

Passaggi successivi