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
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:
$perf->HealthCheck() o $perf->HealthCheckCLI().
$perf->UI().
Esta interfas de usuario (UI) muestra:
$perf->DBParameter('data cache hit ratio') regresa este importante
valor estadistico de una manera independiente de la base de datos.
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.
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.
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 | ||
| Parameter | Value | Description |
| Ratios | ||
| statistics collector | TRUE | Value 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 ratio | 99.7967555299239 | |
| IO | ||
| data reads | 125 | |
| data writes | 21.78125000000000000 | Count of inserts/updates/deletes * coef |
| Data Cache | ||
| data cache buffers | 640 | Number of cache buffers. Tuning |
| cache blocksize | 8192 | (estimate) |
| data cache size | 5M | |
| operating system cache size | 80M | (effective cache size) |
| Memory Usage | ||
| sort buffer size | 1M | Size of sort buffer (per query) |
| Connections | ||
| current connections | 0 | |
| max connections | 32 | |
| Parameters | ||
| rollback buffers | 8 | WAL buffers |
| random page cost | 4 | Cost 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.
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.
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:
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
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 | ||
| Parameter | Val ue | Description |
| Ratios | ||
| data cache hit ratio | 95.89 | |
| IO | ||
| data reads | 1883884 | Page reads |
| data writes | 1716724 | Page writes |
| Connections | ||
| current connections | 263.0 | Number of sessions |
mysql | ||
| Parameter | Value | Description |
| Ratios | ||
| MyISAM cache hit ratio | 56.5658301822 | Cache ratio should be at least 90% |
| InnoDB cache hit ratio | 0 | Cache ratio should be at least 90% |
| sql cache hit ratio | 0 | |
| IO | ||
| data reads | 2622 | Number of selects (Key_reads is not accurate) |
| data writes | 2415.5 | Number of inserts/updates/deletes * coef (Key_writes is not accurate) |
| Data Cache | ||
| MyISAM data cache size | 512K | |
| BDB data cache size | 8388600 | |
| InnoDB data cache size | 8M | |
| Memory Pools | ||
| read buffer size | 131072 | (per session) |
| sort buffer size | 65528 | Size of sort buffer (per session) |
| table cache | 4 | Number of tables to keep open |
| Connections | ||
| current connections | 3 | |
| max connections | 100 | |
mssql | ||
| Parameter | Value | Description |
| Ratios | ||
| data cache hit ratio | 99.9999694824 | |
| prepared sql hit ratio | 99.7738579828 | |
| adhoc sql hit ratio | 98.4540169133 | |
| IO | ||
| data reads | 2858 | |
| data writes | 1438 | |
| Data Cache | ||
| data cache size | 4362 | in K |
| Connections | ||
| current connections | 14 | |
| max connections | 32767 | |
oci8 | ||
| Parameter | Value | Description |
| Ratios | ||
| data cache hit ratio | 96.98 | |
| sql cache hit ratio | 99.96 | |
| IO | ||
| data reads | 842938 | |
| data writes | 16852 | |
| Data Cache | ||
| data cache buffers | 3072 | Number of cache buffers |
| data cache blocksize | 8192 | |
| data cache size | 48M | shared_pool_size |
| Memory Pools | ||
| java pool size | 0 | java_pool_size |
| sort buffer size | 512K | sort_area_size (per query) |
| user session buffer size | 8M | large_pool_size |
| Connections | ||
| current connections | 1 | |
| max connections | 170 | |
| data cache utilization ratio | 88.46 | Percentage of data cache actually in use |
| user cache utilization ratio | 91.76 | Percentage of user cache (large_pool) actually in use |
| rollback segments | 11 | |
| Transactions | ||
| peak transactions | 24 | Taken from high-water-mark |
| max transactions | 187 | max transactions / rollback segments < 3.5 (or transactions_per_rollback_segment) |
| Parameters | ||
| cursor sharing | EXACT | Cursor reuse strategy. Recommended is FORCE (8i+) or SIMILAR (9i+). See cursor_sharing. |
| index cache cost | 0 | % of indexed data blocks expected in the cache. Recommended is 20-80. Default is 0. See optimizer_index_caching. |
| random page cost | 100 | Recommended is 10-50 for TP, and 50 for data warehouses. Default is 100. See optimizer_index_cost_adj. |
| LOAD | EXECUTES | SQL_TEXT |
| .73% | 89 | select 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% | 3 | select /*+ 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% | 6 | SELECT 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% | 6 | SELECT 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% | 9267 | select 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 |
| LOAD | EXECUTES | SQL_TEXT |
| 5.24% | 1 | select round(sum(bytes)/1048576) from dba_segments |
| 6.89% | 6 | SELECT 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% | 6 | SELECT 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% | 89 | select 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% | 89 | 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# |
postgres7 | ||
| Parameter | Value | Description |
| Ratios | ||
| statistics collector | FALSE | Must 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 ratio | 99.9666031916603 | |
| IO | ||
| data reads | 15 | |
| data writes | 0.000000000000000000 | Count of inserts/updates/deletes * coef |
| Data Cache | ||
| data cache buffers | 1280 | Number of cache buffers. Tuning |
| cache blocksize | 8192 | (estimate) |
| data cache size | 10M | |
| operating system cache size | 80000K | (effective cache size) |
| Memory Pools | ||
| sort buffer size | 1M | Size of sort buffer (per query) |
| Connections | ||
| current connections | 13 | |
| max connections | 32 | |
| Parameters | ||
| rollback buffers | 8 | WAL buffers |
| random page cost | 4 | Cost of doing a seek (default=4). See random_page_cost |