4 de mayo de 2014

Análisis y evaluación de resultados de la calibración de I/O

En un post anterior Calibración de I/O se daba a detalle los pasos previos para realizar el procedimiento, ahora este post se dedica íntegramente al análisis y su evaluación de resultados antes, durante y después. El ambiente de prueba tiene las siguientes características: 

1. Es de la plataforma UNIX, sistema operativo Solaris.
2. Motor de base de datos Oracle 11g release 11.2.0.3
3. La cantidad de procesadores es solamente 1.
4. El ambiente de almacenamiento es ASM, y el diskgroup donde se almacenan los datafiles cuentan con dos 2 discos. 

A continuación se detalla el script que se elaboro para la calibración
SQL> COL NAME FORMAT A50
SET SERVEROUTPUT ON
DECLARE
  l_max_iops        INTEGER;
  l_max_mbps        INTEGER;
  l_actual_latency  INTEGER;
  ti   VARCHAR2 (50);
  tf   VARCHAR2 (50);
  res   NUMBER (15);
BEGIN
  ti:=TO_CHAR (SYSDATE, 'DD/MM/YYYY HH24:MI:SS');
  DBMS_RESOURCE_MANAGER.calibrate_io (
    num_physical_disks => 2,
    max_latency        => 10,
    max_iops           => l_max_iops,
    max_mbps           => l_max_mbps,
    actual_latency     => l_actual_latency);
   tf:=TO_CHAR (SYSDATE, 'DD/MM/YYYY HH24:MI:SS');
   DBMS_OUTPUT.PUT_LINE ('Ini: ' || ti);
   DBMS_OUTPUT.PUT_LINE ('Fin: ' || tf);
   res := (to_date(tf,'DD/MM/YYYY HH24:MI:SS')- to_date(ti,'DD/MM/YYYY HH24:MI:SS'))*24*60*60;
  DBMS_OUTPUT.PUT_LINE ('Tiempo Calibracion= ' ||res||' segundos');
  DBMS_OUTPUT.put_line ('****************************************');
  DBMS_OUTPUT.put_line ('l_max_iops       = ' || l_max_iops);
  DBMS_OUTPUT.put_line ('l_max_mbps       = ' || l_max_mbps);
  DBMS_OUTPUT.put_line ('l_actual_latency = ' || l_actual_latency);
  DBMS_OUTPUT.put_line ('****************************************');
END;
/

Para realizar la comparativa del rendimiento y su impacto se crearon dos scripts que se corre antes y después de la calibración.
El primer script genera la carga de 10000000 de registros con el commit al finalizar toda la transacción y el segundo script genera la carga de 1000000 de registros con el commit después de cada inserción.

Script 1
Script 2
SET SERVEROUTPUT ON
DECLARE
   ti    VARCHAR2 (50);
   tf    VARCHAR2 (50);
   res   NUMBER (15);
   res1   NUMBER (15);
BEGIN
   ti := TO_CHAR (SYSDATE, 'DD/MM/YYYY HH24:MI:SS');
   FOR i IN 1 .. 10000000
   LOOP
      INSERT INTO pticona.prueba1
           VALUES (i, 'Fila Nro: ' || i);
   END LOOP;
   COMMIT;
   tf := TO_CHAR (SYSDATE, 'DD/MM/YYYY HH24:MI:SS');
   DBMS_OUTPUT.PUT_LINE ('Ini: ' || ti);
   DBMS_OUTPUT.PUT_LINE ('Fin: ' || tf);
   res :=
      (TO_DATE (tf, 'DD/MM/YYYY HH24:MI:SS')
       - TO_DATE (ti, 'DD/MM/YYYY HH24:MI:SS'))
      * 24*60*60;
   res1 := round(res/60,2);
   DBMS_OUTPUT.PUT_LINE ('Total= ' || res || ' segundos');
   DBMS_OUTPUT.PUT_LINE ('Total= ' || res1 || ' minutos');
END;
/
SET SERVEROUTPUT ON
DECLARE
   ti    VARCHAR2 (50);
   tf    VARCHAR2 (50);
   res   NUMBER (15);
   res1   NUMBER (15);
BEGIN
   ti := TO_CHAR (SYSDATE, 'DD/MM/YYYY HH24:MI:SS');
   FOR i IN 1 .. 1000000
   LOOP
      INSERT INTO pticona.prueba2
           VALUES (i, 'Fila Nro: ' || i);
             COMMIT;
   END LOOP;
   tf := TO_CHAR (SYSDATE, 'DD/MM/YYYY HH24:MI:SS');
   DBMS_OUTPUT.PUT_LINE ('Ini: ' || ti);
   DBMS_OUTPUT.PUT_LINE ('Fin: ' || tf);
   res :=
      (TO_DATE (tf, 'DD/MM/YYYY HH24:MI:SS')
       - TO_DATE (ti, 'DD/MM/YYYY HH24:MI:SS'))
      * 24* 60* 60;
   res1 := round(res/60,2);
   DBMS_OUTPUT.PUT_LINE ('Total= ' || res || ' segundos');
   DBMS_OUTPUT.PUT_LINE ('Total= ' || res1 || ' minutos');
