Увеличить скорость
Установил на европейский VPS с хорошим каналом, но средняя скорость ≈60 Mbit.
Как можно её увеличить?
Изменить размер блока?
Увеличить число потоков?
Что-то ещё?
Примерно через час скорость падает до нескольких сотен килобитт. Появляются огромные задержки. Использование становится невозможным.
Насколько мне известно, то надо использовать TelegramX, т.к. он модифицированный и там скорость до 240. Но автор почему-то закоментил все связанное с TelegramX.
скорость 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, в ней будет воркеров несколько и сетевой интерфейс