4

PHP / Apacheのサーバー負荷をどのように計算しますか?vBulletinフォーラムでは、サーバーの負荷が次のように表示されていることは知っていますが0.03 0.01 0.04、平均的なジョーにはあまり理解できません。そこで、1〜100パーセンタイルスケールについて考えました。DIVから読み取るサーバーロードビジュアルを表示したかった:

$load = $serverLoad*100;
<div class=\"serverLoad\">
    <div style=\"width: $load%;\"></div>//show visual for server load on a 1-100 % scale
</div>
<p>Current server load is $load%</p>
</div>

ただし、サーバーの負荷を検出する方法がわかりません。このサーバーの負荷をパーセンタイルスケールに変換することは可能ですか?どこから始めたらいいのかわからない。誰か助けてくれませんか?

ありがとう。

4

8 に答える 8

14

私はまだトリックを行う必要がある非常に古い関数を持っています:

function getServerLoad($windows = false){
    $os=strtolower(PHP_OS);
    if(strpos($os, 'win') === false){
        if(file_exists('/proc/loadavg')){
            $load = file_get_contents('/proc/loadavg');
            $load = explode(' ', $load, 1);
            $load = $load[0];
        }elseif(function_exists('shell_exec')){
            $load = explode(' ', `uptime`);
            $load = $load[count($load)-1];
        }else{
            return false;
        }

        if(function_exists('shell_exec'))
            $cpu_count = shell_exec('cat /proc/cpuinfo | grep processor | wc -l');        

        return array('load'=>$load, 'procs'=>$cpu_count);
    }elseif($windows){
        if(class_exists('COM')){
            $wmi=new COM('WinMgmts:\\\\.');
            $cpus=$wmi->InstancesOf('Win32_Processor');
            $load=0;
            $cpu_count=0;
            if(version_compare('4.50.0', PHP_VERSION) == 1){
                while($cpu = $cpus->Next()){
                    $load += $cpu->LoadPercentage;
                    $cpu_count++;
                }
            }else{
                foreach($cpus as $cpu){
                    $load += $cpu->LoadPercentage;
                    $cpu_count++;
                }
            }
            return array('load'=>$load, 'procs'=>$cpu_count);
        }
        return false;
    }
    return false;
}

これにより、プロセッサの負荷が返されます。メモリのロードにmemory_get_usagememory_get_peak_usageを使用することもできます。

これに基づいてパーセンテージを見つけることができない場合は...ため息をついて、投稿するだけで一緒に試してみます。

于 2011-04-07T23:13:35.013 に答える
9

PHPのこの関数は、そのトリックを実行する可能性があります:sys_getloadavg()

過去1分間、5分間、および15分間の平均システム負荷(システム実行キュー内のプロセス数)をそれぞれ表す3つのサンプルを返します。

于 2012-09-05T12:44:31.510 に答える
3
function get_server_load()
{

    $serverload = array();

    // DIRECTORY_SEPARATOR checks if running windows
    if(DIRECTORY_SEPARATOR != '\\')
    {
        if(function_exists("sys_getloadavg"))
        {
            // sys_getloadavg() will return an array with [0] being load within the last minute.
            $serverload = sys_getloadavg();
            $serverload[0] = round($serverload[0], 4);
        }
        else if(@file_exists("/proc/loadavg") && $load = @file_get_contents("/proc/loadavg"))
        {
            $serverload = explode(" ", $load);
            $serverload[0] = round($serverload[0], 4);
        }
        if(!is_numeric($serverload[0]))
        {
            if(@ini_get('safe_mode') == 'On')
            {
                return "Unknown";
            }

            // Suhosin likes to throw a warning if exec is disabled then die - weird
            if($func_blacklist = @ini_get('suhosin.executor.func.blacklist'))
            {
                if(strpos(",".$func_blacklist.",", 'exec') !== false)
                {
                    return "Unknown";
                }
            }
            // PHP disabled functions?
            if($func_blacklist = @ini_get('disable_functions'))
            {
                if(strpos(",".$func_blacklist.",", 'exec') !== false)
                {
                    return "Unknown";
                }
            }

            $load = @exec("uptime");
            $load = explode("load average: ", $load);
            $serverload = explode(",", $load[1]);
            if(!is_array($serverload))
            {
                return "Unknown";
            }
        }
    }
    else
    {
        return "Unknown";
    }

    $returnload = trim($serverload[0]);

    return $returnload;
}
于 2011-04-07T23:36:48.643 に答える
2

「exec」がアクティブ化されている場合

/**
 * Return the current server load
 * It needs "exec" activated
 *
 * e.g.
 * 15:06:37 up 10 days,  5:59, 12 users,  load average: 1.40, 1.45, 1.33
 * returns
 * float(1.40)
 */
public function getServerLoad()
{
    preg_match('#(\d\.\d+),[\d\s\.]+,[\d\s\.]+$#', exec("uptime"), $m);
    return (float)$m[1];
}
于 2011-04-15T14:18:13.330 に答える
1
<?php
$load = sys_getloadavg();
if ($load[0] > 0.80) {
    header('HTTP/1.1 503 Too busy, try again later');
    die('Server too busy. Please try again later.');
}
?>
于 2016-04-14T05:46:03.830 に答える
0

適切な権限があれば、LAMP環境では非常に簡単です。

print_r(sys_getloadavg());

出力:配列([0] => 0 [1] => 0.01 [2] => 0.05)

配列の値は、それぞれ過去1、5、15分の平均負荷です。

于 2013-07-26T15:01:52.683 に答える
0

これがwindows/linux互換の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;
}
于 2015-04-25T16:12:49.773 に答える
-1
function _loadavg()
{
    if(class_exists("COM")) 
    {
      $wmi = new COM("WinMgmts:\\\\.");
      $cpus = $wmi->InstancesOf("Win32_Processor");

      foreach ($cpus as $cpu) 
      {
       return $cpu->LoadPercentage;
      }
    } 
}
于 2013-05-07T19:53:59.073 に答える