Pagina principal ADODB en español

La Libreria de ADOdb para el Monitoreo del Rendimiento

V4.92 29 Ago 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my)

Este programa tiene licencia dual BSD y LGPL. Esto significa que se puede usar in productos compilados propietarios y en productos comerciales.

Ligas utiles de ADOdb: Descarga Otros documentos

Introduccion

Este modulo, es parte del paquete ADOdb, proporciona tanto interfases CLI como HTML para ver indicadores importantes del rendimiento de su base de datos. Es muy util debido a que apilcaciones Web como el popular phpMyAdmin actualmente no proporcionan herramientas efectivas para monitorear la salud de la base de datos. Este modulo proporciona lo siguiente:

ADOdb tambien tiene la habilidad de registrar todos los enunciados SQL ejecutados usando LogSQL. Todos los SQL registrador pueden ser analizados por medio de la interfase UI del monitor de rendimiento. En el modo View SQL, se clasifican los enunciados SQL en 3 tipos:

Cada SQL tiene una hiperliga a un plan de ejecucion, y tambien se muestra cada programa PHP que ejecuto ese sql.

Por favor tome en cuenta que la informacion presentada es una verificacion de salud muy basica, y no proporciona una vision general del rendimiento de la base de datos. A pesar de que se hizo el intento para hacerlo funcionar en varias bases de datos de la misma manera, es imposible de lograrlo. Para el analisis de salid, se intenta mostrar las siguiente parametros claves para todos los drivers:

Es necesario conectarse a la base de datos como administrador para ver la mayoria de los parametros.

Se agredecen las mejoras al codigo, partcicularmente la adicion de nuevos parametros y sugerencias automaticas de ajuste.

Uso

Actualemte se soportan los siguientes drivers: mysql, postgres, oci8, mssql, informix y db2. Para crear un monitor de rendimiento hay que llamar a NewPerfMonitor( ) omo se muestra a continuacion:

<?php
include_once('adodb/adodb.inc.php');
session_start(); # variables de sesion requeridas para monitorear 
$conn = ADONewConnection($driver);
$conn->Connect($server,$user,$pwd,$db);
$perf =& NewPerfMonitor($conn);
$perf->UI($pollsecs=5);
?>

It is also possible to retrieve a single database parameter:

$size = $perf->DBParameter('data cache size');

Gracias a Fernando Ortiz por el modulo de informix.

Metodos

function UI($pollsecs=5)

Crea una interfase de usuario en el Web para el monitoreo del rendimiento. Cuando se le da click en 'Poll', estadisticas del servidor se mostrarar cada $pollsecs sgundos. Vea Usage arriba.

Desde la version 4.11, se permite a los usuarios entroducir y ejecutar enunciados SQL interactivamente via la liga "Run SQL". Para deshabilitarla por motivos de seguridad, defina esta constante antes de llamar $perf->UI().

define('ADODB_PERF_NO_RUN_SQL',1);

Salida de ejemplo a continuacion:

ADOdb Performance Monitor for localhost, db=test
PostgreSQL 7.3.2 on i686-pc-cygwin, compiled by GCC gcc (GCC) 3.2 20020927 (prerelease)
Performance Stats   View SQL   View Tables   Poll Stats

postgres7

ParameterValueDescription
Ratios  
statistics collectorTRUEValue must be TRUE to enable hit ratio statistics (stats_start_collector,stats_row_level and stats_block_level must be set to true in postgresql.conf)
data cache hit ratio99.7967555299239 
IO  
data reads125 
data writes21.78125000000000000Count of inserts/updates/deletes * coef
Data Cache  
data cache buffers640Number of cache buffers. Tuning
cache blocksize8192(estimate)
data cache size5M 
operating system cache size80M(effective cache size)
Memory Usage  
sort buffer size1MSize of sort buffer (per query)
Connections  
current connections0 
max connections32 
Parameters  
rollback buffers8WAL buffers
random page cost4Cost of doing a seek (default=4). See random_page_cost

funcion HealthCheck()

Regresa los parametros de estado de salud de la base de datos como una tabla HTML. Se necesita mandar con echo o print la salida de esta funcion.

funcion HealthCheckCLI()

Regresa los parametros de estado de salus de la base de datos formatedoas para una interfase de comandos de linea (modo caracter). Se necesita mandar con echo o print la salida de esta funcion. Salida de ejemplo para mysql:

