Требуется анализ трассировки — работа системы замедляется, когда указатель мыши находится на рабочем столе

у нас странная проблема. Это в Windows Server 2016, но его также можно воспроизвести в «обычной» Windows 10. В системе запущено около 160 процессов. Общая загрузка ЦП составляет 10-16%. Теперь проблема: каждый раз, когда указатель мыши находится на чистом рабочем столе (не над значком или каким-либо окном), система работает чертовски медленно. Не только наши процессы, но и все остальные (даже окно процессхакера) ведут себя абсолютно медленно. Если указатель мыши находится над каким-либо окном или панелью задач – все снова в порядке.

У меня есть разговор с Брюсом Доусоном в его блоге , но у него нет времени (конечно) анализировать мою ETL-Trace. Он предлагает опубликовать это в Интернете и попросить о помощи.

Я сделал скриншот WPA, чтобы вкратце объяснить:

Я аннотировал скриншот, чтобы можно было видеть, где находится мышь на рабочем столе или в окне. В представлении стеков можно видеть, что количество переключений контекста уменьшается, когда мышь находится над рабочим столом, а в представлении «Загрузка ЦП (выборка)» есть записи RtlUserThreadStart именно для этого времени, но я понятия не имею, откуда они берутся.

Первый из наших процессов — это «ProcessController.exe», который запускает все остальные, такие как «GpioController.exe», «DCIIF_Simulation» или «RouterIF_Simulation.exe» и т. д. Все они взаимодействуют с процессом под названием «StatusController.exe», но в трассировку они делают только между ними.

Брюс сказал мне найти точку, в которой наш процесс чего-то ожидает, но я не могу найти блокировку или что-то подобное.

Я загрузил заархивированный etl-trace, если кто-то примет вызов.

заархивированный etl-trace

1 ответ

После того как нам удалось добавить символы отладки в некоторые из наших процессов, мы обнаружили проблему в Delphi-VCL/Forms.pas. В новой трассировке с отладочными символами мы увидели, что метод Application.DoMouseIdle тратит много времени на поиск VCLWindows, получение их родителей и так далее. Источником замедления является метод FindDragTarget. Нашим процессам не нужна функциональность перетаскивания, и им не нужно, чтобы где-то отображалась подсказка. Поэтому мы вырезали этот вызов функции из кода, что было непросто. Теперь все работает быстро, независимо от положения мыши.

Другие вопросы по тегам