Teste de carga do SQL Server com HammerDB


Nesse tutorial, mostramos como usar o HammerDB para realizar testes de carga em uma instância do SQL Server do Compute Engine. Confira como instalar uma instância do SQL Server com os seguintes tutoriais:

Há várias ferramentas para teste de carga. Algumas são gratuitas e de código aberto. Para outras, é necessário ter uma licença. O HammerDB é uma ferramenta de código aberto que geralmente funciona bem para testar o desempenho do banco de dados SQL Server. Neste tutorial, são apresentadas as etapas básicas para usar o HammerDB, mas há outras ferramentas disponíveis. Selecione as ferramentas mais adequadas às suas cargas de trabalho específicas.

Objetivos

Este tutorial aborda os seguintes objetivos:

  • Configurar o SQL Server para testes de carga;
  • instalar e executar o HammerDB;
  • Como coletar estatísticas de tempo de execução
  • executar o comparativo de mercado de processamento de transações derivado do teste de carga da especificação TPC "C" (TPROC-C).

Custos

Além das instâncias do SQL Server em execução no Compute Engine, há componentes do Google Cloud passíveis de cobrança neste tutorial, como estes:

  • Compute Engine
  • Windows Server

Use a calculadora de preços para gerar uma estimativa de custo com base no uso previsto. Confira no link fornecido a estimativa de custos dos produtos usados nesse tutorial, que custam em média US$ 16 por dia. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

  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 você não estiver usando o Windows na máquina local, instale um cliente RDP (Remote Desktop Protocol) de terceiros. Para mais informações, consulte Clientes de Área de Trabalho Remota da Microsoft.

Como configurar o SQL Server para teste de carga

Antes de começar, verifique novamente se as regras de firewall do Windows estão configuradas para permitir o tráfego do endereço IP da nova instância do Windows que você criou. Depois, crie um novo banco de dados para o teste de carga TPCC e configure uma conta de usuário seguindo estas etapas:

  1. Clique com o botão direito do mouse na pasta Bancos de dados no SQL Server Management Studio e selecione Novo banco de dados.
  2. Defina o nome do novo banco de dados como "TPCC".
  3. Defina o tamanho inicial do arquivo de dados em 190.000 MB e do arquivo de registros em 65.000 MB.
  4. Clique nos botões de reticências para aumentar os limites do Aumento automático, como mostrado na captura de tela a seguir:

    Como configurar limites de aumento automático

  5. Configure o arquivo de dados para crescer em incrementos de 64 MB, não há um tamanho limite.

  6. Na configuração do arquivo de registros, desative o aumento automático.

  7. Clique em OK.

  8. Na caixa de diálogo Novo banco de dados no painel à esquerda, selecione a página Opções.

  9. Defina o Nível de compatibilidade como SQL Server 2022 (160).

  10. Defina o Modelo de recuperação como Simples, para que a carga não preencha os registros de transação.

    Configurar modelo de recuperação como Simple

  11. Clique em OK para criar o banco de dados TPCC, o que pode levar alguns minutos para ser concluído.

  12. A imagem pré-configurada do SQL Server contém apenas a autenticação do Windows, portanto, será necessário ativar a autenticação de modo misto no SSMS seguindo este guia.

  13. Siga estas etapas para criar uma nova conta de usuário do SQL Server no servidor de banco de dados com a permissão DBOwner. Defina o nome da conta como "Loaduser" e crie uma senha segura.

  14. Use o commandlet Get-NetIPAddress para anotar o endereço IP interno do SQL Server, porque o uso do IP interno é importante para o desempenho e a segurança.

Como instalar o HammerDB

Instale o HammerDB diretamente na instância do SQL Server. No entanto, para um teste mais preciso, crie uma nova instância do Windows e faça um teste remoto da instância do SQL Server.

Criar uma instância

Siga estas etapas para criar uma nova instância do Compute Engine:

  1. No Console do Google Cloud, acesse a página Criar uma instância.

    Acesse "Criar uma instância"

  2. Em Nome, insira hammerdb-instance.

  3. Na seção Configuração da máquina, selecione o tipo de máquina com pelo menos metade do número de CPUs da sua instância de banco de dados.

  4. Na seção Disco de inicialização, clique em Alterar e faça o seguinte:

    1. Na guia Imagens públicas, escolha um sistema operacional Windows Server.
    2. Na lista Versão, clique em Data center do Windows Server 2022.
    3. Na lista Tipo de disco de inicialização, selecione Disco permanente padrão.
    4. Para confirmar as opções do disco de inicialização, clique em Selecionar.
  5. Para criar e iniciar a VM, clique em Criar.

Como instalar o software

Quando estiver pronto, use um cliente RDP para se conectar à nova instância do Windows Server e instale o seguinte software:

Como executar o HammerDB

Depois de instalar o HammerDB, execute o arquivo hammerdb.bat. Ele não aparece na lista de aplicativos do menu "Iniciar". Use o seguinte comando para executá-lo:

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

Substitua VERSION pela versão do HammerDB instalada.

Como criar a conexão e o esquema

