Определить 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!
Re: Определить CPU usage из-под IIS
От: boot  
Дата: 13.08.11 03:23
Оценка: 2 (1)
Здравствуйте, eug.lv, Вы писали:

EL>...


А Вы попробуйте отобразить, рядом с загрузкой ЦП, имя пользователя под которым запущено веб-приложение. При отладке оно запускается от другого пользователя и с другими правами. Здесь речь не о том, из-под кого запущен IIS, а о том, из-под кого запущено веб-приложение.
Жизнеспособность прямо пропорциональна простоте!
Re[2]: Определить CPU usage из-под IIS
От: eug.lv  
Дата: 13.08.11 10:39
Оценка:
Здравствуйте, boot, Вы писали:

B>А Вы попробуйте отобразить, рядом с загрузкой ЦП, имя пользователя под которым запущено веб-приложение. При отладке оно запускается от другого пользователя и с другими правами. Здесь речь не о том, из-под кого запущен IIS, а о том, из-под кого запущено веб-приложение.


Ага, спасибо. Хоть пул приложений IIS был запущен от Администратора, но сам ISAPI Extension работал от пользователя IUSR. Вызов функции RevertToSelf(), как описано здесь, помог.
Всё равно на хостинге нет прав запустить пул приложений IIS от другого пользователя, так что реализовал вывод загрузки ЦП с помощью NtQuerySystemInformation
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.