Как мне найти причину высоких отложенных вызовов процедур?

У меня есть двухъядерный процессор, и один из двух постоянно на 100%. Поиск в ProcessExplorer показывает мне, что это отложенные вызовы процедур. Чтение вокруг сети, кажется, дает мне множество разных ответов.

Можно ли изложить пару шагов, чтобы попытаться сузить суть проблемы в моем случае?

Обновление 1: FWIW, проблема сохраняется даже в безопасном режиме.

Обновление 2: я отключил все, что мог, от задней панели ПК, и это купило мне на 40% больше бесплатного процессора. Я также скачал инструмент RATTV3, но по какой-то причине на моей машине он не дает мне разбивку драйверов. Здесь есть хорошее описание как DPCLatencyChecker, так и RATTV3.

Обновление 3: LatencyMon (см. Мой ответ ниже) говорит мне, что это nvstor32.sys - это драйвер SATA от NVidia - со временем около 5300 мкс.

Обновление 4: сюжет утолщается, и, размышляя о том, стоит ли пытаться загрузить загрузочный диск (чтобы увидеть, действительно ли это драйверы, а не аппаратная проблема), я заметил, что DVD/CD-проигрыватель не работает (то есть даже не открывает дверь, когда я нажимаю на кнопку). Учитывая, что машина только что вернулась после замены материнской платы, я подумала, может быть, они забыли подключить ее. Я открыла коробку, все было в порядке, но я отключила и снова включила ее. При перезагрузке все было в порядке - больше нет DPC (самый высокий сейчас 300 мкс)!

Обновление 5: на следующий день проблема возвращается, проигрыватель компакт-дисков снова не работает, даже курсор в текстовом поле пароля медленно мигает... Пробовал отключить все, что я мог придумать, и при второй перезагрузке снова работал (как на Update2). В следующий раз я попытаюсь полностью отключить проигрыватель компакт-дисков...

Обновление 6: только что заметил системный журнал событий nvstor32.sys дает ошибку, говоря Parity error detected in \Device\RaidPort0, затем предупреждение об отправке повторной инициализации. Теперь просто нужно решить, какой RaidPort0 это... (обратите внимание, у меня нет настроек RAID, это просто болотный стандарт Acer). О, и моя установка Avast, очевидно, была убита, когда я выполнял откат системы (или как он там называется), потому что он не запускается (ошибка RPC), не удаляется (произошла ошибка setiface).

Обновление 7: Наконец-то пришло время перезагрузки с отключенным DVD. Больше никаких проблем с ЦОД! (много ошибок страницы, хотя, но это на потом). Следующий шаг: выясните, если это кабель или DVD-плеер.

Обновление 8: заимствовал кабель SATA, загрузился с ним, без проблем. CD/DVD-плеер работает, нет проблем с DPC nvstor32.sys Процессоры не заблокированы. Счастливый конец... почти: у меня все еще есть проблемы с Avast, очевидные проблемы с DPC storport.sys при запуске (может быть, нормально для USB?), и много серьезных ошибок страницы. Но это будет предметом других вопросов.

Постскриптум: у меня недавно возникла та же проблема, и с помощью того же метода удалось отследить ее до USB-флешки (той, которую я использовал для ReadyBoost), которую снимали.

6 ответов

Решение

Вот история того, как я нашел причину моей высокой задержки DPC.


Моя система испытывала щелчки и треск во время воспроизведения звука. Я знал, что это означало, что что-то в режиме ядра перегружало процессор. Моей первой мыслью было поковыряться в Process Explorer и посмотреть, не выглядит ли что-нибудь неуместным. Единственное, что привлекло мое внимание, это чрезмерное количество времени, затрачиваемое на выполнение отложенных процедурных вызовов (DPC):

Я знал, что DPC - это код, запускаемый внутри драйвера; Задача состояла в том, чтобы выяснить, какой водитель. Я обратился к DPC Latency Checker, который показал мне, насколько велика задержка:

снимок экрана DPC Latency Checker

DPC Latency Checker предлагает пройтись по устройствам в диспетчере устройств и отключить ненужное оборудование по одному (например, сетевую карту, звуковую карту) в надежде изолировать неисправный драйвер. (Если вы отключаете устройство, и задержка DPC внезапно падает: вы нашли своего преступника!)

