Re-write CPU usage calculation to avoid sleep in AJAX call

This commit is contained in:
Steve Beaver 2017-08-17 11:04:59 -04:00
parent cc28e9b1d3
commit acd2f3120c
2 changed files with 47 additions and 42 deletions

View File

@ -79,29 +79,13 @@ function get_uptime() {
return $uptimestr;
}
/* Calculates non-idle CPU time and returns as a percentage */
// Returns the current total ticks and user ticks. The dashboard widget calculates the load from that
function cpu_usage() {
$duration = 1;
$diff = array('user', 'nice', 'sys', 'intr', 'idle');
$cpuTicks = array_combine($diff, explode(" ", get_single_sysctl('kern.cp_time')));
sleep($duration);
$cpuTicks2 = array_combine($diff, explode(" ", get_single_sysctl('kern.cp_time')));
$totalStart = array_sum($cpuTicks);
$totalEnd = array_sum($cpuTicks2);
// Something wrapped ?!?!
if ($totalEnd <= $totalStart) {
return 0;
}
// Calculate total cycles used
$totalUsed = ($totalEnd - $totalStart) - ($cpuTicks2['idle'] - $cpuTicks['idle']);
// Calculate the percentage used
$cpuUsage = floor(100 * ($totalUsed / ($totalEnd - $totalStart)));
return $cpuUsage;
return array_sum($cpuTicks) . "|" . $cpuTicks['idle'];
}
function get_pfstate($percent=false) {

View File

@ -389,7 +389,7 @@ $rows_displayed = false;
</div>
</div>
<?php $update_period = (!empty($config['widgets']['period'])) ? $config['widgets']['period'] : "10"; ?>
<span id="cpumeter"><?=sprintf(gettext("Updating in %s seconds"), $update_period)?></span>
<span id="cpumeter"><?=sprintf(gettext("Retrieving CPU data %s"), "<i class=\"fa fa-gear fa-spin\"></i>")?></span>
</td>
</tr>
<?php
@ -508,7 +508,8 @@ $rows_displayed = false;
//<![CDATA[
<?php if ($widget_first_instance): ?>
var update_interval = "<?=$widgetperiod?>";
var lastTotal = 0;
var lastUsed = 0;
function setProgress(barName, percent) {
$('[id="' + barName + '"]').css('width', percent + '%').attr('aria-valuenow', percent);
@ -523,17 +524,23 @@ function stats(x) {
return false;
}))
updateUptime(values[2]);
updateDateTime(values[5]);
updateCPU(values[0]);
updateMemory(values[1]);
updateState(values[3]);
updateTemp(values[4]);
updateCpuFreq(values[6]);
updateLoadAverage(values[7]);
updateMbuf(values[8]);
updateMbufMeter(values[9]);
updateStateMeter(values[10]);
if (lastTotal === 0) {
lastTotal = values[0];
lastUsed = values[1];
} else {
updateCPU(values[0], values[1]);
}
updateUptime(values[3]);
updateDateTime(values[6]);
updateMemory(values[2]);
updateState(values[4]);
updateTemp(values[5]);
updateCpuFreq(values[7]);
updateLoadAverage(values[8]);
updateMbuf(values[9]);
updateMbufMeter(values[10]);
updateStateMeter(values[11]);
}
function updateMemory(x) {
@ -560,19 +567,33 @@ function updateMbufMeter(x) {
}
}
function updateCPU(x) {
function updateCPU(total, used) {
if ($('#cpumeter')) {
$('[id="cpumeter"]').html(x + '%');
}
if ($('#cpuPB')) {
setProgress('cpuPB', parseInt(x));
// Just in case it wraps
if ((lastTotal <= total) && (lastUsed <= used)) {
// Calculate the total ticks and the used ticks sine the last time it was checked
var d_total = total - lastTotal;
var d_used = used - lastUsed;
// Convert to percent
var x = Math.trunc( ((d_total - d_used)/d_total) * 100);
if ($('#cpumeter')) {
$('[id="cpumeter"]').html(x + '%');
}
if ($('#cpuPB')) {
setProgress('cpuPB', parseInt(x));
}
/* Load CPU Graph widget if enabled */
if (widgetActive('cpu_graphs')) {
GraphValue(graph[0], x);
}
}
/* Load CPU Graph widget if enabled */
if (widgetActive('cpu_graphs')) {
GraphValue(graph[0], x);
}
lastTotal = total;
lastUsed = used;
}
function updateTemp(x) {