Amazon web services 提高aws日志下载速度

Amazon web services 提高aws日志下载速度,amazon-web-services,go,amazon-s3,download,Amazon Web Services,Go,Amazon S3,Download,我将从显示代码开始,然后尝试做什么,代码: package main import ( "fmt" "os" "path/filepath" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/s3/

我将从显示代码开始,然后尝试做什么,代码:

package main

import (
    "fmt"
    "os"
    "path/filepath"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
    "github.com/aws/aws-sdk-go/service/s3/s3manager"
)

var (
    // empty strings for security reasons
    Bucket         = ""                                               // Download from this bucket
    Prefix         = "" // Using this key prefix
    LocalDirectory = "s3logs"                                                    // Into this directory
)

func main() {
    sess := session.New()
    client := s3.New(sess, &aws.Config{Region: aws.String("us-west-1")})
    params := &s3.ListObjectsInput{Bucket: &Bucket, Prefix: &Prefix}

    manager := s3manager.NewDownloaderWithClient(client, func(d *s3manager.Downloader) {
        d.PartSize = 64 * 1024 * 1024 // 64MB per part
        d.Concurrency = 8
    }) // works

    //manager := s3manager.NewDownloaderWithClient(client) //works

    d := downloader{bucket: Bucket, dir: LocalDirectory, Downloader: manager}

    client.ListObjectsPages(params, d.eachPage)

}

type downloader struct {
    *s3manager.Downloader
    bucket, dir string
}

func (d *downloader) eachPage(page *s3.ListObjectsOutput, more bool) bool {
    for _, obj := range page.Contents {
        d.downloadToFile(*obj.Key)
    }

    return true
}

func (d *downloader) downloadToFile(key string) {
    // Create the directories in the path
    file := filepath.Join(d.dir, key)

    if err := os.MkdirAll(filepath.Dir(file), 0775); err != nil {
        panic(err)
    }
    fmt.Printf("Downloading " + key)
    // Setup the local file
    fd, err := os.Create(file)
    if err != nil {
        panic(err)
    }

    defer fd.Close()

    // Download the file using the AWS SDK
    fmt.Printf("Downloading s3://%s/%s to %s...\n", d.bucket, key, file)
    params := &s3.GetObjectInput{Bucket: &d.bucket, Key: &key}
    _, e := d.Download(fd, params)
    if e != nil {
        panic(e)
    }
}


我试图从一个特定的bucket下载日志文件,最终从许多bucket下载日志文件。我需要尽快下载,因为。有很多数据。我的问题是,快速下载大量数据的最有效方式是什么?如果不能以合理的速度下载这些日志,整个过程将为零。有没有更快的方法,根据亚马逊文档,它已经并发了?有什么想法吗?还有,我注意到一件奇怪的事情。我是否将并发设置为1、4或20并不重要。所有内容仍在以~70-~/.80GB/min的速度下载

700-800GB/min等于100Mb/s。非常常见的带宽限制。你的机器能处理更多吗?是的,它能处理更多,但并发应该做些什么。设置并发性的意义在于,1个核心的性能与4个相同。就这点而言,我会以同样的速度用python来包装它。最终,我可以在具有大量内核的aws实例上运行此脚本。而且,我说它的速度是.80gb/分钟,所以每分钟不到1gb。我希望有700gbs/min的速度,当然,我这边有一个打字错误,GB应该是MB。多了解一点上下文可能有助于解决这个问题,例如,您试图获取的日志文件数量、平均大小和ec2机器类型。AFAIR my t2.small可以处理来自S3的这种流量,具有非常高的并发性,但用于相对较小的文件(~70kB)。我认为内核的数量并不重要,因为这将是一个IO绑定的进程。虽然在连接数量方面的并发性可能会降低–主要是在处理小文件时。许多存储桶上的许多日志文件,其文件大小随流量而变化。在每个存储桶级别上,一天的数据量远远超过5gb。我需要这些文件来统计印象。我在github上遇到过一个脚本,它声称下载速度为每秒1gb。我不需要太多的速度,但我确实需要一个凹凸来处理这些数据。现在,据我所知,我应该能够同时下载每个文件。无论我投入多少内核,我都看不到速度的提高。考虑到其他脚本的基准点,我知道还有改进的余地。