php - 设置从 EBS 共享加载文件的超时

标签 php amazon-web-services timeout nfs

所以我遇到了一个有趣的情况,但我不确定如何解决它。

我们有一个流程来汇总我们的销售数据,然后通过 Google Chart 构建图表。为了避免破坏数据库(或谷歌),它每 30 分钟只运行一次。它会查看之前的文件以确定它是否达到 30 分钟的阈值,如果是,它会构建新文件。我们在负载均衡器后面有两台服务器。因此,两台服务器都必须访问同一位置才能存储此文件。我们使用通过 NFS 安装的 EBS 共享来完成此操作(我们的整个设置都在 AWS 中)。这个过程工作得很好。

问题是有时 EBS 共享缓慢或断开连接。这会导致链式 react ,整个我们的内部工具都在等待处理这个文件(除非您关闭通知)。我读过一些讨论 this one 的话题(比如 stream_set_timeout)但不清楚如何使用它来加载文件(它不完全是一个流),而且我一直找不到任何示例。

这里有一个片段可以让您了解 PHP 文件在做什么

$file = '/ebs/path/to/image.png';
$newfile=false;
if(!is_file($file)) $newfile=true;
elseif(filemtime($file)+1800 < time()) {
    $newfile=true;
    unlink($file);
}
if(!$newfile){
    $i=imagecreatefrompng($file);
    header('Content-Type: image/png');
    header('Expires: ' . gmdate('D, d M Y H:i:s', filemtime($file) + $timeout) . ' GMT');
    imagepng($i);
    imagedestroy($i);
    exit;
} else {
    // Build and output a new file here
}

如何为这个脚本创建超时?

最佳答案

这与其说是问题的答案,不如说是问题的解决方案,但是请在服务器运行良好和文件运行时间过长时发布 iostat -x 1 的输出加载。我发现当 avgqu-sz 超过 30 时,即使在配置了 IOPS 的驱动器上(我们的驱动器配置为 2000 IOPS),EBS 也会变慢。解决方案是在情况好转之前一三秒钟内尽量不要读取或写入它。

此外,尝试克隆卷并使用克隆代替原始卷。我发现一些 AWS 系统只是“坏”了,需要更换:这适用于 EC2 实例、EBS 卷、RDS 服务等。当运气使您与另一个可能不是好邻居的用户一起使用运行 VM 的硬件时,可能会发生这种情况。只需克隆资源并重新启动它通常会将其移动到不同的硬件并解决此类问题。

编辑:阅读this great post关于如何解释 iostat 输出,重点是 iostat 如何与 EBS 相关。我已经读了十几遍了。

关于php - 设置从 EBS 共享加载文件的超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20154867/

相关文章:

php - 显示数据库中的特色项目

php - 将 while() 数组传递给 php 中的 while() 变量

sql-server - 如何模拟数据库连接超时

java - JPA(和/或 Hibernate)- 如何设置连接和/或查询的超时阈值?

javascript - AngularJS 中的 API 调用是连续的

php - 给用户的条件评论/对话框

php - MySQL LEFT JOIN 查询显示相同的值

ruby-on-rails - 如何将 item_lookup 中的 IdType 从 ASIN 更改为 ISBN?

amazon-web-services - 如何使用 terraform 向 Elastic Beanstalk 环境创建的负载均衡器添加警报?

amazon-web-services - 如何在 YAML CloudFormation 模板中的特定 VPC 中启动 Amazon EC2