Каков рекомендуемый способ использования s3manager.Загрузчик?

#aws-sdk-go

#aws-sdk-go

Вопрос:

Недавно я попытался улучшить процесс загрузки и выгрузки и обнаружил, что s3manager.Uploader это так здорово — улучшить процесс загрузки для больших объектов путем их распараллеливания. Приведенный ниже код работает хорошо. Мы можем в полной мере использовать нашу пропускную способность (намного лучше, чем PutObject ).

 uploader := s3manager.NewUploaderWithClient(s.Client, func(u *s3manager.Uploader) {
    u.Concurrency = 128
})
 

Итак, я попытался использовать аналогичный способ для повышения скорости загрузки, но, похоже, какой бы параллелизм ни использовался, он не может ускорить скорость загрузки. Скорость загрузки всегда ниже 15 МБ / с.

Кстати, GetObject API довольно хорошо работает с очень большими объектами, он полностью использует нашу пропускную способность при загрузке больших объектов, GetObject может достигать предела пропускной способности около 1250 МБ / с.

Итак, я попытался провести некоторый тестовый тест, и приведенное выше изображение go tool pprof показывает.

 func (b *WriteAtBuffer) WriteAt(p []byte, pos int64) (n int, err error) {
    pLen := len(p)
    expLen := pos   int64(pLen)
    b.m.Lock()
    defer b.m.Unlock()
    if int64(len(b.buf)) < expLen {
        if int64(cap(b.buf)) < expLen {
            if b.GrowthCoeff < 1 {
                b.GrowthCoeff = 1
            }
            newBuf := make([]byte, expLen, int64(b.GrowthCoeff*float64(expLen)))
            copy(newBuf, b.buf)
            b.buf = newBuf
        }
        b.buf = b.buf[:expLen]
    }
    copy(b.buf[pos:], p)
    return pLen, nil
}
 

Вот мой вопрос, почему s3manager.Downloader так медленно, замедляет ли скорость передачи данных WriteAt интерфейс? Какой рекомендуемый способ использования s3manager.Downloader ?