скриншот отключения устройств

К сожалению, после отключения всего, что я, возможно, мог (хотя все еще мог использовать компьютер - не отключайте жесткий диск, видеокарту, мышь или USB-концентратор, к которому подключена мышь!), Задержка все еще была высокой. Затем я обратился к Windows Performance Toolkit (часть Windows SDK) и отличному сообщению в блоге Питера Вейланда "Измерение времени DPC". После установки Windows Performance Toolkit:

Я открыл командную строку с повышенными правами и запустил:

>xperf -on Latency

Примечание: Latency группа - это предопределенный набор событий, которые можно отследить от поставщика группы ядра:

>xperf -providers kg
   Base           : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+PROFILE+MEMINFO
   Diag           : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+DPC+INTERRUPT+CSWITCH+PERF_COUNTER+COMPACT_CSWITCH
   DiagEasy       : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+DPC+INTERRUPT+CSWITCH+PERF_COUNTER
   Latency        : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+DPC+INTERRUPT+CSWITCH+PROFILE
   ...

В этом случае Latency соответствует флагам ядра:

  • PROC_THREAD Обработать и создать / удалить поток
  • ПОГРУЗЧИК Ядро и пользовательский режим Image Load/Unload события
  • ПРОФИЛЬ CPU Образец профиля
  • Переключение контекста CSWITCH
  • DPC DPC События
  • INTERRUPT Прерывание событий
  • DISK_IO Дисковый ввод / вывод
  • HARD_FAULTS Жесткие ошибки страницы

После того, как я позволил этому запускаться в течение минуты, я остановил трассировку и сохранил ее в файл:

C:\Users\Ian\Desktop\xperf -d thingy1.etl

И тогда я просмотрел результаты трассировки с помощью команды:

C:\Users\Ian\Desktop\xperf thingy1.etl

Это загружает графический анализатор производительности Windows. Щелкнув правой кнопкой мыши по графику использования ЦП DPC, я выбрал Сводную таблицу. Это показывает разбивку времени, проведенного в ЦОД водителем:

снимок экрана с выводом XPerf

Сразу вижу одного водителя (tsvp.sys) занимает в среднем 2,8 мс на одно выполнение DPC, что на порядок медленнее, чем у любого другого драйвера:

Скриншот

погуглить tsvp.sys дал мне ответ: CommView, который я недавно установил.

Вопрос теперь в том, как отключить этот драйвер. Используя автозапуск, я вижу, что он установлен как служба драйверов:

скриншот автозапуска

Используя диспетчер устройств, я могу отключить службу, на которой размещен этот драйвер. Сначала вы должны показать скрытые устройства, а затем развернуть Non-Plug and Play Drivers узел:

снимок экрана диспетчера устройств

Наконец я смог остановить службу драйверов и изменил режим запуска с System (то есть драйвер является неотъемлемой частью Windows, и Windows не может загрузиться без него), чтобы Demand (то есть я могу запустить драйвер, когда захочу):

снимок экрана диспетчера устройств

Остановка службы драйверов сразу исправила задержку моего DPC:

Скриншот

Я могу или не могу полностью удалить CommView, но на данный момент я решил проблему с высокой задержкой DPC.


Обновление: Начиная с Windows 8, вы больше не можете видеть драйверы без Plug and Play в диспетчере устройств:

Примечание. Начиная с Windows 8 и Windows Server 2012, диспетчер Plug-and-Play больше не создает переустановки устройств для не PnP (устаревших) устройств. Таким образом, нет таких устройств для просмотра в диспетчере устройств. Чтобы включить скрытые устройства в отображение диспетчера устройств, нажмите "Просмотр" и выберите "Показать скрытые устройства".

Microsoft забрал эту функцию и заменил ее ничем. Хорошая работа.

В типичной ярости ботаников, некоторые бесполезные ответы:

  • Диспетчер устройств никогда не показывал не драйверы pnp
  • Зачем тебе это нужно?

К счастью, NirSoft создал замену. ServiWin позволяет вам видеть, останавливать и запускать все службы (даже те, которые Microsoft решила разрешить администраторам видеть):

ОТЧЕТ О ПРОГРЕССЕ

