Как масштабировать S3 до тысячи запросов в секунду?

Для полноты и как я не могу показать это в комментарии:

1) По умолчанию для всех систем Debian и Ubuntu с отправленным R-пакетом:

edd@max:~$ R -q -e 'print(.libPaths())'
R> print(.libPaths())
[1] "/usr/local/lib/R/site-library" "/usr/lib/R/site-library" 
[3]            "/usr/lib/R/library"           
R> 
R> 

2) Что мы можем изменить, изменив R_LIBS_SITE:

edd@max:~$ R_LIBS_SITE="/usr/lib/R/Library" R -q -e 'print(.libPaths())'
R> print(.libPaths())
[1] "/usr/lib/R/library"
R> 
R> 

3) Но, изменяя R_LIBS, работает не :

edd@max:~$ R_LIBS="/usr/lib/R/Library" R -q -e 'print(.libPaths())'
R> print(.libPaths())
[1] "/usr/local/lib/R/site-library" "/usr/lib/R/site-library" 
[3]            "/usr/lib/R/library"           
R> 
R> 
edd@max:~$ 

См. help(Startup) для полного и подробного лечения. В Debian и Ubuntu мы установили эти три каталога как дефолт для более десяти лет. Поскольку здесь он устанавливается через R_LIBS_SITE, это переменная, которую вам нужно изменить здесь. В общем случае вам нужно переопределить переменную, удерживающую значение, и вы можете не знать ex ante , который есть.

Что касается исходного ответа, то в Debian и Ubuntu мы используем файл /etc/R/Renviron. В качестве help(Startup) деталей вы можете установить любое количество способов для этого постоянно для вашего запуска - и все эти точки сохраняются для всех разных ОС:

  1. Alter системные файлы, такие как Renviron или Renviron.site , если у вас есть соответствующие разрешения
  2. Else изменить файл для каждого пользователя ~/.Renviron
  3. Альтернативно , измените переменные среды R_LIBS или R_LIBS_USER или R_LIBS_SITE на системном уровне , если у вас есть соответствующие разрешения
  4. . Иначе измените переменные R_LIBS или R_LIBS_USER или R_LIBS_SITE на уровне пользователя.
  5. Наконец, вызовите .libPaths(...new path to be added here...) в ваших файлах запуска R, например, в .Rprofile.

См. help(Startup) для более подробного обсуждения.

2
задан Matthew Pope 31 March 2019 в 10:26
поделиться

2 ответа

Еще одна вещь, на которую вы должны обратить внимание - это используемый HTTPS-агент.

Раньше было (и, вероятно, так и есть), что в AWS SDK используется глобальный агент. Если вы используете агент, который будет повторно использовать соединения, это, вероятно, HTTP / 1.1 и, вероятно, конвейер отключен из соображений совместимости.

Посмотрите с помощью анализатора пакетов, такого как Wireshark, чтобы проверить, выполняется ли несколько внешних подключений. Если выполняется только одно соединение, вы можете указать агента в httpOptions .

0
ответ дан Brad 31 March 2019 в 10:26
поделиться

У меня есть несколько вещей, которые я хочу упомянуть, прежде чем дать прямой ответ на ваш вопрос.

Во-первых, я однажды провел эксперимент, и я выполнил 200000 запросов PUT / DELETE примерно за 25 минут, что составляет чуть более 130 запросов в секунду. Объекты, которые я загружал, имели размер около 10 КБ каждый. (У меня также было ~ 125000 GET запросов за тот же промежуток времени, поэтому я уверен, что если бы я делал только PUT с, я мог бы достичь еще более высокой пропускной способности PUT.) Я достиг этого на m4.4xlarge Экземпляр, который имеет 16 виртуальных ЦП и 64 ГБ ОЗУ, который работал в том же регионе AWS, что и корзина S3.

Чтобы увеличить пропускную способность, используйте более мощное оборудование и минимизируйте количество сетевых скачков и потенциальных узких мест между вами и S3.

S3 является распределенной системой. (В их документации говорится, что данные реплицируются на несколько AZ.) Он предназначен для одновременного обслуживания запросов от множества клиентов (поэтому он отлично подходит для размещения статических веб-ресурсов).

На самом деле, если вы хотите проверить пределы S3, вам нужно распределиться слишком быстро, увеличив число экземпляров EC2 или запустив ваши тесты как лямбда-функцию.

Редактировать: S3 не дает гарантий задержки для обслуживания ваших запросов. Одной из причин этого может быть то, что каждый запрос может иметь разный размер полезной нагрузки. (Запрос GET для объекта 10 B будет намного быстрее, чем объект 10 МБ.)

Вы продолжаете упоминать время для обработки запроса, но это не обязательно коррелирует с количеством запросов в секунду. , S3 может обрабатывать тысячи запросов в секунду, но ни один потребительский портативный компьютер или обычный потребительский сервер, о котором я знаю, не может выдавать тысячи отдельных сетевых запросов в секунду.

Кроме того, общее время выполнения не обязательно указывает на производительность, потому что, когда вы отправляете данные по сети, всегда существует риск сетевых задержек и потери пакетов. У вас может быть один неудачный запрос, который имеет более медленный путь через сеть или этот запрос может просто потерять больше пакетов, чем другие.

Вам нужно тщательно определить, что вы хотите узнать, а затем тщательно определить, как правильно его проверить.

0
ответ дан Matthew Pope 31 March 2019 в 10:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: