使用node.js的API上传到Amazon S3速度非常慢

使用node.js的API上传到Amazon S3速度非常慢,node.js,amazon-web-services,amazon-s3,Node.js,Amazon Web Services,Amazon S3,我一直在试图弄清楚为什么使用putObject命令(node.js库)上传到AmazonS3的速度慢得惊人。下面的代码读取整个文件目录,并将它们异步放入S3 //Read a directory of files fs.readdir(dir,function(err,files){ //Read each file within the folder for(var i=0; i < files.length; i++){ var file = files[i

我一直在试图弄清楚为什么使用putObject命令(node.js库)上传到AmazonS3的速度慢得惊人。下面的代码读取整个文件目录,并将它们异步放入S3

//Read a directory of files
fs.readdir(dir,function(err,files){

    //Read each file within the folder
    for(var i=0; i < files.length; i++){

    var file = files[i];

    //Read the File
    fs.readFile(path.join(dir,file), function(err, data){

        //Create a new buffer
        var buffer = new Buffer(data, 'base64');

        //Add the pdf to S3 
        s3.putObject({
        'Bucket':bucket,
        'Key':path.join(key,file),
        'Body':buffer,
        'ContentType':mime(file)
        },function(err, data) {

          //Wait for all the other files to be done
          // and perform a callback
        });
    });
    }
});
//读取文件目录
fs.readdir(dir,函数(err,文件){
//读取文件夹中的每个文件
对于(var i=0;i
使用具有类似结果的多个不同文件夹进行测试

  • 6个文件,除1@63Kb外,所有文件大小均在1-2KB之间(上传时间超过20秒)
  • 4个文件全部为3kb(上传时间超过20秒)
使用上载相同的文件大约需要3秒(或更短)才能完成。为什么使用node.js API这么慢


根据Amazon文档,我甚至尝试过生成多个子系统来独立处理每次上传。上传速度没有变化。

在节点中创建新的S3实例时,是否设置了正确的
区域

例如,假设您的s3存储桶位于
us-east-1
中。为了获得最佳传输速度,您需要确保S3实例设置为该区域,如:

const s3 = new AWS.S3({
        accessKeyId: "xxx",
        secretAccessKey: "xxx",
        region: 'us-east-1'
    });

否则,它可能会非常慢。有人可能会插话解释发生这种情况的具体原因——我猜这与在执行多部分请求时必须不断查找实际区域有关,或者可能需要上传到距离目标区域很远的另一个区域

我同样需要上传多个文件,所以我利用Promise功能并行上传文件

    async function uploadFile(filePath, bucket) {
    
        const fileContent = fs.readFileSync(filePath);
        const params = {
            Bucket: bucket,
            Key: path.basename(filePath),
            Body: fileContent
        };
    
        return await s3.upload(params).promise();
    }
    
    let uploadFilePromise = [];
        
    for (const file of fileList) {
        uploadFilePromise.push(uploadFile(file, bucket));
    }
    await Promise.all(uploadFilePromise);

它大大缩短了总体上传时间。

迁移到Amazon EC2,连接速度显著提高。虽然这仍然暗示我为什么在非EC2实例上运行会如此缓慢,因为它们在同一网络上运行(您的EC2实例和S3)