Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Многопоточная раздача/закачка как в торренте без нагрузки на винчестер (буферизация) #589

Open
pavel-pimenov opened this issue Aug 21, 2015 · 4 comments

Comments

@pavel-pimenov
Copy link
Owner

From gi...@ya.ru on August 25, 2011 19:27:17

Не уверен что точно понимаю как всё работает в торренте и в флайлинке.
В флайлинке в разделе для экспертов нашел какие-то данные по буферизации, но там только на запись, очень мало и фиксированно. И то мне кажется 64 кб, которые там прописаны в процессе задействуются неполностью.
Задача функции - сделать чтобы при 100 потоков закачки и раздачи нагрузка на винчестер была минимальна. Чем больше потоков - тем более эффективно используется интернет канал пользователей (за исключением пользователей со слабым роутером)
Проще говоря нужно всех пользователей DC заставить открыть 100 слотов на отдачу.
Как это сделать:

  1. Рассматриваем и отдачу и закачку
  2. Высчитываем скорость каждого потока закачки и каждого потока раздачи
  3. Для потоков с большой скоростью выделяем буфер 10-50 мегабайт, для потоков с малой скоростью 1-5 мегабайт.
  4. Высчитываем размер каждого буфера динамически в процессе работы.

Раздача:

  1. Выделяем потоку 5 мегабайт
  2. Считываем с винчестера сразу кусок 5 мегабайт
  3. Раздаем его и вычисляем скорость (за какое время будут отданы эти 5 мегабайт)
  4. Делим 5 мегабайт на время, затраченное на раздачу, вычисляем скорость
  5. Относительно скорости меняем размер буфера, к примеру до 50 мегабайт
  6. Заполняем эти 50 мегабайт сегментами файла с винча.
  7. Повторяем всё заново.

В итоге при 100 потоков имеем ... ну к примеру 1 обращение к винчестеру в секунду. А при прежней системе каждые 4 килобайта при раздаче постоянно считывались с винчестера, заставляя считывающие головки брыкаться по всему диску от файла к фалу. Винчестеру горазда проще отдать один большой кусок за раз, чем считывать понемногу.

Закачка:

  1. Выделяем потоку 5 мегабайт
  2. Заполняем из потока эти 5 мегабайт
  3. Вычисляем скорость (за какое время был заполнен данный буфер)
  4. Делим 5 мегабайт на время, затраченное на прием, вычисляем скорость
  5. Относительно скорости меняем размер буфера, к примеру до 50 мегабайт
  6. Заполняем эти 50 мегабайт из потока.
  7. Повторяем всё заново рассчеты заново.

Ну впринципе после каждого приему/отдачи менять вовсе не обязательно. Можно это делать за 10 -20 закачек/раздач, высчитывать среднюю скорость. Она ведь имеет св-во скакать.

В итоге при 100 потоков имеем ... ну к примеру 1 обращение к винчестеру в секунду. А при прежней системе каждые 64 килобайта при закачке записывались на винчестер. При множестве одновременных закачек заставляя считывающие головки брыкаться по всему диску от файла к фалу.

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

Original issue: http://code.google.com/p/flylinkdc/issues/detail?id=546

@pavel-pimenov
Copy link
Owner Author

From gi...@ya.ru on August 26, 2011 16:31:58

Предлогаю в настройках сделать опцию выбора максимального размера обоих буферов. Т.е. пользователь укажет что он хочет допустим выделить 100 мегов на отдачу и 100 мегов на прием, вот в пределах этих 100 мегов и высчитывать максимальное значение.

У меня раздачи и закачки всреднем идут 10 мегабайт в секунду. Их общее количество 100 и 100.
Это приблизительно 102 кбайт в секунду каждый поток приема. С текущими 64 кб на поток - каждые 0.7 секунд происходит 100 записей на винчестер. Не много ли?
Чтобы обращение к винчестеру было раз в секунду, получается нужен буфер каждому потоку 10 мегабайт, и размазать их по времени равномерно, во как!
И всё тоже самое на прием.
В итоге если я хочу чтобы при 100 закачках и 100 раздач было 2 обращения к винчестеру в секунду, мне нужен общий буфер 2000 мегабайт и равномерное распределение по времени.
В каком месте ошибся?

@pavel-pimenov
Copy link
Owner Author

From avgust.m...@gmail.com on August 30, 2011 10:37:19

А почему в байтах ?)

Attachment: Снимок.PNG

@pavel-pimenov
Copy link
Owner Author

From avgust.m...@gmail.com on August 30, 2011 10:45:37

Извращаться с 2ГБ буфера нету смысла. В торренте скорей всего просто очередь записи\чтения более грамотно сделана, чем у флайлинка. Поэтому и нагрузка меньше на винт.

@pavel-pimenov
Copy link
Owner Author

From nail...@bk.ru on August 31, 2011 12:50:44

Значит нужно просто стащить с торрента, как это делают со стронгом

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant