2013-11-22 14 views
5

興味深い状況があり、回避方法がわかりません。EBS共有からファイルを読み込むためのタイムアウトを設定する

私たちは、売上データを集計し、Google Chartを介してグラフを作成するプロセスを持っています。データベース(またはGoogleの問題)を叩くことを防ぐため、30分ごとにこれを実行します。前のファイルを調べて、30分のしきい値に達したかどうかを判断し、しきい値に達している場合は新しいファイルを作成します。ロードバランサの背後に2台のサーバーがあります。したがって、両方のサーバーは、このファイルを格納するために同じ場所にアクセスする必要があります。私たちは、NFS経由でマウントされたEBS共有を使用しました(私たちの設定全体はAWSにあります)。このプロセスはうまくいきます。

問題は、EBS共有が低速または切断されていることがあります。これは、内部のツール全体で、この1つのファイルを処理するのを待つ(通知をオフにしない限り)波及効果を引き起こします。私はstream_set_timeoutについて話しているいくつかのスレッド(this oneのようなもの)を読んだことがありますが、ファイルをロードする際にそれをどのように使うのかは明確ではありません(正確にはストリームではありません)。

ここスニペットは、私は、このスクリプトのタイムアウトを作成することができますどのようにあなたの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

根本的な原因は「EBSの速度が遅い、または接続が切断されています」です。究極の解決策はこれを修正することです。 AWSがその課題に従っているかどうかは別の問題です。 –

答えて

4

これは問題の解決策ではありませんが、サーバが正常に動作していて、ファイルのロードに時間がかかる場合は、iostat -x 1の出力を投稿してください。私は、avgqu-szが30を超え、IOPSでプロビジョニングされたドライブ(私たちは2000 IOPSでプロビジョニングされています)でも、EBSがクロールするのが遅くなることを発見しました。解決策は、状況が解消されるまで、2〜3回は読み書きしないようにすることです。

また、ボリュームを複製し、元のボリュームの代わりにクローンを使用してみてください。いくつかのAWSシステムはちょうど「悪い」もので、交換が必要であることがわかりました。これは、EC2インスタンス、EBSボリューム、RDSサービスなどに適用されます。おそらく、運が良かったかもしれない別のユーザーとVMを実行しているハードウェアを使用する場合に起こります。リソースをクローンして再起動するだけで、通常は別のハードウェアに移動し、このような問題を解決します。

EDIT:iostatはEBSに関係するかに重点を置いて、iostat出力を解釈する方法についてthis great postをお読みください。私はそれを十数回読みました。

+0

私はこれを(非常に有用な情報であるので)upvotedし、(唯一の回答が提出されているため)賞金を与えたが、述べたように、実際に質問に答えるわけではないので、私はまだ誰かが 'stream_set_timeout'を説明するのを見たいと思います。それでも良い情報はここにあります。 – Machavity

関連する問題