Определить CPU usage из-под IIS
От: eug.lv  
Дата: 12.08.11 22:09
Оценка:
Здравствуйте, задавал этот вопрос в форуме "веб программирование", но не получил ответа. Думаю вопрос больше относится к Win API.
Есть код, который использует performance counters для обнаружения загрузки ЦП по ядрах (http://msdn.microsoft.com/en-us/library/aa373214(v=VS.85).aspx)
Код нормально работает когда он скомпилирован в отдельном exe файле и запущен как сервис или как отдельное приложение.
Но если этот код поместить в dll и загрузить как расширение к IIS (ISAPI Extension для Internet Information Service 7, операционка Windows Server 2008 R2) — то он перестаёт работать.

Код заключается в последовательном вызове функций:
PdhOpenQuery
PdhExpandWildCardPath(nil, '\Processor(*)\% Processor Time', ...)
PdhAddCounter (для каждого ядра проца)
PdhCollectQueryData
PdhGetFormattedCounterValue (для каждого ядра проца)

В случае, когда код выполняется как ISAPI Extension, вызов функции:
PdhExpandWildCardPath(nil, '\Processor(*)\% Processor Time', ...)
возвращает ошибку:
0x800007D0 (PDH_CSTATUS_NO_MACHINE) Unable to connect to the specified computer, or the computer is offline.

В отдельном приложении эта функция возвращает для моего 4-ёх ядерного процессора такие строки, разделённые 0 символом:
\\COMPNAME\Processor(0)\% Processor Time
\\COMPNAME\Processor(1)\% Processor Time
\\COMPNAME\Processor(2)\% Processor Time
\\COMPNAME\Processor(3)\% Processor Time
Я вбил эти значения в константу и упустил для ISAPI Extension вызов функции PdhExpandWildCardPath.
Дальше функции PdhAddCounter и PdhCollectQueryData сработали без ошибок, но функция PdhGetFormattedCounterValue вернула ошибку:
0x800007D3 (PDH_CSTATUS_ITEM_NOT_VALIDATED)The data item has been added to the query but has not been validated nor accessed. No other status information on this data item is available.

Думал проблема в том, что пул приложений IIS запускается от пользователя, у которого не хватает прав. Но это не так — если установить в IIS запускать пул приложений от пользователя Administrtator — проблема не решается.
Из-под IIS код работает правильно только в одном случае, если остановить сервис IIS (net stop w3svc) и запустить пул приложений IIS для отладки (C:\Windows\SysWOW64\inetsrv\w3wp.exe -debug), в таком случае пул приложений работает как отдельное приложение и код показывает правильную загрузку ЦП.

Подскажите, где копать, почему код на работает под IIS!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.