FileChannel.transferTo (предположительно нулевое копирование) не дает никакого увеличения производительности - PullRequest
0 голосов
/ 11 июня 2018

Я работаю над API REST с конечной точкой для загрузки файла размером более 2 ГБ.Я читал, что Java FileChannel.transferTo(...) будет использовать нулевое копирование, если ОС поддерживает это.Мой сервер работает на локальном хосте во время разработки под моей MacBook Pro OS 10.11.6.

Я сравнил следующие два метода записи файла в поток ответов:

  1. Копирование фиксированного числабайты от FileChannel до WritableByteChannel с использованием transferTo
  2. Считывание фиксированного количества байтов из FileInputStream в байтовый массив (размер 4096) и запись в OutputStream в цикле.

Время, необходимое для файла объемом 5,2 ГБ, составляет от 20 до 23 секунд для обоих методов.Я попытался transferTo с фиксированным числом байтов в одной передаче, установленным в следующие значения: 4 КБ (то есть 4 * 1024), 1 МБ и 50 МБ.Время, затрачиваемое на запись, находится в одном и том же диапазоне во всех 3 случаях.

Время, затраченное на запись, измеряется от до входа в цикл while до после выхода из цикла while, в котором байты считываются из файла.Это все на стороне сервера.Время сетевого перехода не учитывается.

Есть идеи о том, что может быть причиной?Я вполне уверен, что MacOS 10.11.6 должен поддерживать нулевое копирование (то есть sendfile системный вызов).

EDIT (18.06.2008) :

Я нашел следующее сообщение в блоге за 2015 год, в котором говорится, что sendfile в MacOS X не работает.Может ли быть так, что эта проблема все еще существует?

https://blog.phusion.nl/2015/06/04/the-brokenness-of-the-sendfile-system-call/

1 Ответ

0 голосов
/ 25 июня 2018

(Высокая) скорость передачи, которую вы цитируете, вероятно, близка или ограничена тем, что в любом случае может сделать устройство SATA.Если мои предположения верны, вы не увидите увеличения производительности, отраженного во времени, затрачиваемом на выполнение теста - однако, вероятно, во время теста будет изменяться загрузка процессора.Учитывая, что у вас достаточно мощный компьютер, ваш процессор и память достаточно быстрые.Любой метод (нулевое копирование или нет) будет работать с той же скоростью, что и скорость вашего диска.Однако нулевое копирование вызовет гораздо меньшую нагрузку на процессор и не потребует лишней полосы пропускания из вашей памяти.Следовательно, вы должны протестировать различные методы и посмотреть, какой из них в конечном итоге использует наименьшее количество ЦП, и выбрать этот метод для своего приложения.

...