Лучший инструмент, который я нашел на данный момент, - это LatencyMon, который в основном делает все, что делают предыдущие два инструмента, не заставляя вас думать. Страница загрузки просит вас зарегистрироваться по электронной почте - но у меня ничего не случилось, когда я это сделал - но вы можете в любом случае прокрутить страницу вниз, чтобы загрузить.

альтернативный текст

В моем случае я использовал LatencyMon (из ответа Бенджола) и обнаружил, что водитель заморозил жизнь, вселенную и все было (также) storport.sys который является драйвером Microsoft для " высокопроизводительных автобусов". Это подтвердило мое подозрение, что проблема связана с IO.

Я также пошел дальше и посмотрел на мою Windows 7 Event Viewer, папку " Журналы Windows -> Приложение", и обнаружил несколько пакетов ошибок из Volume Shadow Copy (VSS), происходящих каждые 30 минут до 2 часов. Они детали были такими:

Volume Shadow Copy Service error: Error calling a routine on the Shadow Copy Provider {b5946137-7b9f-4925-af80-51abd60b20d5}. Routine returned E_INVALIDARG. Routine details GetSnapshot({00000000-0000-0000-0000-000000000000},000000000023C850). 

Operation:
   Get Shadow Copy Properties

Context:
   Execution Context: Coordinator

Затем я начал исследовать, что такое VSS и для чего он используется. Я перебрал несколько страниц о проблемах с VSS. Проходя через все это, у меня был один большой подозреваемый: мое программное обеспечение для резервного копирования CrashPlan.

Следуя этому примеру, я быстро нашел страницу, связывающую его с ошибками VSS. Следуя инструкциям там, чтобы отключить резервное копирование открытых файлов, которые используют VSS, зависания, высокая загрузка ЦП ядра и т. Д. Были полностью исчезли. И не поймите меня неправильно: CrashPlan великолепен! Просто эта функция не работает на моей машине.

Кстати, эта страница прямо здесь была ОДНОЙ, которая дала мне первоначальное руководство, которое помогло мне найти основную причину моих проблем. Большое спасибо @Benjol и всем, кто ответил ранее! Я надеюсь, что мой ответ также поможет другим...

Вероятно, есть драйвер устройства, который поддерживает вашу систему. Один из способов проанализировать это - запустить проверку задержки DPC. Затем отключите один драйвер за раз и посмотрите, снизится ли загрузка DPC. (Process Explorer также работает.)

Вы можете отключить драйверы устройств в разделе "Управление компьютером" -> "Диспетчер устройств".

Я чувствую, что должен добавить свой ответ здесь, потому что эту проблему трудно решить, и не всегда из-за плохих драйверов или конфликтов IRQ.

У меня была высокая задержка RPC, которая вызывала треск / треск на моей звуковой карте USB. Инструменты, описанные в принятом ответе, не помогли определить конкретный драйвер, который вызывал проблему. Задержка происходила во многих процессах: HAL, USBPORT.SYS и ядре Windows. Более глубокое изучение этих процессов не выявило очевидного виновника.

В моем случае оказалось, что проблема была более низкого уровня и характерна для материнских плат GigaByte с определенными наборами микросхем и версиями BIOS. Решение состояло в том, чтобы отключить Intel SpeedStep и все другие специальные функции материнской платы, которые регулировали скорость процессора и напряжение на лету. Как только эти опции были отключены, моя задержка RPC была немедленно исправлена.

Я начал видеть эту ошибку после устранения ошибки IRQ с моим контроллером Ethernet nVidia 10/100/1000, который появился при обновлении моей видеокарты до GeForce GTX 550 Ti.

Кажется, после обновления до новых драйверов GeForce 295.73 и последующего разрешения конфликта прерываний я удалил, повредил или удалил существующие драйверы контроллера nForce SATA/RAID. Я не использую RAID, ошибка все еще сохраняется, и время от времени зависает 64-битная Vista Ultimate.

Попробовав все предложения по устранению неполадок, которые я нашел в Интернете, представилось простое решение... Я перешел на nForce SATA/RAID контроллер 15.58, но оставил другие драйверы nForce в покое.

Это исправило это для меня, и теперь я решил все мои конфликты с драйверами. Надеюсь, это вам тоже поможет.

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