END;
/

 A continuación la gráfica 1.1 detalla el impacto en la base de datos durante la calibración realizada, Oracle recomienda que la calibración sea realizada en periodos donde la base de datos no tenga mucha actividad. Como se visualiza en la gráfica 1.1 el impacto supera al máximo de CPU que se tiene del servidor.
1.1 Impacto en la Base de datos durante la Calibración
















En los gráficos 2.1 y 2.2 se realiza la comparativa del impacto antes y después de la ejecución de la calibración, se nota claramente que el evento de "User I/O" disminuye considerablemente.
Impacto antes de la Calibración
2.1 Impacto general antes de la calibración
Impacto después de la Calibración
2.2 Impacto general después de la calibración

En la comparación de los gráficos 3.1 y 3.2 se nota que la "E/S por segundo" mejora considerablemente debido a que supera el valor de 400 y antes de la calibración ni llega a los 300. En lo que se refiere a "MB por segundo" también existe una leve mejoría.
3.1 Impacto E/S antes de la calibración
3.2 Impacto E/S después de la calibración










La gráficos 4.1 y 4.2 detalla el tiempo que demora el primer script antes y después de la calibración.
4.1 Primer query antes de la calibración
4.2 Primer query después de la calibración









La gráficos 5.1 y 5.2 detalla el "I/O" del primer script antes y después de la calibración.
5.1 "I/O" del primer query antes de la calibración
5.2 "I/O" del primer query después de la calibración





La gráficos 6.1 y 6.2 detalla el tiempo que demora el segundo script antes y después de la calibración.
6.1 Segundo query antes de la calibración
6.2 Segundo query después de la calibración









La gráficos 7.1 y 7.2 detalla el "I/O" del segundo script antes y después de la calibración.
7.1 "I/O" del segundo query antes de la calibración
7.2 "I/O" del segundo query después de la calibración





continuación se despliega el detalle obtenido de un reporte AWR, durante los periodos de carga en la base de datos, es decir, antes y después de la realizar la calibración:
8. Reporte AWR de calibración


Paulo Ticona

Referencias
Oracle Database "Performance Tuning Guide 11g Release 2 (11.2)", E16638-05
http://arup.blogspot.com/2008/08/resource-manager-io-calibration-in-11g.html




3 de mayo de 2014

Calibración de I/O

Una de las características que ofrece Oracle Database 11g es la calibración de I/O, lo que hace es emitir un intensa carga de trabajo de lectura de manera aleatoria para determinar las máximas IOPS (peticiones de E/S por segundo) y MBPS (megabytes de E/S por segundo) que puede sostener el sistema de almacenamiento.

Durante la calibración de I/O se genera una sobrecarga hacia la base de datos, por lo que se recomienda la ejecución durante las horas de menos actividad que minimizara la sobrecarga de I/O en horarios normales.

Para ejecutar la calibración de I/O utilizamos el procedimiento propio de Oracle DBMS_RESOURCE_MANAGER.CALIBRATE_IO, cuya sintaxis es la siguiente:

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);

Existen dos parámetros de entrada:
num_physical_disks: Número de discos fiscos en el almacenamiento de la base de datos, la cantidad de discos donde se encuentran los datafiles.
max_latency: Máxima latencia tolerable en milisegundos para las solicitudes de I/O.

Existen tres parámetros de salida:
max_iops: Número máximo de peticiones de I/O por segundo que pueden ser sostenido.
max_mbps: Maximo rendimiento de I/O que puede ser sostenido, expresado en megabytes por segundo.
actual_latency: Promedio de la latencia en solicitudes de I/O.

Antes de ejecutar la calibración debemos considerar los siguientes requerimientos:

Requerimiento 1. El usuario a ejecutar debe tener el privilegio SYSDBA (SYS)
bash-3.2$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Sat May 3 13:57:41 2014

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options

SQL> show user    
USER is "SYS"

Requerimiento 2. El parámetro timed_statistics debe estar con el valor de TRUE
SQL> show parameter timed_statistics
NAME                            TYPE        VALUE
-----------------------------   ---------   -------------
timed_statistics                boolean     TRUE

Requerimiento 3. El I/O asíncrono de filesystem debe estar habilitado.
SQL> show parameter filesystemio_options
NAME                            TYPE        VALUE
-----------------------------   ---------   -------------
filesystemio_options            string      NONE

Si no estuviera con el valor de SETALL, asignar el parámetro con la siguiente instrucción.
SQL> alter system set filesystemio_options=SETALL scope= spfile;

SQL> show parameter filesystemio_options
NAME                            TYPE        VALUE
-----------------------------   ---------   -------------
filesystemio_options            string       SETALL

