Истощение кучи desktop-а сервиса
От: YDE  
Дата: 24.02.10 10:35
Оценка:
Здравтсвуйте.

Есть приложение-сервис, назовем его "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?
Re: Истощение кучи desktop-а сервиса
От: Jolly Roger  
Дата: 24.02.10 15:13
Оценка:
Здравствуйте, YDE, Вы писали:

Простите, а что такое "куча desktop-а сервиса"?
"Нормальные герои всегда идут в обход!"
Re[2]: Истощение кучи desktop-а сервиса
От: ononim  
Дата: 24.02.10 16:02
Оценка: 4 (1)
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", но это решаемая задача. Не нравится, в этом варианте то, что сервисов нужно два...
Re: Истощение кучи desktop-а сервиса
От: Pavel Dvorkin Россия  
Дата: 25.02.10 07:52
Оценка:
Здравствуйте, 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, но пусть не он запускает, а тот же стартер ?
With best regards
Pavel Dvorkin
Re: Истощение кучи desktop-а сервиса
От: ononim  
Дата: 25.02.10 08:12
Оценка: 2 (1)
YDE>Есть приложение-сервис, назовем его "A", работающий под учетной записью администратора.
YDE>Кроме того имеется приложение "B"(не сервис), несколько экземпляров которого запускает "A".
Запускать каждый экземпляр B на отдельном десктопе, создавая его вначале при помощи CreateDesktop и затем передавая имя созданного десктопа в STARTUPINFO.
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.