-- Ratios -- 
          MyISAM cache hit ratio => 56.5635738832 
          InnoDB cache hit ratio => 0 
             sql cache hit ratio => 0 
 -- IO -- 
                      data reads => 2622 
                     data writes => 2415.5 
 -- Data Cache -- 
          MyISAM data cache size => 512K 
             BDB data cache size => 8388600
          InnoDB data cache size => 8M
 -- Memory Pools -- 
                read buffer size => 131072 
                sort buffer size => 65528 
                     table cache => 4 
 -- Connections -- 
             current connections => 3
                 max connections => 100

funcion Poll($pollSecs=5)

Corre un bucle (loop) infinito, desplegando informacion cada $pollSecs segundos. NO funcionara adecuadamente si se activa 'output buffering'. En el siguiente ejemplo $pollSecs=3:

Accumulating statistics...
 Time   WS-CPU%   Hit%   Sess        Reads/s          Writes/s
11:08:30    0.7  56.56      1         0.0000            0.0000
11:08:33    1.8  56.56      2         0.0000            0.0000
11:08:36   11.1  56.55      3         2.5000            0.0000
11:08:39    9.8  56.55      2         3.1121            0.0000
11:08:42    2.8  56.55      1         0.0000            0.0000
11:08:45    7.4  56.55      2         0.0000            1.5000

WS-CPU% es la carga de CPU del servidor Web donde PHP esta corriendo (es decir el cliente de la base de datos), y no del servidor de base de datos. Hit% es el porcentaje de exito del cache de datos. Sess es la cantidad de sesiones conectadas a la base de datos. Si se usan conexiones persistentes, este no deberoa de cambiar mucho. Reads/s y Writes/s son valores artificiales para dar al usuario a guia tosca de E/S (I/O), no son para ser tomados literalmente.

funcion SuspiciousSQL($numsql=10)

Regresa como una tabla HTML los enunciados SQL que tinen un alto tiempo promedio de ejecucion. Cada enunciados SQL tiene una hiper liga a una nueva ventana con los detalles del plan de ejecucion y los nombres de los programas PHP que lo ejecutaron.

La cantidad de enunciados a regresar es determinado por $numsql. Los datos son tomados de la tabla adodb_logsql, ahi los enunciados sql son almacenados cuando se habilita la funcion $conn->LogSQL.

Para oracle, se usa Ixora Suspicious SQL que regresa una lista de los enunciados que usan mas la memoria cache. Esos son enunciados SQL con acceso intesivo de datos que se pueden beneficiar mas de una puesta a punto (tuning).

funcion ExpensiveSQL($numsql=10)

Regresa los SQL cuyo tiempo total de ejecucion (tiempo promedio * N° ejecuciones) es alto. Cada enunciado SQL tiene una hiper liga a una nueva ventana con los detalles del plan de ejecucion y los nombred de los programas que lo ejecutaron.

La cantidad de enunciados a mostrar es determinada por $numsql. Los datos son tomados de la tabla adodb_logsql, donde son almacenados cuando se habilita la funcion $conn->LogSQL.

Para Oracle, se usa Ixora Expensive SQL que regresa una lista de los enunciados que consumen la mayoria de la carga de CPU al ejecutarse.

funcion InvalidSQL($numsql=10)

Regresa una tabla HTML con la lista de los enunciados SQL invalidos.

Los datos se toman de la tabla adodb_logsql, donde los enunciados son almacenados cuando se habilita $connection->LogSQL(true).

funcion Tables($orderby=1)

Regresa informacion de todas las tablas de una base de datos, los primeros dos campos conteniendo el nombre de la tabla y su tamaņo, los campos restantes varian para cada manejador de base de datos. Si $orderby vale 1, la tabla se ordena por nombre. Si $orderby vale 2, la tabla se orden por el tamaņo de la tabla. Algunos drivers de bases de datos (mssql y mysql) ignoran la clausula $orderby. Para postgresql, la informacion esta a la fecha del ultimo vacuum. Actualmente no funciona para db2.

Funciones crudas

Las funciones crudas regresan los valores sin ningun formateo.

funcion DBParameter($paramname)

Regresa el valor de un parametro de la base de datos, tal como $this->DBParameter("data cache size").

funcion CPULoad()

Regresa la carga del CPU del cliente de la base de datos (NO DEL SERVIDOR) como un porcentaje. Solo funciona para Linux y Windows. Para Windows, WMI debe de estar disponible.

Formato de la Propiedad $settings

