phpgroupware-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Phpgroupware-cvs] phpgwapi/inc/adodb/perf/perf-mysql.inc.php, 1.1.2.1


From: nomail
Subject: [Phpgroupware-cvs] phpgwapi/inc/adodb/perf/perf-mysql.inc.php, 1.1.2.1
Date: Thu, 30 Dec 2004 05:51:48 +0100

Update of /phpgwapi/inc/adodb/perf
Added Files:
        Branch: proposed-0_9_18-branch
          perf-mysql.inc.php

date: 2004/12/30 04:51:48;  author: skwashd;  state: Exp;  lines: +259 -0

Log Message:
switch to ADOdb
=====================================================================
<?php
/* 
V4.54 5 Nov 2004  (c) 2000-2004 John Lim (address@hidden). All rights reserved.
  Released under both BSD license and Lesser GPL library license. 
  Whenever there is any discrepancy between the two licenses, 
  the BSD license will take precedence. See License.txt. 
  Set tabs to 4 for best viewing.
  
  Latest version is available at http://adodb.sourceforge.net
  
  Library for basic performance monitoring and tuning 
  
*/

// security - hide paths
if (!defined('ADODB_DIR')) die();

class perf_mysql extends adodb_perf{
        
        var $tablesSQL = 'show table status';
        
