понедельник, 21 апреля 2014 г.

Кушаем CPU при большой очереди закачек

Привет
Часто жаловались на тормоза флая на слабых компах если в очереди много закачек. 
Нашел в коде несколько моментов:
1. При работ клиента в активном режиме на него постоянно приходит несколько десятков запросов в секунду
на поиск различных TTH.




















2. Если флай не находя данные TTH у себя в шаре (там выполняется быстрый поиск через unordered_map)
выполняет дополнительный запрос к менеджеру закачек 
в этом месте к сожалению идет линейный поиск по контейнеру т.к. ключом в мапе является имя файла а не TTH
https://github.com/pavel-pimenov/flylinkdc-r5xx/blob/f8157019835b79ab9000134444cd9a9982020ff3/client/QueueManager.cpp#L3044
https://github.com/pavel-pimenov/flylinkdc-r5xx/blob/f8157019835b79ab9000134444cd9a9982020ff3/client/QueueManager.cpp#L210
у некоторых пользователей в очереди закачек висят тысячи файлов постоянный и очень частый линейный просмотр такого 
контейнера кушает CPU в холостую т.к. вероятнее всего в очереди так-же нет файлов с такими ТТХ
тут я пока планирую завести дополнительный контейнер unordered_set где буду отслеживать наличие  TTH в очереди..
или может есть более оптимальный вариант?

3. Если TTH находится в очереди (это бывает когда вы качаете что-то популярное и большое которые одновременно все ищут) 
то выполняется создание UDP сокета
формирование информации какие части файла есть уже есть в клиенте через функцию SearchManager::toPSR
и передача UDP пакета в того кто ищет этот файл.
при этом выполняются команды разбора URL адреса на части 
в строках Util::decodeUrl(aSeeker, proto, ip, port, file, query, fragment);
а также дополнительный Socket::resolve(ip) перед посылкой UDP
пока не понял зачем делается эта операция тогда как по описанию команды в Search
в то место может попасть только IP:Port
аналогичный код   находится и в StrongDC++ в AirDC++ его немного оптимизировали
сделав UDP-Socket не временным а как мембер менеджера - он создается один раз.
Кто знает/тестировал насколько создание и разрушение UDP сокета затратная операция - наверно стоит сделать аналогично.?
другие мысли можете высказать если есть идеи в этом месте.
 
Отправить комментарий