Whe*_*zil 15 windows createprocess
问:我有一个Windows服务,它产生了很多子进程.似乎有一些限制,大约100,这个过程无法启动.CreateProcess()调用带有pid返回,但是然后该过程无法实现.如果我将服务器作为控制台应用程序运行,则此限制将消失.另外,如果我设置了DETACHED_PROCESS标志,则此限制会增加一倍以上.但是,如果我设置DETACHED_PROCESS并调用CreateProcesssWithLogonW(),我会失败.
Whe*_*zil 28
这是一个"桌面堆"问题.可以在这里找到一个非常好的讨论:
请注意,这仅适用于作为服务运行的程序,因为服务的默认桌面堆大小远小于应用程序的大小.
在我们的例子中,我们能够在没有更改的情况下耗尽资源之前启动大约100个子进程.随着变化,这个数字可以大大增加.
这是我们在知识库中给予最终用户的答案:
警告:这会影响所有服务的桌面堆!不要使其大于必要的大小,否则您将推动系统消耗更多资源,并且可能会遇到总可用桌面堆大小的问题.
如果您发现无法打开超过100个项目,即使在非常大的RAM服务器上,您也可能遇到Windows"桌面堆大小"的限制.
问题是Windows下的服务会话(服务运行的地方)可用于创建窗口的"桌面堆"空间较少.
简短版本是:
与交互式会话相比,服务获得更小的桌面堆.
桌面堆大小限制了窗口数
即使我们看不到它们,每个子服务器也会创建一个或多个"窗口".
解:
在进行任何更改前备份您的注册表!
以管理员身份运行regedit.exe
编辑注册表值:
Run Code Online (Sandbox Code Playgroud)HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows
您将看到如下字符串:
Run Code Online (Sandbox Code Playgroud)%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,20480,768 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ServerDll=sxssrv,4 ProfileControl=Off MaxRequestThreads=16
关键位是:
Run Code Online (Sandbox Code Playgroud)SharedSection=1024,20480,768
第二个数字(20480)是交互式会话的大小.第三个数字(768)是非交互(服务)会话的大小.注意第三个数字是如何比第二个数字小26倍.在实验上,我们发现将其更改为:
Run Code Online (Sandbox Code Playgroud)SharedSection=1024,20480,2048
将项目限制从106增加到270,几乎完全按比例缩放.选择一个值,该值反映您希望系统上的所有用户同时打开的最大项目数.不要使此值大于必要值,且不大于8192,因为系统中的每个服务都会消耗更多宝贵的资源.
您需要重新启动才能使这些新设置生效.
归档时间: |
|
查看次数: |
16866 次 |
最近记录: |