2014-10-10 3 views
0

내 프로그램의 업로드 (및 다운로드) 성능을 한계까지 밀려고합니다.aws의 명령 줄 인터페이스를 사용하여 256MB 파일을 업로드 할 때 약 1000Mbps가 표시됩니다. 그러나 나는 다음과 같은 프로그램Node.js SDK를 사용하는 AWS S3 성능

if (process.argv.length < 7) { 
    console.log ("usage: " + process.argv [0] + " " + process.argv[1] + " <config> <region> <bucket> <key> <file>") 
    return -1 
} 

var config = process.argv[2] 
var region = process.argv[3] 
var bucketName = process.argv[4] 
var key = process.argv[5] 
var file = process.argv[6] 

var multipartMap = { Parts: [] } 
var uploadStartTime // = new Date() 
var partSize = 1024 * 1024 * 8   // at least 5MB, specified by amazon 
var partNum 
var multipartParams = { 
    Bucket: bucketName, 
    Key: key, 
    ContentType: "binary", 
    StorageClass: "REDUCED_REDUNDANCY", 
} 
var part = 0 
var maxRetry = 3 

var fs = require ('fs') 
var aws = require ('aws-sdk') 

function upload (bucket, multipart, partParams, trial) { 
    var trial = trial || 1; 
    bucket.uploadPart (partParams, function (err, data) { 
     if (err) { 
      console.log ("failed: ", err) 
      if (trial < maxRetry) { 
       console.log ("retrying part: ", partParams.PartNumber) 
       upload (bucket, multipart, partParams, trial + 1) 
      } else { 
       console.log ("failed: ", err, " unable to upload part: ", partParams.PartNumber) 
      } 
      return; 
     } 
     multipartMap.Parts[this.request.params.PartNumber - 1] = { 
      ETag: data.ETag, 
      PartNumber: Number (this.request.params.PartNumber) 
     } 

     if (--partNum > 0) return; 

     var doneParams = { 
      Bucket: bucketName, 
      Key: key, 
      MultipartUpload: multipartMap, 
      UploadId: multipart.UploadId 
     } 

     console.log ("success") 
     bucket.completeMultipartUpload (doneParams, function (err, data){ 
      if (err) { 
       console.log("An error occurred while completing the multipart upload"); 
       console.log(err); 
      } else { 
       var delta = (new Date() - uploadStartTime)/1000; 
       console.log('Completed upload in', delta, 'seconds'); 
       console.log('Final upload data:', data); 
      } 
     }) 
    }) 
} 

var kickoffTime = new Date() 
aws.config.loadFromPath (config) 
aws.config.region = region 

var bucket = new aws.S3 ({params: {Bucket: bucketName}}) 

console.log ("filename: ", file) 
buffer = fs.readFileSync (file) 
partNum = Math.ceil (buffer.length/partSize) // number of parts 
var totalPart = partNum 

uploadStartTime = new Date() 
bucket.createMultipartUpload (multipartParams, function (err, multipart) { 
    if (err) { 
     console.log ("cannot create multipart upload: ", err) 
     return -1 
    } 

    for (var i = 0; i < buffer.length; i += partSize) { 
     ++part 
     var end = Math.min (i + partSize, buffer.length) 
     var body = buffer.slice (i, end) 
     var partParams = { 
      Body: body, 
      Bucket: bucketName, 
      Key: key, 
      PartNumber: String (part), 
      UploadId: multipart.UploadId, 
      ContentLength: end - i 
     } 

     upload (bucket, multipart, partParams); 
    } 
}) 
var kickoffTimeDelta = (new Date() - kickoffTime)/1000 
console.log ("Kickoff time: ", kickoffTimeDelta) 

빈 파일을 작동하지 않습니다이 프로그램을 업로드하지만,이 사건을 무시하세요 600Mbps의에 대해에 박히면서. 위의 프로그램은 this을 참조하여 코딩되었습니다. 다운로드에 관해서는 속도도 약 600Mbps에서 멈췄다. 코드 if (process.argv.length < 7) { console.log ("usage :"+ process.argv [0] + ""+ process .argv 1 + "") 반환 -1 }

var config = process.argv[2] 
var region = process.argv[3] 
var bucketName = process.argv[4] 
var key = process.argv[5] 
var file = process.argv[6] 

var fs = require ('fs') 
var aws = require ('aws-sdk') 
fs.readFile (config, "utf8", function (err, configFile) { 
    if (err) { 
     console.log ("Config file cannot be read: ", err) 
     return -1 
    } 
    aws.config = JSON.parse (configFile) 
    aws.config.region = region 

    var bucket = new aws.S3 ({params: {Bucket: bucketName}}) 

    bucket.createBucket (function() { 
     var data = {Key: key} 
     bucket.getObject (data, function (err, fileData) { 
      if (err) { 
       console.log ("Error downloading data: ", err) 
      } else { 
       fs.writeFile (file, fileData.Body, function (err) { 
        if (err) { 
         console.log ("Error writing data: ", err) 
        } else { 
         console.log ("Successfully downloaded!") 
        } 
       }) 
      } 
     }) 
    }) 
}) 

내가 Node.js를하고 AWS SDK 새로운 오전, 더 나은 throughtput을 달성 할 수없는 있나요? 감사합니다.

답변

0

음 ... 명확한 질문이 있지만 그만큼 게시 할 평판이 없습니다.

양 끝에 얼마나 많은 초당 요청이 표시됩니까? 초당 100 건이 넘는 요청으로 S3를 정기적으로 사용하는 경우 키 이름의 시작을 무작위로 선택하여 더 나은 성능을 얻을 수 있습니다.

는 설명과 몇 가지 제안은이 문서를 참조하십시오 : 동일한 문자로 시작하는 키 (하위 디렉토리)와 파일들을이있는 경우 http://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html

기본적으로 인덱스 파티션을 압도 할 수 있습니다 ... 대용량 읽기/쓰기 작업의 경우 임의의 키 이름으로 인해 성능이 향상됩니다.

+0

감사합니다.이 파일은 유용한 리소스가 될 것입니다.하지만이 순간 저는 최상의 성능을 위해 한 번에 적은 수의 파일을 S3에 저장하는 방법에 대해 상당히 우려하고 있습니다. 시스템이 확장되고 많은 수의 요청을 수용 할 수 있기 때문에 마지막에는 의미가 없습니다. –

관련 문제