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




No hay comentarios:

Publicar un comentario