如果“重负载”是指 CPU 负载,这将非常容易sys_getloadavg()
,例如:
$load = sys_getloadavg();
$cores = intval(trim(shell_exec('grep physical /proc/cpuinfo | sort -u | wc -l')));
if ($load[0] > $cores)
{
// machine was under heavy load in the last minute
}
else if ($load[1] > $cores)
{
// machine was under heavy load in the last 5 minutes
}
else if ($load[2] > $cores)
{
// machine was under heavy load in the last 15 minutes
}
根据您的可用内存和允许的 PHP 进程数,您可能只想将响应延迟几毫秒,usleep()
而不是显示“负载不足”消息。请注意,在睡眠时,该进程仍在消耗您的内存和 Web 服务器线程,因此您需要小心这一点 - 您可以根据负载延迟响应,即:
if (($load[1] / $cores) >= 1)
{
$delay = ($load[1] / $cores) / 10;
if ($delay >= 0.5) // never delay for more than 0.5 seconds
{
exit('heavy load sorry');
}
usleep($delay * 1000000);
}
负载越高,延迟越高,这将给 CPU 时间赶上所有工作。
如果您正在运行分布式负载均衡器,您可能希望将这些值保存在 memcached 中,也将$cores
变量存储在 APC 或类似中可能会给您带来性能提升。
如果您指的是其他类型的负载(例如用户或内存),则逻辑是相似的,您只需要担心获取相关指标并将其存储在 APC 或 memcached 上(如果您需要分布式逻辑)。
PS:ServerFault可能是问这类问题的更好地方。