tgcloud icon indicating copy to clipboard operation
tgcloud copied to clipboard

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

Open strannik-j opened this issue 6 years ago • 3 comments

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

strannik-j avatar Jun 19 '19 08:06 strannik-j

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

strannik-j avatar Jun 19 '19 10:06 strannik-j

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

VadVergasov avatar Jun 19 '19 22:06 VadVergasov

скорость 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, в ней будет воркеров несколько и сетевой интерфейс

SlavikMIPT avatar Jul 08 '19 11:07 SlavikMIPT