所以我有一个有趣的情况,我不知道如何绕过它。
我们有一个流程可以综合查看我们的销售数据,然后通过Google Chart构建图表。为了避免锤击数据库(或谷歌),它每隔30分钟运行一次。它查看前一个文件以确定它是否达到30分钟阈值,如果是,则构建新文件。我们在负载均衡器后面有两台服务器。因此,两台服务器都必须能够访问相同的位置才能存储此文件。我们使用通过NFS挂载的EBS共享(我们的整个设置在AWS中)完成了此操作。这个过程很好。
问题是EBS共享有时很慢或断开连接。这会导致涟漪效应,在整个我们的内部工具中等待处理这个文件(除非你关闭通知)。我已经阅读了一些讨论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
}
如何为此脚本创建超时?
答案 0 :(得分:4)
这是问题的解决方案而不是问题的答案,但是当服务器正常运行以及文件需要很长时间加载时,请发布iostat -x 1
的输出。我发现当avgqu-sz
超过30时,即使在IOPS配置的驱动器上(我们的配置为2000 IOPS),EBS也会慢慢爬行。解决方案是在情况清除之前尽量不要读或写一两秒钟。
此外,尝试克隆卷并使用克隆代替原始卷。我发现一些AWS系统只是“坏”并且需要更换:这适用于EC2实例,EBS卷,RDS服务等。可能这种情况发生在运气带来使用硬件运行VM与另一个可能不是好邻居的用户时。只需克隆资源并重新启动它通常会将其移至不同的硬件并解决此类问题。
编辑:阅读this great post,了解如何解释iostat
输出,重点介绍iostat
与EBS的关系。我已经读了很多次了。