2017-05-21 24 views
1

Amazon S3のPHP SDKを使用して、巨大な圧縮ファイルをバケットにアップロードしています。Amazon S3高CPU使用率

$s3 = S3Client::factory(array(
    ... 
)); 

$uploader = new MultipartUploader($s3, $file, array(
    'bucket' => $bucket, 
    'key' => $filebase 
)); 

$result = $uploader->upload(); 

しかし、これは高いCPU使用率を引き起こしているため、私のウェブサイトはその時には遅くなります。

「ionice」を使用したり、アップロード速度を制御してユーザーのパフォーマンスに影響を与えない方法はありますか?

+0

ファイルをアップロードするには、要求署名の一部としてファイル部分のSHA-256ハッシュを計算する必要があるため、高いCPU使用率が期待できます...もちろん、 "巨大な"ファイルの場合は、それ。どのくらい巨大ですか? –

+0

@ Michael-sqlbotありがとうございました。まあ、1つのファイルは42GB、もう1つは90GBです。他のファイルはかなり小さくなっています。 – Nuno

答えて

0

AWSはストリームラッパーを提供しています.S3クライアントにストリームラッパーを登録できます。ストリームラッパーはデータをチャンクで送信し、チャンクのサイズも制御できます。

// Register the stream wrapper from an S3Client object 
$client->registerStreamWrapper(); 

あなたは、関数fopen()と、「X」、または「」ストリームアクセスモード「W」を使用してストリーミングデータで大きなファイルをアップロードすることができます。 Amazon S3ストリームラッパーは、読み書きストリーム(例えば、 "r +"、 "w +"など)を同時にサポートしません。これは、HTTPプロトコルが同時に読み書きを行えないためです。

$read = fopen('<YOUR FILE>', 'r'); 
$stream = fopen('s3://bucket/key', 'w'); 
while (!feof($read)) { 
    // Read 1024 bytes from the stream 
    $content = fread($read, 1024); 
    fwrite($stream, $content); 
} 
fclose($read); 
fclose($stream); 

S3へのストリームのアップロードを行うPHPのための他のいくつかの事前に構築されたパッケージがあるかもしれません。私はFlysystemとしか思えない。

完全ドキュメントAWSストリームラッパーが提供されるためHere.

-1

アップロードスクリプトにsleep($seconds);で作業することができます。その後、一定間隔でスリープ状態にします。そうすれば、スクリプトはもっと長くかかるでしょう。特に大きなファイルの場合。

+0

こんにちは。私はすでにループ内に "sleep()"を持っています。これは停止した場所からの再試行を続けます(大きなファイルのタイムアウトがあるため)。しかし、ファイルをアップロードしている間にスリープ状態にすることはできません。これは、高いCPUを使用する場所です。 – Nuno

0

は力仕事をやってMultipartUploaderように見えますし、多くのリソース(CPU、ネットワーク)を消費します。アップロード機能が必要な場合は、スポットインスタンスに移動することを検討します。彼らは安く、このタイプの仕事のために設計されています(スピンアップ、重労働、終結)。