Что?
В конце прошлого года я начал сталкиваться с необычными периодически возникающими проблемами подключения на десктопе. В целом, подключение было стабильным и со средними задержками; однако во (вроде бы) случайные моменты времени на протяжении недели через каждые пару секунд возникали резкие пики задержек в две с лишним тысячи миллисекунд.
Из-за этого было невозможно пользоваться всем ПО для аудио-/видеозвонков и играть в большинство онлайн-игр.
Эта проблема возникла примерно во время моего переезда через всю страну из штата Вашингтон в Южную Каролину, поэтому было слишком много факторов, чтобы с лёгкостью выявить источник. Однако в основном проблема влияла только на игры и аудио-/видеозвонки, поэтому я особо не обращал на неё внимания.
На протяжении последней пары месяцев я постепенно пытался разобраться, что происходит, но до сегодняшнего дня мне этого сделать не удавалось.
Почему?
Изначально в проблеме было ясно только то, что она затронула исключительно мой настольный компьютер. Ноутбук и другие устройства, подключенные к WiFi, не имели этой проблемы, даже если поместить их в то же место, где находился десктоп.
Первым делом я купил на Amazon новый WiFi-адаптер с хорошими отзывами. Это не решило проблему. Зато в комплекте с адаптером я нашёл предложение выслать бесплатную флэшку на 64 ГБ в обмен на хороший отзыв.
(В конечном итоге это оказалась довольно скверная покупка.)
Позже (не из-за описываемой в статье проблемы) я собрал совершенно новый настольный компьютер, в котором не было ничего из старого компьютера, за исключением нового WiFi-адаптера. На компьютере была «с нуля» установлена Windows 10.
Всё было отлично, у нового компьютера не возникало проблем! Я подозревал, что в процессе переезда в Южную Каролину повредились USB-разъёмы старой материнской платы, и что причина в этом. Ведь теперь-то всё в порядке?
Нет. Всё не было в порядке.
Несколько недель спустя проблема внезапно начала возникать и на новом компьютере, и я понятия не имел, в чём может быть причина.
Я попробовал подключать несколько разных WiFi-адаптеров из своих запасов.
Я пытался сменить канал WiFi, поскольку мне казалось, что он накладывается на канал соседей.
Я попробовал отключить Windows Update Delivery Optimization (службу обновлений p2p). После её отключения и перезапуска компьютера проблема, казалось, была решена, но позже возникла снова.
В какой-то момент проблема с WiFi и прерывание звонков в Skype настолько достала одного из моих братьев, что он купил мне на Amazon ещё один (чуть менее подозрительный) WiFi-адаптер. Казалось, он временно устранил проблему после установки драйвера Realtek и перезапуска, но потом она вернулась.
ЭНДРЮ, ПОЧИНИ СВОЙ ЧЁРТОВ WIFI, РАДИ БОГА. ВАЖНО: устанавливай драйвер Realtek 8812au с веб-сайта, НЕ с веб-сайта производителя
Похоже было, что проблему устранить невозможно.
Сегодня в последней отчаянной попытке устранить проблему я сделал следующее:
- Отключил вентилятор в своей комнате
- Отсоединил USB-донгл беспроводного планшета для рисования Wacom.
- Закрыл FireFox
- Закрыл MediBang Paint Pro
Проблема исчезла.
Я сразу же заподозрил наличие помех от беспроводного планшета или вентилятора, поэтому включил их снова, но причиной оказались не они.
Я представить не мог, как эту проблему могли бы вызвать браузер или приложение для рисования, но всё равно проверил их.
Сначала я запустил FireFox, открыл несколько вкладок с разными сайтами и подождал…
Ничего.
Затем я запустил MediBang Paint Pro.
Почему!?
Какого чёрта, почему ПО для цифрового рисования вызывает всплески задержек WiFi?
Оказалось, что люди много раз жаловались на эту проблему с MBPP.
Если посмотреть в Process Monitor, то можно увидеть, что действительно происходит что-то странное.
В тот самый момент, когда возникает всплеск задержек, MBPP начинает опрашивать ключи реестра всех сетевых интерфейсов.
Чтобы глубже разобраться в том, почему это происходит, мы можем подключиться к процессу с помощью отладчика (в данном случае x64dbg) и установить точки останова на API Win32 Reg*.
Рано или поздно мы попадём в точку останова
RegOpenKeyExInternalW
, после чего изучим стек вызовов, чтобы понять, где откуда выполняется вызов.
Посмотрев на стек вызовов, мы видим, что первая несистемная библиотека в стеке — это qt5network.
Как ни удивительно, дальнейшая отладка не потребуется — поиск в Google по запросу «q5network ping issue» приводит нас к QTBUG-40332.<
Если я верно всё понимаю, любое приложение Qt5 (младше версии 5.14), использующее QNetworkAccessManager
, каждые десять секунд проверяет изменения в интерфейсе WiFi с целью управления носителем, что вызывает серьёзные всплески задержек или полную потерю пакетов. Даже если экземпляр QNetworkAccessManager
создаётся внутри для чего-то простого, например, для HTTP-запроса.
Похоже, обойти эту проблему достаточно легко — присвоить переменной окружения QT_BEARER_POLL_TIMEOUT
значение -1
.
Жаль, что я не знал этого восемь месяцев назад.
TL;DR
Последние семь-восемь месяцев библиотека Qt5 портила WiFi всего моего компьютера просто из-за запуска MediBang Paint Pro.
По глупости я связывал это со множеством других вещей, ведь кто мог представить, что Qt будет причиной проблем с WiFi во всей системе?
Дополнительная информация по теме
- https://invent.kde.org/graphics/krita/-/commit/d4eaaa63af8dc769acf79cd497e741f1de9be31b
- https://github.com/sqlitebrowser/sqlitebrowser/issues/1209
- https://github.com/mumble-voip/mumble/issues/1585
- https://community.amd.com/thread/209327
- https://github.com/Mudlet/Mudlet/issues/1587
- https://github.com/MultiMC/MultiMC5/issues/1422
- https://lostdomain.org/2017/06/17/qt-qnetworkaccessmanager-causing-latency-spikes-on-wifi/