Para crear un nuevo parametro de la base de datos, se necesita entender la propiedad $settings. La estructura de datos de $settings es un arreglo asociativo. Cada elemento del arreglo define un parametro de la base de datos. La llave es el nombre del parametro de la base de datos. Si noy hay llave definida se considera como un corte de seccion, y el valor es el nombre del corte de seccion. Si esto te causa confusion, ver el codigo fuente te ayuda mucho.

El valor de cada parametro de la base de datos es a su ves un arreglo formado por los siguientes elementos:

  1. Codigo de categoria, usado para agrupar parametris relacionaddos, Si la categoria es 'HIDE', el parametro no se muestra cuando se invica en modo HTML().
  2. alguno de
    1. enunciado sql para obtener un valor, ej. "select value from v\$parameter where name='db_block_size'",
    2. arreglo conteniendo el enunciado sql y el campo a buscar, ej. array('show variables','table_cache'); un tercer parametro opcional es el $rs->fields[$index] a usar (por omision $index=1), y un cuarto parametro opcional es un constante para ser multiplacdo por el resultado (tipicamente vale 100 para calculo de porcentajes),
    3. una cadena empezando con =, en este caso se invoca un metodo PHP de la clase, e.j. para invocar $this->GetIndexValue(), el elemento del arreglo debe de valer '=GetIndexValue',
  3. Descripcion del parametro de la base de datos. Si la descripcion empieza con =, entonces se interpreta como un llamado a un metodo, como en el caso (1c) anterior, tomando un parametro, el valor actual. Ejemplo. '=GetIndexDescription' invocara $this->GetIndexDescription($val). Es util para generar sugerencias de ajustes. Para un ejemplo vea WarnCacheRatio().

Ejemplo para MySQL, parametro de la base de datos table_cache:

'table cache' => array('CACHE',            # codigo de categoria
   array("show variables", 'table_cache'), # arreglo (tipo 1b)
   'Number of tables to keep open'),       # descripcion

Ejemplo de Salida de un Estado de Salud (Health Check)

db2 informix mysql mssql oci8 postgres

db2

Parameter Value Description
Ratios  
data cache hit ratio 0    
Data Cache
data cache buffers 250   See tuning reference.
cache blocksize 4096    
data cache size 1000K    
Connections
current connections 2    

 

informix

ParameterVal ueDescription
Ratios  
data cache hit ratio95.89 
IO  
data reads1883884Page reads
data writes1716724Page writes
Connections  
current connections263.0Number of sessions

 

mysql

ParameterValueDescription
Ratios  
MyISAM cache hit ratio56.5658301822Cache ratio should be at least 90%
InnoDB cache hit ratio0Cache ratio should be at least 90%
sql cache hit ratio0 
IO  
data reads2622Number of selects (Key_reads is not accurate)
data writes2415.5Number of inserts/updates/deletes * coef (Key_writes is not accurate)
Data Cache  
MyISAM data cache size512K 
BDB data cache size8388600 
InnoDB data cache size8M 
Memory Pools  
read buffer size131072(per session)
sort buffer size65528Size of sort buffer (per session)
table cache4Number of tables to keep open
Connections  
current connections3 
max connections100 

 

mssql

ParameterValueDescription
Ratios  
data cache hit ratio99.9999694824 
prepared sql hit ratio99.7738579828 
adhoc sql hit ratio98.4540169133 
IO  
data reads2858 
data writes1438 
Data Cache  
data cache size4362in K
Connections  
current connections14 
max connections32767 

 

oci8

ParameterValueDescription
Ratios  
data cache hit ratio96.98 
sql cache hit ratio99.96 
IO  
data reads842938 
data writes16852 
Data Cache  
data cache buffers3072Number of cache buffers
data cache blocksize8192 
data cache size48Mshared_pool_size
Memory Pools  
java pool size0java_pool_size
sort buffer size512Ksort_area_size (per query)
user session buffer size8Mlarge_pool_size
Connections  
current connections1 
max connections170 
data cache utilization ratio88.46Percentage of data cache actually in use
user cache utilization ratio91.76Percentage of user cache (large_pool) actually in use
rollback segments11 
Transactions  
peak transactions24Taken from high-water-mark
max transactions187max transactions / rollback segments < 3.5 (or transactions_per_rollback_segment)
Parameters  
cursor sharingEXACTCursor reuse strategy. Recommended is FORCE (8i+) or SIMILAR (9i+). See cursor_sharing.
index cache cost0% of indexed data blocks expected in the cache. Recommended is 20-80. Default is 0. See optimizer_index_caching.
random page cost100Recommended is 10-50 for TP, and 50 for data warehouses. Default is 100. See optimizer_index_cost_adj.

