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

Увеличить скорость #20

Open
strannik-j opened this issue Jun 19, 2019 · 3 comments
Open

Увеличить скорость #20

strannik-j opened this issue Jun 19, 2019 · 3 comments

Comments

@strannik-j
Copy link

Установил на европейский VPS с хорошим каналом, но средняя скорость ≈60 Mbit.
Как можно её увеличить?
Изменить размер блока?
Увеличить число потоков?
Что-то ещё?

@strannik-j strannik-j changed the title Как увеличить скорость? Увеличить скорость Jun 19, 2019
@strannik-j
Copy link
Author

Примерно через час скорость падает до нескольких сотен килобитт. Появляются огромные задержки. Использование становится невозможным.

@VadVergasov
Copy link

Насколько мне известно, то надо использовать TelegramX, т.к. он модифицированный и там скорость до 240. Но автор почему-то закоментил все связанное с TelegramX.

@SlavikMIPT
Copy link
Owner

SlavikMIPT commented Jul 8, 2019

скорость 240мбит - для голой загрузки файла через telegram_client_x - реализуется она за счет многопоточности - для операций ввода вывода Python отпускает GIL - поэтому тут появляется выигрыш, но есть ряд моментов:

  • в ботах(AudioTubeBot/VideoTubeBot) сервисы загрузки работают через python-rq - то есть постоянно запущены несколько процессов-воркеров, которые слушают очередь запросов и при получении запроса начинают загружать в несколько потоков.

  • здесь же пока что загрузчики запускаются через subprocess - на один блок один процесс - то есть каждый раз тратится много ресурсов на создание процесса, старт интерпретатора и тд, кроме того - для маленьких размеров файла многопоточность не дает большого плюса - так как на переключение между потоками затраты превышают выигрыш(не успевает раскачаться условно говоря) - поэтому количество потоков зависит от размера файла загружаемого.

  • сама загрузка не очень оптимально сделана - чанки распределяются между потоками и загружаются итерациями пачками - то есть когда поток заканчивает загрузку - он ждет следующей итерации чтобы начать загружать дальше

  • в данной реализации загрузка была через диск и dedupfs еще и буферизует весь файл перед загрузкой, сейчас перевел upload на pipe, download тоже, но вылез баг и вернул на NamedTemporaryFile пока что

  • TelegramClientX закомментирован был из за совместимости с Telethon 0.19.1 - в нем есть поиск по сообщениям, но не работало на тот момент с моим модом, сейчас актуализировал

В итоге - чтобы скорость выжать нормальную нужно:

  • перейти к формату постоянно работающих воркеров в отдельных процессах и rpc, для совместимости этих сервисов с разными ОС. интерфейс для запросов - сеть, конкретное решение пока думаю - скорей всего это будет GRPC
  • передача данных через пайпы
  • оптимизация многопоточной загрузки, минимизация простоев
  • получение блоков по file_id, а не поисковым запросам
  • переделать реализацию VFS самой - dedupfs довольно плохо реализована(буферизация всего файла, неоптимальная, глючная и тд)
  • динамический размер блока + кэширование
    ...еще есть менее значимые детали - основное вроде написал

В принципе от текущей версии можно отталкиваться уже в улучшении - самое пока что тут кривое это непосредственно dedupfs - по хорошему нужно этот блок на что то заменить вменяемое.
Что касается сервисов загрузки - я доделаю и упакую в некую либу кросплатформенную вроде tdlib, в ней будет воркеров несколько и сетевой интерфейс

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

No branches or pull requests

3 participants