Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Ύστερα από έρευνα στο διαδίκτυο, κατέληξα να συνθέσω το ακόλουθο script.

Όταν ο χρήστης πατάει το κουμπί MONITORING SERVER, τότε αρχίζε μία setInterval που δείχνει "ζωντανά" με AJAX την κατάσταση των πόρων του server.

 

Η ερωτήσεις μου:

1. Οι πιο ειδικοί πως το βλέπετε το script; Δίχνει όντως σωστά αποτελέσματα;

2. Δοκίμασα να το τρέξω σε localhost (XAMPP - Windows 10) και φαίνονται σωστά τα αποτελέσματα, όμως όταν το έβαλα στο site (VPS, Linux), το CPU load παίρνει μονίμως τιμές 0,κάτι ή 0,0κάτι. Είναι σωστό αυτό; Ή μήπως σε Windows η PHP function δίνει ποσοστό επί τοις 100 ενώ σε Linux πρέπει να κάνω πολλαπλασιασμό με το 100; Επίσης η RAM φαίνεται μονίμως στο 90% κάτι, που δεν είμαι τόσο σίγουρος ότι είναι σωστό.

3. Το να χτυπάει το serverload.php πολλές φορές, καταναλώνει από μόνο του πολλούς πορούς; Στα πόσα δευτερόλεπτα λέτε να το βάλω για να έχει νόημα; Σίγουρα η μικρότερη τιμή είναι η πιο "live", όμως εντάξει δε μπορώ να το βάλω και 500ms. :-) Μόνο εγώ ως διαχειριστής θα το βλέπω και δεν θα τρέχει αυτόματα onload, γι αυτό έβαλα κουμπί.

 

Ορίστε το script:

PHP

function get_server_load() {
    $load = '';
    if (stristr(PHP_OS, 'win')) {
        $cmd = 'wmic cpu get loadpercentage /all';
        @exec($cmd, $output);
        if ($output) {
            foreach($output as $line) {
                if ($line && preg_match('/^[0-9]+$/', $line)) {
                    $load = $line;
                    break;
                }
            }
        }

    } else {
        $sys_load = sys_getloadavg();
        $load = $sys_load[0];
    }
    return $load;
}

function getServerMemoryUsage($getPercentage=true)
{
        $memoryTotal = null;
        $memoryFree = null;

        if (stristr(PHP_OS, "win")) {
            // Get total physical memory (this is in bytes)
            $cmd = "wmic ComputerSystem get TotalPhysicalMemory";
            @exec($cmd, $outputTotalPhysicalMemory);

            // Get free physical memory (this is in kibibytes!)
            $cmd = "wmic OS get FreePhysicalMemory";
            @exec($cmd, $outputFreePhysicalMemory);

            if ($outputTotalPhysicalMemory && $outputFreePhysicalMemory) {
                // Find total value
                foreach ($outputTotalPhysicalMemory as $line) {
                    if ($line && preg_match("/^[0-9]+\$/", $line)) {
                        $memoryTotal = $line;
                        break;
                    }
                }

                // Find free value
                foreach ($outputFreePhysicalMemory as $line) {
                    if ($line && preg_match("/^[0-9]+\$/", $line)) {
                        $memoryFree = $line;
                        $memoryFree *= 1024;  // convert from kibibytes to bytes
                        break;
                    }
                }
            }
        }
        else
        {
            if (is_readable("/proc/meminfo"))
            {
                $stats = @file_get_contents("/proc/meminfo");

                if ($stats !== false) {
                    // Separate lines
                    $stats = str_replace(array("\r\n", "\n\r", "\r"), "\n", $stats);
                    $stats = explode("\n", $stats);

                    // Separate values and find correct lines for total and free mem
                    foreach ($stats as $statLine) {
                        $statLineData = explode(":", trim($statLine));

                        //
                        // Extract size (TODO: It seems that (at least) the two values for total and free memory have the unit "kB" always. Is this correct?
                        //

                        // Total memory
                        if (count($statLineData) == 2 && trim($statLineData[0]) == "MemTotal") {
                            $memoryTotal = trim($statLineData[1]);
                            $memoryTotal = explode(" ", $memoryTotal);
                            $memoryTotal = $memoryTotal[0];
                            $memoryTotal *= 1024;  // convert from kibibytes to bytes
                        }

                        // Free memory
                        if (count($statLineData) == 2 && trim($statLineData[0]) == "MemFree") {
                            $memoryFree = trim($statLineData[1]);
                            $memoryFree = explode(" ", $memoryFree);
                            $memoryFree = $memoryFree[0];
                            $memoryFree *= 1024;  // convert from kibibytes to bytes
                        }
                    }
                }
            }
        }

        if (is_null($memoryTotal) || is_null($memoryFree)) {
            return null;
        } else {
            if ($getPercentage) {
                return (100 - ($memoryFree * 100 / $memoryTotal));
            } else {
                return array(
                    "total" => $memoryTotal,
                    "free" => $memoryFree,
                );
            }
        }
}

function getNiceFileSize($bytes, $binaryPrefix=true) {
        if ($binaryPrefix) {
            $unit=array('B','KB','MB','GB','TB','PB');
            if ($bytes==0) return '0 ' . $unit[0];
            return @round($bytes/pow(1024,($i=floor(log($bytes,1024)))),2) .' '. (isset($unit[$i]) ? $unit[$i] : 'B');
        } else {
            $unit=array('B','KB','MB','GB','TB','PB');
            if ($bytes==0) return '0 ' . $unit[0];
            return @round($bytes/pow(1000,($i=floor(log($bytes,1000)))),2) .' '. (isset($unit[$i]) ? $unit[$i] : 'B');
        }
}
	
$memUsage = getServerMemoryUsage(false);

$output = array();
$output['cpu_load'] = get_server_load();
$output['memory_total'] = $memUsage['total'];
$output['memory_free'] = $memUsage['free'];
$output['memory_usage'] = $memUsage['total'] - $memUsage['free'];
exit(json_encode($output));

HTML

<script>
function enable_server_monitoring()
{
	$('#monitor_server_info').show();
	$('#monitor_server_button').hide();
	setInterval(function(){ sc_show_server_load(); }, 5000);
}
function sc_show_server_load()
{
		$.ajax({
			url : "serverload.php",
			type: "GET",
			data: {
				//
			},
			dataType: "json",
			error: function(xhr, textStatus, errorThrown){
					//
			},
			success: function(data, textStatus, jqXHR){
					if (!data) { return false; }
					for (b in data) {
						if (b == 'cpu_load')
						{
							var cpu_load_percentage = data[b];
						}
						else if (b == 'memory_total')
						{
							var memory_total = data[b];
						}
						else if (b == 'memory_free')
						{
							var memory_free = data[b];
						}
						else if (b == 'memory_usage')
						{
							var memory_usage = data[b];
						}
					}	

					// do progress bars
					$( "#progressbar_cpu_usage" ).width(((cpu_load_percentage*195)/100));	
					$('#cpu_usage_per').html(cpu_load_percentage + '%');
					
					// memory usage
					var memory_usage_percentage = (memory_usage*100/memory_total);
					$('#memory_usage_per').html(Math.round(memory_usage_percentage* 100)/100 + '%');
					$( "#progressbar_memory_usage" ).width((memory_usage_percentage*195)/100);
			  }					
		});	
}

</script>
<input type="button" class="button" onclick="enable_server_monitoring()" value="MONITORING SERVER" id="monitor_server_button" />
<div style="display:none;" id="monitor_server_info">
	<div><div id="progressbar_cpu_usage" style="background-color:red; height:20px; width:0px;"></div>CPU: <span style="display:inline-block;" id="cpu_usage_per"></span></div>
	<div><div id="progressbar_memory_usage" style="background-color:green; height:20px; width:0px;"></div>MEMORY: <span style="display:inline-block;" id="memory_usage_per"></span></div>
</div>

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...