Suspicious SQL

LOADEXECUTESSQL_TEXT
.73%89select u.name, o.name, t.spare1, t.pctfree$ from sys.obj$ o, sys.user$ u, sys.tab$ t where (bitand(t.trigflag, 1048576) = 1048576) and o.obj#=t.obj# and o.owner# = u.user# select i.obj#, i.flags, u.name, o.name from sys.obj$ o, sys.user$ u, sys.ind$ i where (bitand(i.flags, 256) = 256 or bitand(i.flags, 512) = 512) and (not((i.type# = 9) and bitand(i.flags,8) = 8)) and o.obj#=i.obj# and o.owner# = u.user#
.84%3select /*+ RULE */ distinct tabs.table_name, tabs.owner , partitioned, iot_type , TEMPORARY, table_type, table_type_owner from DBA_ALL_TABLES tabs where tabs.owner = :own
3.95%6SELECT round(count(1)*avg(buf.block_size)/1048576) FROM DBA_OBJECTS obj, V$BH bh, dba_segments seg, v$buffer_pool buf WHERE obj.object_id = bh.objd AND obj.owner != 'SYS' and obj.owner = seg.owner and obj.object_name = seg.segment_name and obj.object_type = seg.segment_type and seg.buffer_pool = buf.name and buf.name = 'DEFAULT'
4.50%6SELECT round(count(1)*avg(tsp.block_size)/1048576) FROM DBA_OBJECTS obj, V$BH bh, dba_segments seg, dba_tablespaces tsp WHERE obj.object_id = bh.objd AND obj.owner != 'SYS' and obj.owner = seg.owner and obj.object_name = seg.segment_name and obj.object_type = seg.segment_type and seg.tablespace_name = tsp.tablespace_name
57.34%9267select t.schema, t.name, t.flags, q.name from system.aq$_queue_tables t, sys.aq$_queue_table_affinities aft, system.aq$_queues q where aft.table_objno = t.objno and aft.owner_instance = :1 and q.table_objno = t.objno and q.usage = 0 and bitand(t.flags, 4+16+32+64+128+256) = 0 for update of t.name, aft.table_objno skip locked

Expensive SQL

LOADEXECUTESSQL_TEXT
5.24%1select round(sum(bytes)/1048576) from dba_segments
6.89%6SELECT round(count(1)*avg(buf.block_size)/1048576) FROM DBA_OBJECTS obj, V$BH bh, dba_segments seg, v$buffer_pool buf WHERE obj.object_id = bh.objd AND obj.owner != 'SYS' and obj.owner = seg.owner and obj.object_name = seg.segment_name and obj.object_type = seg.segment_type and seg.buffer_pool = buf.name and buf.name = 'DEFAULT'
7.85%6SELECT round(count(1)*avg(tsp.block_size)/1048576) FROM DBA_OBJECTS obj, V$BH bh, dba_segments seg, dba_tablespaces tsp WHERE obj.object_id = bh.objd AND obj.owner != 'SYS' and obj.owner = seg.owner and obj.object_name = seg.segment_name and obj.object_type = seg.segment_type and seg.tablespace_name = tsp.tablespace_name
33.69%89select u.name, o.name, t.spare1, t.pctfree$ from sys.obj$ o, sys.user$ u, sys.tab$ t where (bitand(t.trigflag, 1048576) = 1048576) and o.obj#=t.obj# and o.owner# = u.user#
36.44%89select i.obj#, i.flags, u.name, o.name from sys.obj$ o, sys.user$ u, sys.ind$ i where (bitand(i.flags, 256) = 256 or bitand(i.flags, 512) = 512) and (not((i.type# = 9) and bitand(i.flags,8) = 8)) and o.obj#=i.obj# and o.owner# = u.user#

postgres7

ParameterValueDescription
Ratios  
statistics collectorFALSEMust be set to TRUE to enable hit ratio statistics (stats_start_collector,stats_row_level and stats_block_level must be set to true in postgresql.conf)
data cache hit ratio99.9666031916603 
IO  
data reads15 
data writes0.000000000000000000Count of inserts/updates/deletes * coef
Data Cache  
data cache buffers1280Number of cache buffers. Tuning
cache blocksize8192(estimate)
data cache size10M 
operating system cache size80000K(effective cache size)
Memory Pools  
sort buffer size1MSize of sort buffer (per query)
Connections  
current connections13 
max connections32 
Parameters  
rollback buffers8WAL buffers
random page cost4Cost of doing a seek (default=4). See random_page_cost