        var $createTableSQL = "CREATE TABLE adodb_logsql (
                  created datetime NOT NULL,
                  sql0 varchar(250) NOT NULL,
                  sql1 text NOT NULL,
                  params text NOT NULL,
                  tracer text NOT NULL,
                  timer decimal(16,6) NOT NULL
                )";
                
        var $settings = array(
        'Ratios',
                'MyISAM cache hit ratio' => array('RATIO',
                        '=GetKeyHitRatio',
                        '=WarnCacheRatio'),
                'InnoDB cache hit ratio' => array('RATIO',
                        '=GetInnoDBHitRatio',
                        '=WarnCacheRatio'),
                'data cache hit ratio' => array('HIDE', # only if called
                        '=FindDBHitRatio',
                        '=WarnCacheRatio'),
                'sql cache hit ratio' => array('RATIO',
                        '=GetQHitRatio',
                        ''),
        'IO',
                'data reads' => array('IO',
                        '=GetReads',
                        'Number of selects (Key_reads is not accurate)'),
                'data writes' => array('IO',
                        '=GetWrites',
                        'Number of inserts/updates/deletes * coef (Key_writes 
is not accurate)'),
                
        'Data Cache',
                'MyISAM data cache size' => array('DATAC',
                        array("show variables", 'key_buffer_size'),
                        '' ),
                'BDB data cache size' => array('DATAC',
                        array("show variables", 'bdb_cache_size'),
                        '' ),
                'InnoDB data cache size' => array('DATAC',
                        array("show variables", 'innodb_buffer_pool_size'),
                        '' ),
        'Memory Usage',
                'read buffer size' => array('CACHE',
                        array("show variables", 'read_buffer_size'),
                        '(per session)'),
                'sort buffer size' => array('CACHE',
                        array("show variables", 'sort_buffer_size'),
                        'Size of sort buffer (per session)' ),
                'table cache' => array('CACHE',
                        array("show variables", 'table_cache'),
                        'Number of tables to keep open'),
        'Connections',  
                'current connections' => array('SESS',
                        array('show status','Threads_connected'),
                        ''),
                'max connections' => array( 'SESS',
                        array("show variables",'max_connections'),
                        ''),
        
                false
        );
        
        function perf_mysql(&$conn)
        {
                $this->conn =& $conn;
        }
        
        function Explain($sql,$partial=false)
        {
                
                if (strtoupper(substr(trim($sql),0,6)) !== 'SELECT') return 
'<p>Unable to EXPLAIN non-select statement</p>';
                $save = $this->conn->LogSQL(false);
                if ($partial) {
                        $sqlq = $this->conn->qstr($sql.'%');
                        $arr = $this->conn->GetArray("select distinct sql1 from 
adodb_logsql where sql1 like $sqlq");
                        if ($arr) {
                                foreach($arr as $row) {
                                        $sql = reset($row);
                                        if (crc32($sql) == $partial) break;
                                }
                        }
                }
                $sql = str_replace('?',"''",$sql);
                
                if ($partial) {
                        $sqlq = $this->conn->qstr($sql.'%');
                        $sql = $this->conn->GetOne("select sql1 from 
adodb_logsql where sql1 like $sqlq");
                }
                
                $s = '<p><b>Explain</b>: '.htmlspecialchars($sql).'</p>';
                $rs = $this->conn->Execute('EXPLAIN '.$sql);
                $s .= rs2html($rs,false,false,false,false);
                $this->conn->LogSQL($save);
                $s .= $this->Tracer($sql);
                return $s;
        }
        
        function Tables()
        {
                if (!$this->tablesSQL) return false;
                
                $rs = $this->conn->Execute($this->tablesSQL);
                if (!$rs) return false;
                
                $html = rs2html($rs,false,false,false,false);
                return $html;
        }
        
        function GetReads()
        {
        global $ADODB_FETCH_MODE;
                $save = $ADODB_FETCH_MODE;
                $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
                $rs = $this->conn->Execute('show status');
                $ADODB_FETCH_MODE = $save;
                
                if (!$rs) return 0;
                $val = 0;
                while (!$rs->EOF) {
                        switch($rs->fields[0]) {
                        case 'Com_select': 
                                $val = $rs->fields[1];
                                $rs->Close();
                                return $val;
                        }
                        $rs->MoveNext();
                } 
                
                $rs->Close();
                
                return $val;
        }
        
        function GetWrites()
        {
        global $ADODB_FETCH_MODE;
                $save = $ADODB_FETCH_MODE;
                $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
                $rs = $this->conn->Execute('show status');
                $ADODB_FETCH_MODE = $save;
                
                if (!$rs) return 0;
                $val = 0.0;
                while (!$rs->EOF) {
                        switch($rs->fields[0]) {
                        case 'Com_insert': 
                                $val += $rs->fields[1]; break;
                        case 'Com_delete': 
                                $val += $rs->fields[1]; break;
                        case 'Com_update': 
                                $val += $rs->fields[1]/2;
                                $rs->Close();
                                return $val;
                        }
                        $rs->MoveNext();
                } 
                
                $rs->Close();
                
                return $val;
        }
        
        function FindDBHitRatio()
        {
                // first find out type of table
                //$this->conn->debug=1;
                $rs = $this->conn->Execute('show table status');
                if (!$rs) return '';
                $type = strtoupper($rs->fields[1]);
                $rs->Close();
                switch($type){
                case 'MYISAM':
                case 'ISAM':
                        return $this->DBParameter('MyISAM cache hit ratio').' 
(MyISAM)';
                case 'INNODB':
                        return $this->DBParameter('InnoDB cache hit ratio').' 
(InnoDB)';
                default:
                        return $type.' not supported';
                }
                
        }
        
        function GetQHitRatio()
        {
                //Total number of queries = Qcache_inserts + Qcache_hits + 
Qcache_not_cached
                $hits = $this->_DBParameter(array("show status","Qcache_hits"));
                $total = $this->_DBParameter(array("show 
status","Qcache_inserts"));
                $total += $this->_DBParameter(array("show 
status","Qcache_not_cached"));
                
                $total += $hits;
                if ($total) return ($hits*100)/$total;
                return 0;
        }
        
        /*
                Use session variable to store Hit percentage, because MySQL
                does not remember last value of SHOW INNODB STATUS hit ratio
                
                # 1st query to SHOW INNODB STATUS
                0.00 reads/s, 0.00 creates/s, 0.00 writes/s
                Buffer pool hit rate 1000 / 1000
                
                # 2nd query to SHOW INNODB STATUS
                0.00 reads/s, 0.00 creates/s, 0.00 writes/s
                No buffer pool activity since the last printout
        */
        function GetInnoDBHitRatio()
        {
        global $HTTP_SESSION_VARS;
        
                $rs = $this->conn->Execute('show innodb status');
                if (!$rs || $rs->EOF) return 0;
                $stat = $rs->fields[0];
                $rs->Close();
                $at = strpos($stat,'Buffer pool hit rate');
                $stat = substr($stat,$at,200);
                if (preg_match('!Buffer pool hit rate\s*([0-9]*) / 
([0-9]*)!',$stat,$arr)) {
                        $val = 100*$arr[1]/$arr[2];
                        $HTTP_SESSION_VARS['INNODB_HIT_PCT'] = $val;
                        return $val;
                } else {
                        if (isset($HTTP_SESSION_VARS['INNODB_HIT_PCT'])) return 
$HTTP_SESSION_VARS['INNODB_HIT_PCT'];
                        return 0;
                }
                return 0;
        }
        
        function GetKeyHitRatio()
        {
                $hits = $this->_DBParameter(array("show 
status","Key_read_requests"));
                $reqs = $this->_DBParameter(array("show status","Key_reads"));
                if ($reqs == 0) return 0;
                
                return ($hits/($reqs+$hits))*100;
        }
        
}
?>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]