Есть приложение-сервис, назовем его "A", работающий под учетной записью администратора.
Кроме того имеется приложение "B"(не сервис), несколько экземпляров которого запускает "A".
"B", при запуске, грузит огромный COM-объект.
В результате запускается только два процесса "B", а остальные завершаются с ошибкой: 'System.Runtime.InteropServices.COMException was unhandled
Message="An error occurred on attempt to send request for Application object"
Source=""
ErrorCode=-2147467259'.
Выяснилось, что это происходит из-за истощения размера кучи desktop-а "A".
Использование способа увеличения размера кучи через HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows оказалось неприемлемым.
Вариант старта "A" под LocalSystem, с установкой 'Allow service to interact with desktop' — тоже не подходит, т.к. "A" должен иметь доступ к сетевым ресурсам.
Как решить проблему запуска "B" из "A" в количестве, большем чем 2?
JR>Простите, а что такое "куча desktop-а сервиса"?
desktop heap, лежит в session space, в нем храняться объекты окон, менюшек, хуков, и прочей user32 лабудени.
Имеет размер вроде 32 мб по дефолту (настраивемый) для десктопов интерактивной оконной станции сессии, и совсем мало (тоже настраиваемый) — для тех которые принадлежат неинтерактивной оконной станции.
Еще хип десктопа winlogon'а тоже маленький. И ненастраиваемый к тому же.
Как много веселых ребят, и все делают велосипед...
Re[3]: Истощение кучи desktop-а сервиса
От:
Аноним
Дата:
25.02.10 06:06
Оценка:
Здравствуйте, ononim, Вы писали:
JR>>Простите, а что такое "куча desktop-а сервиса"? O>desktop heap, лежит в session space, в нем храняться объекты окон, менюшек, хуков, и прочей user32 лабудени. O>Имеет размер вроде 32 мб по дефолту (настраивемый) для десктопов интерактивной оконной станции сессии, и совсем мало (тоже настраиваемый) — для тех которые принадлежат неинтерактивной оконной станции. O>Еще хип десктопа winlogon'а тоже маленький. И ненастраиваемый к тому же.
Все это очень интересно, с точки зрения повышения уровня образования, но никаким образом не связано с решением проблемы. Иными словами, как запустить процесс из под сервиса так, чтобы он не использовал его(сервиса) кучу?
Вообще-то мысли на эту тему есть, например: создать второй сервис, который будет периодически запускаться и останавливаться, производя, при старте запуск процесса "B". Остается вопрос коммуникаций между "A" и "B", но это решаемая задача. Не нравится, в этом варианте то, что сервисов нужно два...
Здравствуйте, YDE, Вы писали:
YDE>Есть приложение-сервис, назовем его "A", работающий под учетной записью администратора. YDE>Кроме того имеется приложение "B"(не сервис), несколько экземпляров которого запускает "A".
YDE>"B", при запуске, грузит огромный COM-объект. YDE>В результате запускается только два процесса "B", а остальные завершаются с ошибкой: 'System.Runtime.InteropServices.COMException was unhandled YDE>Message="An error occurred on attempt to send request for Application object" YDE>Source="" YDE>ErrorCode=-2147467259'.
YDE>Выяснилось, что это происходит из-за истощения размера кучи desktop-а "A".
Что-то странное. B запускается на интерактивной оконной станции, A — на сервисной. Не удается запустить нужного количества B из-за того, что А на другой странции съел память.
Вопрос 1. А если просто запустить несколько экземпляров B без всякого A ? Вручную или через примитивный стартер ?
Вопрос 2. То же самое при работающем A, но пусть не он запускает, а тот же стартер ?
YDE>Есть приложение-сервис, назовем его "A", работающий под учетной записью администратора. YDE>Кроме того имеется приложение "B"(не сервис), несколько экземпляров которого запускает "A".
Запускать каждый экземпляр B на отдельном десктопе, создавая его вначале при помощи CreateDesktop и затем передавая имя созданного десктопа в STARTUPINFO.
Как много веселых ребят, и все делают велосипед...