| Current Path : /var/www/element/data/www/greenpr.ru/bitrix3/modules/perfmon/admin/ |
| Current File : /var/www/element/data/www/greenpr.ru/bitrix3/modules/perfmon/admin/perfmon_db_server.php |
<?
define("ADMIN_MODULE_NAME", "perfmon");
define("PERFMON_STOP", true);
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/perfmon/include.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/perfmon/prolog.php");
IncludeModuleLangFile(__FILE__);
$RIGHT = $APPLICATION->GetGroupRight("perfmon");
if($RIGHT=="D")
$APPLICATION->AuthForm(GetMessage("ACCESS_DENIED"));
$strError = "";
$data = array();
if($DB->type == "MYSQL")
{
$vars = array();
$rs = $DB->Query("SHOW VARIABLES");
while($ar = $rs->Fetch())
$vars[$ar["Variable_name"]] = $ar["Value"];
$stat = array();
$rs = $DB->Query("SHOW GLOBAL STATUS", true);
if(!$rs)
$rs = $DB->Query("SHOW STATUS", true);
while($ar = $rs->Fetch())
$stat[$ar["Variable_name"]] = $ar["Value"];
$data = array(
array(
"TITLE" => GetMessage("PERFMON_STATUS_TITLE"),
"HEADERS" => array(
array(
"id" => "KPI_NAME",
"content" => GetMessage("PERFMON_KPI_NAME"),
"default" => true,
),
array(
"id" => "KPI_VALUE",
"content" => GetMessage("PERFMON_KPI_VALUE"),
"align" => "right",
"default" => true,
),
array(
"id" => "KPI_RECOMMENDATION",
"content" => GetMessage("PERFMON_KPI_RECOMENDATION"),
"default" => true,
),
),
"ITEMS" => array(
array(
"KPI_NAME" => GetMessage("PERFMON_KPI_NAME_KEY_READS"),
"KPI_VALUE" => round($stat["Key_reads"]/$stat["Key_read_requests"]*100,2)."%",
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_REC_KEY_READS", array("#VALUE#"=>perfmon_SizeFormat($vars["key_buffer_size"]))),
),
array(
"KPI_NAME" => GetMessage("PERFMON_KPI_NAME_QCACHE"),
"KPI_VALUE" => ($stat["Qcache_hits"] != 0?
round($stat["Qcache_inserts"]/$stat["Qcache_hits"]*100,2)."%"
:GetMessage("PERFMON_KPI_REC_QCACHE_OFF")
),
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_REC_QCACHE", array("#VALUE#"=>perfmon_SizeFormat($vars["query_cache_size"]))),
),
array(
"KPI_NAME" => GetMessage("PERFMON_KPI_NAME_INNODB_LOG_WAITS"),
"KPI_VALUE" => $stat["Innodb_log_waits"],
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_REC_INNODB_LOG_WAITS", array("#VALUE#"=>perfmon_SizeFormat($vars["innodb_log_file_size"]))),
),
array(
"KPI_NAME" => GetMessage("PERFMON_KPI_NAME_THREADS"),
"KPI_VALUE" => round($stat["Threads_created"]/$stat["Connections"]*100,2)."%",
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_REC_THREADS", array("#VALUE#"=>perfmon_SizeFormat($vars["thread_cache_size"]))),
),
array(
"KPI_NAME" => GetMessage("PERFMON_KPI_NAME_BINLOG"),
"KPI_VALUE" => $stat["Binlog_cache_disk_use"],
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_REC_BINLOG", array("#VALUE#"=>perfmon_SizeFormat($vars["binlog_cache_size"]))),
),
array(
"KPI_NAME" => GetMessage("PERFMON_KPI_NAME_TMP_DISK"),
"KPI_VALUE" => $stat["Created_tmp_disk_tables"],
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_REC_TMP_DISK", array("#VALUE#"=>perfmon_SizeFormat($vars["tmp_table_size"]))),
),
array(
"KPI_NAME" => GetMessage("PERFMON_KPI_NAME_OPENED_TABLES"),
"KPI_VALUE" => $stat["Opened_tables"],
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_REC_OPENED_TABLES", array("#VALUE#"=>$vars["table_cache"])),
),
array(
"KPI_NAME" => GetMessage("PERFMON_KPI_NAME_SORT_MERGE"),
"KPI_VALUE" => $stat["Sort_merge_passes"],
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_REC_SORT_MERGE", array("#VALUE#"=>perfmon_SizeFormat($vars["sort_buffer_size"]))),
),
array(
"KPI_NAME" => GetMessage("PERFMON_KPI_NAME_SELECT_FULL_JOIN"),
"KPI_VALUE" => $stat["Select_full_join"],
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_REC_SELECT_FULL_JOIN"),
),
array(
"KPI_NAME" => GetMessage("PERFMON_KPI_NAME_SELECT_RANGE_CHECK"),
"KPI_VALUE" => $stat["Select_range_check"],
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_REC_SELECT_RANGE_CHECK"),
),
array(
"KPI_NAME" => GetMessage("PERFMON_KPI_NAME_SELECT_SCAN"),
"KPI_VALUE" => $stat["Select_scan"],
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_REC_SELECT_SCAN"),
),
),
)
);
}
elseif($DB->type == "ORACLE")
{
$module_name = "";
$rs = $DB->Query("
select
event as WAIT_EVENT
,round(RATIO_TO_REPORT(sum(time_waited)) OVER ()*100,2) AS PCTTOT
,round(avg(average_wait)*10,2) as AVERAGE_WAIT_MS
from
v\$session_event
where sid in (
select sid
from v\$session
where UPPER(program) like '%'||UPPER('$module_name')||'%'
and LOGON_TIME > sysdate-1/24
and SERIAL# not in (1)
and PROGRAM not like '%QMNC%'
and UPPER(PROGRAM) not like '%Q0%'
and UPPER(PROGRAM) not like '%J0%'
)
and event not in (
'AQ Proxy Cleanup Wait',
'ASM background timer',
'DIAG idle wait',
'EMON idle wait',
'KSV master wait',
'LNS ASYNC archive log',
'LNS ASYNC dest activation',
'LNS ASYNC end of log',
'LogMiner: client waiting for transaction',
'LogMiner: slave waiting for activate message',
'LogMiner: wakeup event for builder',
'LogMiner: wakeup event for preparer',
'LogMiner: wakeup event for reader',
'Null event',
'PX Deq Credit: need buffer',
'PX Deq Credit: send blkd',
'PX Deq: Execute Reply',
'PX Deq: Execution Msg',
'PX Deq: Par Recov Execute',
'PX Deq: Signal ACK',
'PX Deq: Table Q Normal',
'PX Deq: Table Q Sample',
'PX Deque wait',
'PX Idle Wait',
'Queue Monitor Shutdown Wait',
'Queue Monitor Slave Wait',
'Queue Monitor Wait',
'SQL*Net message from client',
'SQL*Net message to client',
'SQL*Net more data from client',
'STREAMS apply coord waiting for slave message',
'STREAMS apply slave idle wait',
'STREAMS apply slave waiting for coord message',
'STREAMS capture process filter callback wait for ruleset',
'STREAMS fetch slave waiting for txns',
'STREAMS waiting for subscribers to catch up',
'Streams AQ: RAC qmn coordinator idle wait',
'Streams AQ: deallocate messages from Streams Pool',
'Streams AQ: delete acknowledged messages',
'Streams AQ: qmn coordinator idle wait',
'Streams AQ: qmn slave idle wait',
'Streams AQ: waiting for messages in the queue',
'Streams AQ: waiting for time management or cleanup tasks',
'Streams fetch slave: waiting for txns',
'class slave wait',
'client message',
'dispatcher timer',
'gcs for action',
'gcs remote message',
'ges remote message',
'i/o slave wait',
'jobq slave wait',
'knlqdeq',
'lock manager wait for remote message',
'master wait',
'null event',
'parallel query dequeue',
'pipe get',
'pmon timer',
'queue messages',
'rdbms ipc message',
'slave wait',
'smon timer',
'virtual circuit status',
'wait for activate message',
'wait for unread message on broadcast channel',
'wakeup event for builder',
'wakeup event for preparer',
'wakeup event for reader',
'wakeup time manager'
)
and average_wait > 1/100
group by event
order by PCTTOT desc
", true);
if(!$rs)
{
$strError = GetMessage("PERFMON_KPI_ORA_PERMISSIONS");
}
else
{
$data[0] = array(
"TITLE" => GetMessage("PERFMON_WAITS_TITLE"),
"HEADERS" => array(
array(
"id" => "WAIT_EVENT",
"content" => GetMessage("PERFMON_WAIT_EVENT"),
"default" => true,
),
array(
"id" => "WAIT_PCT",
"content" => GetMessage("PERFMON_WAIT_PCT"),
"align" => "right",
"default" => true,
),
array(
"id" => "WAIT_AVERAGE_WAIT_MS",
"content" => GetMessage("PERFMON_WAIT_AVERAGE_WAIT_MS"),
"align" => "right",
"default" => true,
),
array(
"id" => "KPI_RECOMMENDATION",
"content" => GetMessage("PERFMON_KPI_RECOMENDATION"),
"default" => true,
),
),
"ITEMS" => array(
),
);
while($ar = $rs->Fetch())
$data[0]["ITEMS"][] = array(
"WAIT_EVENT" => $ar["WAIT_EVENT"],
"WAIT_PCT" => $ar["PCTTOT"]."%",
"WAIT_AVERAGE_WAIT_MS" => $ar["AVERAGE_WAIT_MS"],
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_ORA_REC_".strtoupper(str_replace(array(" ",":","*"), "_", $ar["WAIT_EVENT"]))),
);
$param = array();
$rs = $DB->Query("SELECT NAME,VALUE from v\$parameter");
while($ar = $rs->Fetch())
$param[$ar["NAME"]] = $ar["VALUE"];
$data[1] = array(
"TITLE" => GetMessage("PERFMON_PARAMETERS_TITLE"),
"HEADERS" => array(
array(
"id" => "PARAMETER_NAME",
"content" => GetMessage("PERFMON_PARAMETER_NAME"),
"default" => true,
),
array(
"id" => "PARAMETER_VALUE",
"content" => GetMessage("PERFMON_PARAMETER_VALUE"),
"align" => "right",
"default" => true,
),
array(
"id" => "REC_PARAMETER_VALUE",
"content" => GetMessage("PERFMON_REC_PARAMETER_VALUE"),
"align" => "right",
"default" => true,
),
array(
"id" => "KPI_RECOMMENDATION",
"content" => GetMessage("PERFMON_KPI_RECOMENDATION"),
"default" => true,
),
),
"ITEMS" => array(
array(
"PARAMETER_NAME" => "db_block_checksum",
"PARAMETER_VALUE" => $param["db_block_checksum"],
"REC_PARAMETER_VALUE" => "FALSE",
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_ORA_REC_DB_BLOCK_CHECKSUM"),
),
array(
"PARAMETER_NAME" => "session_cached_cursors",
"PARAMETER_VALUE" => $param["session_cached_cursors"],
"REC_PARAMETER_VALUE" => "100",
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_ORA_REC_SESSION_CACHED_CURSORS"),
),
array(
"PARAMETER_NAME" => "cursor_sharing",
"PARAMETER_VALUE" => $param["cursor_sharing"],
"REC_PARAMETER_VALUE" => "FORCE",
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_ORA_REC_CURSOR_SHARING_FORCE"),
),
array(
"PARAMETER_NAME" => "cursor_sharing",
"PARAMETER_VALUE" => $param["cursor_sharing"],
"REC_PARAMETER_VALUE" => "SIMILAR",
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_ORA_REC_CURSOR_SHARING_SIMILAR"),
),
array(
"PARAMETER_NAME" => "parallel_max_servers",
"PARAMETER_VALUE" => $param["parallel_max_servers"],
"REC_PARAMETER_VALUE" => "0",
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_ORA_REC_PARALLEL_MAX_SERVERS"),
),
array(
"PARAMETER_NAME" => "commit_write",
"PARAMETER_VALUE" => $param["commit_write"],
"REC_PARAMETER_VALUE" => "BATCH,NOWAIT",
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_ORA_REC_COMMIT_WRITE"),
),
array(
"PARAMETER_NAME" => "open_cursors",
"PARAMETER_VALUE" => $param["open_cursors"],
"REC_PARAMETER_VALUE" => "300",
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_ORA_REC_OPEN_CURSORS"),
),
array(
"PARAMETER_NAME" => "optimizer_mode",
"PARAMETER_VALUE" => $param["optimizer_mode"],
"REC_PARAMETER_VALUE" => "FIRST_ROWS",
"KPI_RECOMMENDATION" => GetMessage("PERFMON_KPI_ORA_REC_OPTIMIZER_MODE"),
),
),
);
$rs = $DB->Query("
SELECT
USER USER_NAME,
".$DB->DateToCharFunction('min(min_last_analyzed)')." MIN_LAST_ANALYZED,
".$DB->DateToCharFunction('max(max_last_analyzed)')." MAX_LAST_ANALYZED,
case
when (min(min_last_analyzed) < (sysdate - 7)) or (max(max_last_analyzed) < (sysdate - 7)) then 'OLD'
else 'NEW'
end FLAG
from (
select min(last_analyzed) min_last_analyzed, max(last_analyzed) max_last_analyzed from dba_indexes
where owner = user
union all
select min(last_analyzed) min_last_analyzed, max(last_analyzed) max_last_analyzed from dba_tables
where owner = user
)
");
$stat = $rs->Fetch();
$data[2] = array(
"TITLE" => GetMessage("PERFMON_STATS_TITLE"),
"HEADERS" => array(
array(
"id" => "USER_NAME",
"content" => GetMessage("PERFMON_USER_NAME"),
"default" => true,
),
array(
"id" => "MIN_LAST_ANALYZED",
"content" => GetMessage("PERFMON_MIN_LAST_ANALYZED"),
"align" => "right",
"default" => true,
),
array(
"id" => "MAX_LAST_ANALYZED",
"content" => GetMessage("PERFMON_MAX_LAST_ANALYZED"),
"align" => "right",
"default" => true,
),
array(
"id" => "KPI_RECOMMENDATION",
"content" => GetMessage("PERFMON_KPI_RECOMENDATION"),
"default" => true,
),
),
"ITEMS" => array(
array(
"USER_NAME" => $stat["USER_NAME"],
"MIN_LAST_ANALYZED" => $stat["MIN_LAST_ANALYZED"],
"MAX_LAST_ANALYZED" => $stat["MAX_LAST_ANALYZED"],
"KPI_RECOMMENDATION" => ($stat["FLAG"] == "NEW"?
GetMessage("PERFMON_KPI_ORA_REC_STATS_NEW", array("#USER_NAME#" => $stat["USER_NAME"])):
GetMessage("PERFMON_KPI_ORA_REC_STATS_OLD", array("#USER_NAME#" => $stat["USER_NAME"]))
),
),
),
);
}
}
elseif($DB->type == "MSSQL")
{
}
$sTableID = "tbl_perfmon_db_server";
$APPLICATION->SetTitle(GetMessage("PERFMON_DB_SERVER_TITLE"));
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php");
ShowError($strError);
if(count($data))
{
foreach($data as $i => $arTable)
{
$lAdmin = new CAdminList($sTableID.$i);
$lAdmin->BeginPrologContent();
if(array_key_exists("TITLE", $arTable))
echo "<h3>".$arTable["TITLE"]."</h3\n";
$lAdmin->EndPrologContent();
$lAdmin->AddHeaders($arTable["HEADERS"]);
$rsData = new CDBResult;
$rsData->InitFromArray($arTable["ITEMS"]);
$rsData = new CAdminResult($rsData, $sTableID);
$j = 0;
while($arRes = $rsData->NavNext(true, "f_"))
{
$row =& $lAdmin->AddRow($j++, $arRes);
foreach($arRes as $key => $value)
$row->AddViewField($key, $value);
//$row->AddViewField("KPI_RECOMMENDATION", $arRes["KPI_RECOMMENDATION"]);
}
$lAdmin->CheckListMode();
$lAdmin->DisplayList();
}
}
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php");
?>