设置从 EBS 共享加载文件的超时时间
Posted
技术标签:
【中文标题】设置从 EBS 共享加载文件的超时时间【英文标题】:Set a timeout for loading a file from an EBS share 【发布时间】:2013-11-22 21:31:46 【问题描述】:所以我有一个有趣的情况,我不知道如何解决它。
我们有一个流程来汇总查看我们的销售数据,然后通过 Google Chart 构建图表。为了避免重创数据库(或谷歌),它每 30 分钟运行一次。它查看前一个文件以确定它是否达到了 30 分钟的阈值,如果是,则构建新文件。我们在负载均衡器后面有两台服务器。因此,两台服务器都必须有权访问相同的位置来存储此文件。我们使用通过 NFS 安装的 EBS 共享来完成此操作(我们的整个设置都在 AWS 中)。这个过程工作得很好。
问题有时是 EBS 共享速度缓慢或断开连接。然后,这会导致连锁反应,整个内部工具都在等待处理这个文件(除非您关闭通知)。我已经阅读了一些讨论stream_set_timeout 的线程(例如this one),但不清楚您将如何使用它来加载文件(它不完全是流)并且我一直无法找到任何示例。
这是一个 sn-p,让您了解 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
如何为此脚本创建超时?
【问题讨论】:
根本原因是“EBS速度慢或断开连接”,所以最终的解决方案是解决这个问题。 AWS 是否能胜任这项任务是另一个问题。 【参考方案1】:这更多的是解决问题而不是回答问题,但请在服务器运行良好和文件加载时间较长时发布iostat -x 1
的输出。我发现当avgqu-sz
超过 30 时,即使在 IOPS 配置的驱动器上(我们的驱动器配置为 2000 IOPS),EBS 也会变慢。解决办法是在情况好转之前尽量不要对其进行读取或写入操作一到三秒钟。
另外,请尝试克隆卷并使用克隆代替原始卷。我发现一些 AWS 系统只是“坏”并且需要更换:这适用于 EC2 实例、EBS 卷、RDS 服务等。当运气使您与另一个可能不是好邻居的用户一起使用运行 VM 的硬件时,可能会发生这种情况。只需克隆资源并重新启动它通常会将其移动到不同的硬件并解决此类问题。
编辑:阅读this great post 了解如何解释iostat
输出,重点介绍iostat
与EBS 的关系。我已经读了几十遍了。
【讨论】:
我赞成这个(因为它是非常有用的信息)并给了它赏金(因为它是唯一提交的答案)但是,如前所述,它实际上并没有回答问题,所以我没有标记它就这样。我仍然希望看到有人解释stream_set_timeout
。但是这里的信息很好。以上是关于设置从 EBS 共享加载文件的超时时间的主要内容,如果未能解决你的问题,请参考以下文章