Как мне найти причину высоких отложенных вызовов процедур?
У меня есть двухъядерный процессор, и один из двух постоянно на 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 внезапно падает: вы нашли своего преступника!)
К сожалению, после отключения всего, что я, возможно, мог (хотя все еще мог использовать компьютер - не отключайте жесткий диск, видеокарту, мышь или 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, я выбрал Сводную таблицу. Это показывает разбивку времени, проведенного в ЦОД водителем:
Сразу вижу одного водителя (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 в покое.
Это исправило это для меня, и теперь я решил все мои конфликты с драйверами. Надеюсь, это вам тоже поможет.