如何使用PHP函数sys_getloadavg()以百分比形式获取Web服务器的平均负载水平?

时间:2018-09-19 12:01:22

标签: php server-load

PHP函数sys_getloadavg()返回一个带有三个值的数组,分别显示最近1分钟,5分钟和15分钟内系统运行队列中的平均进程数。

如何将此产量转换为百分比?

1 个答案:

答案 0 :(得分:2)

百分比是相对测量单位。这意味着我们必须知道所测量数量的范围或最小和最大值。函数sys_getloadavg()评估 整个系统的性能 ,而不是单独的CPU负载级别或内存,文件系统或数据库的使用情况。它返回浮点数,显示最后一个时间间隔内运行队列中有多少个进程。

我对MacBook Pro(8个CPU内核)和PHP 7.0进行了一些实验,以弄清sys_getloadavg()产生的值的范围。我的平均数字在1.3到3.2之间。当我并行运行视频转换程序时,最大结果跃升至18.9。顺便说一句,在所有情况下,我都没有解决网页加载速度上的重大损失。这意味着整个系统不会过载。

让我们在网页没有在合理的时间内加载(假设10秒钟)时承担100%的系统加载情况。我不知道在这种情况下什么值将返回sys_getloadavg(),但我认为它会很大。

我的解决方案非常简单。让我们测量系统的平均负载水平,并将结果持久存储为最小值和最大值。当系统工作更快或更慢时,我们将通过新值更新最小值和最大值。因此,我们的程序将“学习” 系统,并将变得越来越精确。最后一分钟的值将与存储的范围进行比较,并转换为百分比,例如(loadavg - min)/((max - min) / 100)

$performance = sys_getloadavg();
try {
  $rangeFile = 'sys_load_level.txt';
  $range = file($rangeFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
  $performance = array_merge($performance, $range);
  $min = min($performance);
  $max = max($performance);
  if ($range[0] > $min || $range[1] < $max)
    file_put_contents($rangeFile, [$min.PHP_EOL, $max.PHP_EOL]);
}
catch (Exception $e) {
  $min = min($performance);
  $max = max($performance);
  file_put_contents($rangeFile, [$min.PHP_EOL, $max.PHP_EOL]);
}
$level = intval(($performance[0] - $min) / (($max - $min) / 100.0));