Medindo Throughput do Oracle Database com Calibrate IO

Por Victor Armbrust
Postado en janeiro 2013

Uma das dúvidas mais comuns de Administradores de Banco de Dados é conseguir mensurar a quantidade de I/O ou throughput em MB de um Banco de Dados em relação aos dispositivos de armazenamento (storage).

Neste artigo será abordada uma maneira bastante simples, porém eficiente, de calcular o throughput de um Banco de Dados Oracle, independente da plataforma.

DBMS_RESOURCE_MANAGER

O Oracle Database Resource Manager (DBRM) permite que o Oracle gerencie / limite recursos utilizados pelo Banco de Dados.

A partir da versão 11g, o Oracle Database oferece uma nova procedure na package DBMS_RESOURCE_MANAGER. Esta procedure é chamado de CALIBRATE_IO e tem a função principal de mensurar a capacidade de I/O do dispositivo de Storage onde o Banco de Dados foi criado.

Através da execução via Bloco PL/SQL é possível fazer este cáculo de maneira bem simples. Abaixo descrição dos parâmetros da procedure CALIBRATE_IO

Parâmetros

DBMS_RESOURCE_MANAGER.CALIBRATE_IO (
   num_physical_disks      IN  PLS_INTEGER DEFAULT 1,
   max_latency             IN  PLS_INTEGER DEFAULT 20,
   max_iops                OUT PLS_INTEGER,
   max_mbps                OUT PLS_INTEGER,
   actual_latency          OUT PLS_INTEGER); 

ParâmetroDescrição
num_physical_disksNúmero de discos físicos onde o Database está alocado.
max_latencyTolerância máximo em milisegundos para requisições de I/O no Banco de dados
max_iopsNúmero máximo de requisições de I/O por segundo que pode ser suportado pela estrutura de Armazenamento.As requisições de I/O são distribuídas através de leitura de Blocos do Banco de Dados.
max_mbpsThroughput Máximo em MB/s que pode ser suportado pela estrutura de Armazenamento. As requisições são distribuídas em leituras de 1MB.
actual_latencyLatência médis em milisegundos para leitura de blocos do Database.

Pré-Requistios

Antes da execução alguns pré-requisitos são necessários.

- Usuário com Privilégio SYSDBA (Normalmente executado com usuário SYS).
- Parâmetro TIMED_STATISTICS=TRUE
- ASYNCH_IO habilitado para todos os arquivos do Database. Para verificar, pode-se executar o script abaixo:

       col name format a50
       SELECT name, asynch_io FROM v$datafile f,v$iostat_file i
       WHERE f.file#        = i.file_no
       AND filetype_name  = 'Data File'
       /

- Executar apenas uma operação (CALIBRATE) por vez.
- Em ambientes com Oracle Real Application Clusters, a carga será distribuída entre todos os Nodes.

Exemplo de Execução

SET SERVEROUTPUT ON
DECLARE
  lat  INTEGER;
  iops INTEGER;
  mbps INTEGER;
BEGIN
-- DBMS_RESOURCE_MANAGER.CALIBRATE_IO (, , iops, mbps, lat);
   DBMS_RESOURCE_MANAGER.CALIBRATE_IO (2, 10, iops, mbps, lat);

  DBMS_OUTPUT.PUT_LINE ('max_iops = ' || iops);
  DBMS_OUTPUT.PUT_LINE ('latency  = ' || lat);
  dbms_output.put_line('max_mbps = ' || mbps);
end;
/

O resultado de execução é demonstrado abaixo:

SQL> @calibrate
max_iops = 3100
latency = 20
max_mbps = 376

O resultado de cada execução é demonstrado também na view DBA_RSRC_IO_CALIBRATE.

SQL> desc DBA_RSRC_IO_CALIBRATE
  Name                                      Null?    Type
  ----------------------------------------- -------- ----------------------------
  START_TIME                                         TIMESTAMP(6)
  END_TIME                                           TIMESTAMP(6)
  MAX_IOPS                                           NUMBER
  MAX_MBPS                                           NUMBER
  MAX_PMBPS                                          NUMBER
  LATENCY                                            NUMBER
  NUM_PHYSICAL_DISKS                                 NUMBER

Como somente a última execução da procedure CALIBRATE_IO é listada na view DBA_RSRC_IO_CALIBRATE a sugestão é alterar a procedure CALIBRATE_IO para armazenar cada execução em uma tabela auxilar. Abaixo exemplo:

SET SERVEROUTPUT ON
DECLARE
  lat  INTEGER;
  iops INTEGER;
  mbps INTEGER;
BEGIN
-- DBMS_RESOURCE_MANAGER.CALIBRATE_IO (<DISKS>, <MAX_LATENCY>, iops, mbps, lat);
   DBMS_RESOURCE_MANAGER.CALIBRATE_IO (2, 10, iops, mbps, lat);
  insert into CALIBRATE_REPORT as select * from DBA_RSRC_IO_CALIBRATE;
  DBMS_OUTPUT.PUT_LINE ('max_iops = ' || iops);
  DBMS_OUTPUT.PUT_LINE ('latency  = ' || lat);
  dbms_output.put_line('max_mbps = ' || mbps);
end;
/

O tempo de execução está diretamente ligado a alguns fatores:

- Performance na estrutura de Armazenamento (Storage);
- Número de Datafiles;
- Tamanho do Database;

Em Storage compartilhados, por exemplo ambiente clusterizado, a performance pode variar também de acordo com o número de Nodes do Cluster.

Listando Resultados

Após a execução, pode-se listar os resultados de 2 maneiras:

- Output da Procedure

SQL> @calibrate
max_iops = 3100
latency = 20
max_mbps = 376

- View DBA_RSRC_IO_CALIBRATE

SELECT MAX_IOPS, MAX_MBPS,  MAX_PMBPS, ACTUAL_LATENCY, NUM_PHYSICAL_DISKS FROM DBA_RSRC_IO_CALIBRATE;

MAX_IOPS   MAX_MBPS  MAX_PMBPS    LATENCY NUM_PHYSICAL_DISKS
-------- ---------- ---------- ---------- ------------------
     428        176         77          8                  4

*Esta lista somente a última execução. Implementando a alteração na execução da procedure CALIBRATE_IO, pode-se obter resultados de todas as execuções:

MAX_IOPS   MAX_MBPS  MAX_PMBPS    LATENCY NUM_PHYSICAL_DISKS
-------- ---------- ---------- ---------- ------------------
     428        176         77          8                  4
     524        173         76         21                  4
     537        183         74         28                  4
     598        174         78         38                  4

Interpretando Resultados

Os resultados acima demonstram o máximo atingido em operações de Leitura nos discos do Storage.

O melhor resultado obtido foi de 428 operações de I/O por Segundo (em média), com latência de 8ms. Para calcular a média de I/O por segundo em cada disco, basta dividir este valor pelo número de discos: 428/4 = 107 operações de I/O por segundo para cada disco do Storage.

Com estes resultados é possível gerar um gráfico de consumo de I/O e throughput com o resumo de execução:

throughput

Como demonstrado no Gráfico acima, o aumento (tolerância) de latência em milisegundos para operações no Banco de Dados não gera um aumento significativo de throughput nos discos do Storage.
Para operações em Banco de Dados (OLTP) a recomendação é manter o tempo médio de latência abaixo de 10ms. O throughput do Storage em MB permaneceu o mesmo durante todo o teste, atingindo media de 176MB/s por operação de I/O.

Observações importantes:

- Neste cenário, para aumentar o máximo de operações de I/O por Segundo, é nécessário o aumentar nº de discos no Storage ou ainda discos com maior performance.
- O Número máximo de operações de I/O pode ou não atender as necessidades de uma determinada aplicação. Isso dependerá das operações que a aplicação irá solicitar ao banco de dados.
- Relatórios AWR podem também ajudar a encontrar alta latência em requisições de I/O ao Banco de Dados.

Os resultados se alternam conforme a configuração de Hardware e Software de cada ambiente analisado. É importante manter um throughput compatível com a necessidade do Banco de Dados afim de evitar problemas de performance no acesso à aplicações.



Victor Armbrust é DBA há 10 anos, especialista em Banco de Dados Oracle e Bacharel em Ciências da Computação. Com sólidos conhecimentos em Banco de Dados e Sistemas operacionais, possui certificações OCP 10g/11g, OCE 11g Performance Tuning, OCE 10g RAC, Exadata Implementation Specialist, OCA Mysql 5, LPIC-3, OCA Solaris 10, Data Warehouse Implementation Specialist entre outras.
Instrutor Oracle University e Consultor de Banco de Dados na Oracle Advanced Customer Support Services.