Com o aplicativo em execução, a primeira etapa é configurar a conexão para criar o esquema.

  1. Clique duas vezes em SQL Server no painel Benchmark.
  2. Selecione TPROC-C. No site do HammerDB:
    TPROC-C é a carga de trabalho OLTP implementada no HammerDB e derivada da especificação TPROC-C que tem uma modificação para tornar a execução do HammerDB simples e econômica em qualquer um dos ambientes de banco de dados com suporte. Como a carga de trabalho TPROC-C do HammerDB tem código aberto e é derivada do padrão de comparativo de mercado TPROC-C, ela não pode ser comparada aos resultados de TPROC-C publicados, porque esses resultados estão relacionados a um subconjunto, e não ao padrão de comparativo de mercado TPROC-C completo. O nome da carga de trabalho TPROC-C do HammerDB significa: comparativo de mercado de processamento de transações derivado da especificação TPC "C".
  3. Clique em OK.

    Como definir as opções de comparativo de mercado do TPROC-C

  4. Clique em Esquema e clique duas vezes em Opções.

  5. Preencha o formulário usando seu endereço IP, nome de usuário e senha, como mostrado nesta imagem:

    Como definir as opções de build do TPROC-C

  6. Definir o driver ODBC do SQL Server como o driver OBDC 18 para o SQL Server

  7. Neste caso, o Número de warehouses (a escala) está definido como 460, mas é possível escolher outro valor. Algumas diretrizes sugerem de 10 a 100 depósitos por CPU. Para este tutorial, configure o valor como 10 vezes o número de núcleos, por exemplo, 160 para uma instância de 16 núcleos.

  8. Em Virtual Users to Build Schema, selecione um número entre uma e duas vezes o número de vCPUs clientes. Clique na barra cinza ao lado do controle deslizante para aumentar o número.

  9. Limpe a opção Usar BPC.

  10. Clique em OK.

  11. Clique duas vezes na opção Build abaixo da seção Build do esquema para criar o esquema e carregar as tabelas. Assim que o processo terminar, clique no ícone de lâmpada vermelha na parte superior central da tela para destruir o usuário virtual e passar para a próxima etapa.

Se você criou o banco de dados com o modelo de recuperação Simple, retorne para Full neste ponto para um teste mais preciso de um cenário de produção. Essa ação somente terá efeito depois de ser feito um backup completo ou diferencial para acionar o início da nova cadeia de registros.

Como criar o script do driver

O script do driver é utilizado no HammerDB para organizar o fluxo de instruções SQL ao banco de dados para gerar a carga necessária.

  1. No painel Benchmark, expanda a seção Driver Script e clique duas vezes em Options.
  2. Verifique se as configurações correspondem às utilizadas na caixa de diálogo Schema Build.
  3. Selecione Script de driver com marcação de tempo.
  4. Com a opção Checkpoint when complete, tudo é gravado no disco ao final do teste do banco de dados, portanto, marque essa opção somente se planeja executar diversos testes de uma só vez.
  5. Para garantir um teste minucioso, defina Minutes of Rampup Time como 5 e Minutes for Test Duration como 20.
  6. Clique em OK para sair do diálogo.
  7. Clique duas vezes em Load na seção Driver Script do painel Benchmark para ativar o script do driver.

Como definir as opções de driver do TPROC-C

Como criar usuários virtuais

Criar uma carga realista geralmente requer a execução de scripts como vários usuários diferentes. Crie alguns usuários virtuais para o teste.

  1. Expanda a seção Virtual Users e clique duas vezes em Options.
  2. Se você definir a contagem de warehouses (escala) como 160, defina Usuários virtuais como 16, porque as diretrizes do TPROC-C recomendam uma proporção de dez vezes para evitar o bloqueio de linhas. Marque a caixa de seleção Show Output para ativar mensagens de erro no console.
  3. Clique em OK.

Como coletar estatísticas de ambiente de execução

Não é fácil coletar estatísticas detalhadas de tempo de execução no HammerDB e no SQL Server. Ainda que estejam disponíveis dentro do SQL Server, elas precisam ser capturadas e calculadas regularmente. Se você ainda não tem um procedimento ou uma ferramenta que ajude na captura desses dados, use o procedimento a seguir para capturar algumas métricas úteis durante os testes. Os resultados são gravados em um arquivo CSV no diretório temp do Windows. Copie os dados para uma Planilha Google com a opção Colar especial > Colar CSV.

Antes disso, ative temporariamente os procedimentos de automação OLE para gravar o arquivo no disco. Lembre-se de desativar essa opção após o teste.

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

Veja o código para criar o procedimento sp_write_performance_counters no SQL Server Management Studio. Antes de iniciar o teste de carga, execute este procedimento no 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

Como executar o teste de carga TPROC-C

No SQL Server Management Studio, execute o procedimento de coleta usando o seguinte script:

Use master
Go
exec dbo.sp_write_performance_counters

Inicie o teste no aplicativo HammerDB na instância do Compute Engine em que você instalou o HammerDB:

  1. No painel Benchmark, em Virtual Users, clique duas vezes em Create para criar os usuários virtuais, o que ativa a guia Virtual User Output.
  2. Clique duas vezes em Run abaixo da opção Create para iniciar o teste.
  3. Depois de concluir o teste, veja o cálculo de transações por minuto (TPM) na guia Virtual User Output.
  4. Os resultados do procedimento de coleta podem ser encontrados no diretório c:\Windows\temp.
  5. Salve todos os valores em um arquivo do Planilhas Google para comparar as várias execuções de teste.

Limpeza

Depois de concluir o tutorial, você pode limpar os recursos que criou para que eles parem de usar a cota e gerar cobranças. Nas seções a seguir, você aprenderá a excluir e desativar esses recursos.

Excluir o projeto

O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para o tutorial.

Para excluir o projeto:

  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.

Como excluir instâncias

Para excluir uma instância do Compute Engine, faça o seguinte:

  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.

A seguir