#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
?