Requerimiento 4. En un ambiente de almacenamiento ASM se debe considerar que el parámetro de base de datos “disk_asynch_io” debe estar con el valor de “TRUE” para dar paso a la correcta calibración. Adicionalmente cuando el parámetro “disk_asynch_io” tenga asignado el valor de “true” se debe verificar que el parámetro de base de datos “DBWR_IO_SLAVES” este con el valor de 0.
SQL> show parameter disk_asynch_io
NAME                            TYPE        VALUE
-----------------------------   ---------   -------------
disk_asynch_io                  boolean     FALSE

Si no estuviera con el valor de TRUE asignar el parámetro ejecutando la siguiente instrucción:
SQL> alter system set disk_asynch_io =TRUE scope= spfile;

SQL> show parameter disk_asynch_io
NAME                            TYPE        VALUE
-----------------------------   ---------   -------------
disk_asynch_io                  boolean     TRUE

Nota. Para que se guarden los parámetros modificados “filesystemio_options”, “disk_asynch_io” y “dbwr_io_slaves” es necesario realizar el reinicio de la instancia de la base de datos.

Requerimiento 5. Asegurar que el I/O Asíncrono se encuentra habilitado para los datafiles, verificamos ejecutando el siguiente query:
SQL> COL NAME FORMAT A50
SQL> SELECT NAME,ASYNCH_IO FROM V$DATAFILE F,V$IOSTAT_FILE I WHERE F.FILE#=I.FILE_NO AND FILETYPE_NAME='Data File';
NAME                                            ASYNCH_IO
---------------------------------------------   --------
+DATA/orcl/datafile/system.256.833512537        ASYNC_OFF
+DATA/orcl/datafile/sysaux.257.833512537        ASYNC_OFF
+DATA/orcl/datafile/undotbs1.258.833512539      ASYNC_OFF
+DATA/orcl/datafile/users.259.833512539         ASYNC_OFF
+DATA/orcl/datafile/example.265.833512695       ASYNC_OFF
+DATA/orcl/datafile/high_dat.267.833566889      ASYNC_OFF
+DATA/orcl/datafile/high_dat.268.833569565      ASYNC_OFF

Después de haber modificado el parámetro "disk_asynch_io" al valor de "TRUE" nuestra configuración queda lista para su calibración.
NAME                                            ASYNCH_IO
---------------------------------------------   --------
+DATA/orcl/datafile/system.256.833512537        ASYNC_ON
+DATA/orcl/datafile/sysaux.257.833512537        ASYNC_ON
+DATA/orcl/datafile/undotbs1.258.833512539      ASYNC_ON
+DATA/orcl/datafile/users.259.833512539         ASYNC_ON
+DATA/orcl/datafile/example.265.833512695       ASYNC_ON
+DATA/orcl/datafile/high_dat.267.833566889      ASYNC_ON
+DATA/orcl/datafile/high_dat.268.833569565      ASYNC_ON

Una ves revisado los requisitos mencionados anteriormente se puede proceder a ejecutar la configuración de calibrado de I/O.

Ya ejecutado el procedimiento se dispone de vistas que nos ayudan a revisar la configuración de calibración realizada, estas vistas son V$IO_CALIBRATION_STATUS y DBA_RSRC_IO_CALIBRATE.

V$IO_CALIBRATION_STATUS.- Nos permite visualizar el estado de la calibración.
Estado antes de la calibración:
SQL> SELECT * FROM v$io_calibration_status;

STATUS         CALIBRATION_TIME
-------------  -----------------------------
NOT AVAILABLE

Estado durante la calibración:
SQL> SELECT * FROM v$io_calibration_status;

STATUS         CALIBRATION_TIME
-------------  -----------------------------
IN PROGRESS

Estado despues de la calibracion:
SQL> SELECT * FROM v$io_calibration_status;

STATUS         CALIBRATION_TIME
------------- -----------------------------
READY          03-MAY-2014 13:34:45.410
1 row selected.

DBA_RSRC_IO_CALIBRATE.- Nos permite visualizar la configuración de la calibración realizada.
SQL> SELECT * FROM DBA_RSRC_IO_CALIBRATE;

START_TIME           END_TIME              MAX_IOPS   MAX_MBPS  MAX_PMBPS   LATENCY     NUM_PHYSICAL_DISKS
------------------   -------------------   --------   --------  ----------  ---------   ----------------
03-MAY-14 01.47 PM   03-MAY-14 01.53 PM    56         28        26          17          2
1 row selected.

En el siguiente post Análisis y evaluación de resultados de la calibración de I/O se realizará el análisis minucioso antes, durante y después de la calibración, como también sus resultados.

Paulo Ticona.

Fuentes.
Oracle Database "Performance Tuning Guide" 11g Release 2 (11.2), E16638-05.
http://www.oracle-base.com/articles/11g/resource-manager-enhancements-11gr1.php
http://arup.blogspot.com/2008/08/resource-manager-io-calibration-in-11g.html
http://dbmstuning.wordpress.com/tag/io-calibration/