[ Index ] |
|
Code source de vtiger CRM 5.0.2 |
1 <?php 2 /* 3 V4.90 8 June 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved. 4 Released under both BSD license and Lesser GPL library license. 5 Whenever there is any discrepancy between the two licenses, 6 the BSD license will take precedence. See License.txt. 7 Set tabs to 4 for best viewing. 8 9 Latest version is available at http://adodb.sourceforge.net 10 11 Library for basic performance monitoring and tuning 12 13 */ 14 15 // security - hide paths 16 if (!defined('ADODB_DIR')) die(); 17 18 class perf_mysql extends adodb_perf{ 19 20 var $tablesSQL = 'show table status'; 21 22 var $createTableSQL = "CREATE TABLE adodb_logsql ( 23 created datetime NOT NULL, 24 sql0 varchar(250) NOT NULL, 25 sql1 text NOT NULL, 26 params text NOT NULL, 27 tracer text NOT NULL, 28 timer decimal(16,6) NOT NULL 29 )"; 30 31 var $settings = array( 32 'Ratios', 33 'MyISAM cache hit ratio' => array('RATIO', 34 '=GetKeyHitRatio', 35 '=WarnCacheRatio'), 36 'InnoDB cache hit ratio' => array('RATIO', 37 '=GetInnoDBHitRatio', 38 '=WarnCacheRatio'), 39 'data cache hit ratio' => array('HIDE', # only if called 40 '=FindDBHitRatio', 41 '=WarnCacheRatio'), 42 'sql cache hit ratio' => array('RATIO', 43 '=GetQHitRatio', 44 ''), 45 'IO', 46 'data reads' => array('IO', 47 '=GetReads', 48 'Number of selects (Key_reads is not accurate)'), 49 'data writes' => array('IO', 50 '=GetWrites', 51 'Number of inserts/updates/deletes * coef (Key_writes is not accurate)'), 52 53 'Data Cache', 54 'MyISAM data cache size' => array('DATAC', 55 array("show variables", 'key_buffer_size'), 56 '' ), 57 'BDB data cache size' => array('DATAC', 58 array("show variables", 'bdb_cache_size'), 59 '' ), 60 'InnoDB data cache size' => array('DATAC', 61 array("show variables", 'innodb_buffer_pool_size'), 62 '' ), 63 'Memory Usage', 64 'read buffer size' => array('CACHE', 65 array("show variables", 'read_buffer_size'), 66 '(per session)'), 67 'sort buffer size' => array('CACHE', 68 array("show variables", 'sort_buffer_size'), 69 'Size of sort buffer (per session)' ), 70 'table cache' => array('CACHE', 71 array("show variables", 'table_cache'), 72 'Number of tables to keep open'), 73 'Connections', 74 'current connections' => array('SESS', 75 array('show status','Threads_connected'), 76 ''), 77 'max connections' => array( 'SESS', 78 array("show variables",'max_connections'), 79 ''), 80 81 false 82 ); 83 84 function perf_mysql(&$conn) 85 { 86 $this->conn =& $conn; 87 } 88 89 function Explain($sql,$partial=false) 90 { 91 92 if (strtoupper(substr(trim($sql),0,6)) !== 'SELECT') return '<p>Unable to EXPLAIN non-select statement</p>'; 93 $save = $this->conn->LogSQL(false); 94 if ($partial) { 95 $sqlq = $this->conn->qstr($sql.'%'); 96 $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq"); 97 if ($arr) { 98 foreach($arr as $row) { 99 $sql = reset($row); 100 if (crc32($sql) == $partial) break; 101 } 102 } 103 } 104 $sql = str_replace('?',"''",$sql); 105 106 if ($partial) { 107 $sqlq = $this->conn->qstr($sql.'%'); 108 $sql = $this->conn->GetOne("select sql1 from adodb_logsql where sql1 like $sqlq"); 109 } 110 111 $s = '<p><b>Explain</b>: '.htmlspecialchars($sql).'</p>'; 112 $rs = $this->conn->Execute('EXPLAIN '.$sql); 113 $s .= rs2html($rs,false,false,false,false); 114 $this->conn->LogSQL($save); 115 $s .= $this->Tracer($sql); 116 return $s; 117 } 118 119 function Tables() 120 { 121 if (!$this->tablesSQL) return false; 122 123 $rs = $this->conn->Execute($this->tablesSQL); 124 if (!$rs) return false; 125 126 $html = rs2html($rs,false,false,false,false); 127 return $html; 128 } 129 130 function GetReads() 131 { 132 global $ADODB_FETCH_MODE; 133 $save = $ADODB_FETCH_MODE; 134 $ADODB_FETCH_MODE = ADODB_FETCH_NUM; 135 if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); 136 137 $rs = $this->conn->Execute('show status'); 138 139 if (isset($savem)) $this->conn->SetFetchMode($savem); 140 $ADODB_FETCH_MODE = $save; 141 142 if (!$rs) return 0; 143 $val = 0; 144 while (!$rs->EOF) { 145 switch($rs->fields[0]) { 146 case 'Com_select': 147 $val = $rs->fields[1]; 148 $rs->Close(); 149 return $val; 150 } 151 $rs->MoveNext(); 152 } 153 154 $rs->Close(); 155 156 return $val; 157 } 158 159 function GetWrites() 160 { 161 global $ADODB_FETCH_MODE; 162 $save = $ADODB_FETCH_MODE; 163 $ADODB_FETCH_MODE = ADODB_FETCH_NUM; 164 if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); 165 166 $rs = $this->conn->Execute('show status'); 167 168 if (isset($savem)) $this->conn->SetFetchMode($savem); 169 $ADODB_FETCH_MODE = $save; 170 171 if (!$rs) return 0; 172 $val = 0.0; 173 while (!$rs->EOF) { 174 switch($rs->fields[0]) { 175 case 'Com_insert': 176 $val += $rs->fields[1]; break; 177 case 'Com_delete': 178 $val += $rs->fields[1]; break; 179 case 'Com_update': 180 $val += $rs->fields[1]/2; 181 $rs->Close(); 182 return $val; 183 } 184 $rs->MoveNext(); 185 } 186 187 $rs->Close(); 188 189 return $val; 190 } 191 192 function FindDBHitRatio() 193 { 194 // first find out type of table 195 //$this->conn->debug=1; 196 197 global $ADODB_FETCH_MODE; 198 $save = $ADODB_FETCH_MODE; 199 $ADODB_FETCH_MODE = ADODB_FETCH_NUM; 200 if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); 201 202 $rs = $this->conn->Execute('show table status'); 203 204 if (isset($savem)) $this->conn->SetFetchMode($savem); 205 $ADODB_FETCH_MODE = $save; 206 207 if (!$rs) return ''; 208 $type = strtoupper($rs->fields[1]); 209 $rs->Close(); 210 switch($type){ 211 case 'MYISAM': 212 case 'ISAM': 213 return $this->DBParameter('MyISAM cache hit ratio').' (MyISAM)'; 214 case 'INNODB': 215 return $this->DBParameter('InnoDB cache hit ratio').' (InnoDB)'; 216 default: 217 return $type.' not supported'; 218 } 219 220 } 221 222 function GetQHitRatio() 223 { 224 //Total number of queries = Qcache_inserts + Qcache_hits + Qcache_not_cached 225 $hits = $this->_DBParameter(array("show status","Qcache_hits")); 226 $total = $this->_DBParameter(array("show status","Qcache_inserts")); 227 $total += $this->_DBParameter(array("show status","Qcache_not_cached")); 228 229 $total += $hits; 230 if ($total) return round(($hits*100)/$total,2); 231 return 0; 232 } 233 234 /* 235 Use session variable to store Hit percentage, because MySQL 236 does not remember last value of SHOW INNODB STATUS hit ratio 237 238 # 1st query to SHOW INNODB STATUS 239 0.00 reads/s, 0.00 creates/s, 0.00 writes/s 240 Buffer pool hit rate 1000 / 1000 241 242 # 2nd query to SHOW INNODB STATUS 243 0.00 reads/s, 0.00 creates/s, 0.00 writes/s 244 No buffer pool activity since the last printout 245 */ 246 function GetInnoDBHitRatio() 247 { 248 global $ADODB_FETCH_MODE; 249 250 $save = $ADODB_FETCH_MODE; 251 $ADODB_FETCH_MODE = ADODB_FETCH_NUM; 252 if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); 253 254 $rs = $this->conn->Execute('show innodb status'); 255 256 if (isset($savem)) $this->conn->SetFetchMode($savem); 257 $ADODB_FETCH_MODE = $save; 258 259 if (!$rs || $rs->EOF) return 0; 260 $stat = $rs->fields[0]; 261 $rs->Close(); 262 $at = strpos($stat,'Buffer pool hit rate'); 263 $stat = substr($stat,$at,200); 264 if (preg_match('!Buffer pool hit rate\s*([0-9]*) / ([0-9]*)!',$stat,$arr)) { 265 $val = 100*$arr[1]/$arr[2]; 266 $_SESSION['INNODB_HIT_PCT'] = $val; 267 return round($val,2); 268 } else { 269 if (isset($_SESSION['INNODB_HIT_PCT'])) return $_SESSION['INNODB_HIT_PCT']; 270 return 0; 271 } 272 return 0; 273 } 274 275 function GetKeyHitRatio() 276 { 277 $hits = $this->_DBParameter(array("show status","Key_read_requests")); 278 $reqs = $this->_DBParameter(array("show status","Key_reads")); 279 if ($reqs == 0) return 0; 280 281 return round(($hits/($reqs+$hits))*100,2); 282 } 283 284 // start hack 285 var $optimizeTableLow = 'CHECK TABLE %s FAST QUICK'; 286 var $optimizeTableHigh = 'OPTIMIZE TABLE %s'; 287 288 /** 289 * @see adodb_perf#optimizeTable 290 */ 291 function optimizeTable( $table, $mode = ADODB_OPT_LOW) 292 { 293 if ( !is_string( $table)) return false; 294 295 $conn = $this->conn; 296 if ( !$conn) return false; 297 298 $sql = ''; 299 switch( $mode) { 300 case ADODB_OPT_LOW : $sql = $this->optimizeTableLow; break; 301 case ADODB_OPT_HIGH : $sql = $this->optimizeTableHigh; break; 302 default : 303 { 304 // May dont use __FUNCTION__ constant for BC (__FUNCTION__ Added in PHP 4.3.0) 305 ADOConnection::outp( sprintf( "<p>%s: '%s' using of undefined mode '%s'</p>", __CLASS__, __FUNCTION__, $mode)); 306 return false; 307 } 308 } 309 $sql = sprintf( $sql, $table); 310 311 return $conn->Execute( $sql) !== false; 312 } 313 // end hack 314 } 315 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sun Feb 25 10:22:19 2007 | par Balluche grâce à PHPXref 0.7 |