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.
2.1 Impacto general antes de la calibración |
2.2 Impacto general después de la calibración |
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 |
A 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