Проблема со счетчиками производительности на Vista - PullRequest
2 голосов
/ 30 мая 2009

Я столкнулся со странной проблемой в Vista с API мониторинга производительности. В настоящее время я использую код, который отлично работал на XP / 2k, основанный на PdhGetFormattedCounterValue (). Я начинаю использовать PdhExpandWildCardPath для расширения счетчиков (меня интересует общая статистика сети), счетчики, на которые я смотрю:

\\Network Interface(*)\\Bytes Received/sec
\\Network Interface(*)\\Bytes Sent/sec
\\Processor(_Total)\\% Processor Time

Проблема в том, что при первом вызове они возвращают PDH_INVALID_DATA, я не думаю, что это проблема, поскольку, если я сделаю запрос снова, я начну получать данные без ошибки. Проблема в том, что, хотя процессорное время работает точно так, как ожидалось, ни один из счетчиков сетевого интерфейса ничего не возвращает - просто 0 все время. Я с помощью Perfmon проверил, что они сообщают данные нормально, поэтому я не знаю, в чем может быть проблема. Я поймал это в MS:

http://support.microsoft.com/?scid=kb%3Ben-us%3B287159&x=11&y=9

Но меня не интересует многоязычность для моей задачи, поэтому я не думаю, что это актуально. Я посмотрю, смогу ли я придумать какой-нибудь базовый код, показывающий, что именно я делаю, но ничего не возвращает ничего странного, и это работало на XP / 2k, поэтому я подозреваю, что что-то изменилось под капотом. Спасибо!

1 Ответ

1 голос
/ 12 июля 2009

Оказалось, что проблема заключалась в том, что оба сетевых интерфейса являются подстановочными знаками, тогда как процессорный фактически уже свернут мониторингом производительности. Чего я не осознавал, так это того, что PdhExpandWildCardPath не возвращал что-то, что напрямую использовалось PdhAddCounter. Под этим я подразумеваю, что если ExpandWildCard возвращает 3 расширенных совпадения, они возвращаются как строки, разделенные нулем, - я понял это, но я предполагал, что AddCounter будет эффективно создавать счетчик, содержащий все три. Нет, на самом деле мне нужно разбить каждый путь и запросить его отдельно от AddCounter, а затем свернуть результаты вручную, когда я их получу.

Надеюсь, это поможет кому-то еще избежать той же ошибки, которую я совершил с меньшим разочарованием. ;)

...