2013-07-04 4 views
11

प्रश्न: मेरे पास एक विंडोज़ सेवा है जो बहुत सी बाल प्रक्रियाओं को जन्म देती है। ऐसा लगता है कि लगभग 100 सीमाएं हैं, जहां प्रक्रिया शुरू नहीं की जा सकती है। CreateProcess() कॉल एक पिड के साथ वापस आता है, लेकिन फिर प्रक्रिया बस भौतिक बनाने में विफल रहता है। अगर मैं इसके सर्वर को कंसोल एप्लिकेशन के रूप में चलाता हूं, तो यह सीमा दूर हो जाती है। साथ ही, अगर मैं DETACHED_PROCESS ध्वज सेट करता हूं, तो यह सीमा युगल से अधिक है। हालांकि, अगर मैं DETACHED_PROCESS सेट करता हूं और CreateProcesssWithLogonW() को कॉल करता हूं तो मुझे विफलता मिलती है।विंडोज़ सेवा द्वारा उत्पन्न की जा सकने वाली अधिकतम बाल प्रक्रियाओं को कैसे बढ़ाया जा सकता है - डेस्कटॉप ढेर सीमा

उत्तर

22

यह एक "डेस्कटॉप ढेर" समस्या है। एक बहुत अच्छी चर्चा यहां पाया जा सकता:

Desktop Heap Overview

ध्यान दें कि यह केवल, सेवाओं के रूप में चला रहे कार्यक्रमों पर लागू होता है क्योंकि सेवाओं के लिए डिफ़ॉल्ट डेस्कटॉप ढेर आकार इतना है कि अनुप्रयोगों के लिए की तुलना में छोटा होता है।

हमारे मामले में, हम परिवर्तन के बिना संसाधनों से बाहर होने से पहले लगभग 100 बाल प्रक्रियाएं लॉन्च करने में सक्षम थे। परिवर्तन के साथ, इस संख्या में काफी वृद्धि हो सकती है।

इस उत्तर हम अपने नॉलेजबेस पर अपने अंतिम उपयोगकर्ताओं के लिए दिया गया है:

चेतावनी: इस सभी सेवाओं के डेस्कटॉप ढेर को प्रभावित करता है! इसे आवश्यक से बड़ा न बनाएं या आप सिस्टम को अधिक संसाधनों का उपभोग करने के लिए प्रेरित करेंगे और आप कुल उपलब्ध डेस्कटॉप ढेर आकार में समस्याओं के खिलाफ टक्कर मार सकते हैं।

यदि आपको लगता है कि आप लगभग 100 कुल परियोजनाओं को खोल नहीं सकते हैं, यहां तक ​​कि एक बहुत बड़े RAM सर्वर पर भी, तो आप विंडोज़ "डेस्कटॉप हीप आकार" की सीमा में भाग ले सकते हैं।

समस्या यह है कि विंडोज़ के तहत सेवा सत्र (जहां सेवाएं चलती हैं) में विंडोज़ बनाने के लिए इस "डेस्कटॉप ढेर" स्थान से कम है।

लघु संस्करण है:

  • सेवाएं इंटरैक्टिव सत्र की तुलना में छोटे डेस्कटॉप ढेर मिलता है।

  • डेस्कटॉप ढेर आकार खिड़कियों

  • की संख्या को सीमित प्रत्येक उप-सर्वर एक या अधिक "खिड़कियों" बनाता है भले ही हम उन्हें देख नहीं सकते।

समाधान:

  1. बैकअप कोई भी बदलाव करने से पहले अपने रजिस्ट्री!

  2. रन regedit।

    %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 
    

महत्वपूर्ण बिट है:

SharedSection=1024,20480,768 

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows 
  • आप इस तरह की स्ट्रिंग देखेंगे: व्यवस्थापक

  • संपादित करें रजिस्ट्री मान के रूप में exe दूसरा एनयू एमबर (20480) इंटरैक्टिव सत्रों का आकार है। तीसरा नंबर (768) गैर-इंटरैक्टिव (सेवाओं) सत्रों का आकार है। ध्यान दें कि तीसरा नंबर दूसरे की तुलना में 26x छोटा है। प्रयोगात्मक रूप से, हमने पाया है कि यह बदल रहा है:

    SharedSection=1024,20480,2048 
    

    270 करने के लिए 106 से परियोजना की सीमा में वृद्धि, लगभग पूरी तरह से ढेर आकार के साथ स्केलिंग। एक ऐसा मूल्य चुनें जो सिस्टम पर सभी उपयोगकर्ताओं द्वारा एक साथ खोले जाने वाले परियोजनाओं की अधिकतम संख्या को दर्शाता है। इस मान को आवश्यक से बड़ा न बनाएं, और 8192 से बड़ा न हो, क्योंकि आपके सिस्टम में प्रत्येक सेवा एक बहुमूल्य संसाधन का उपभोग करेगी।

  • आपको इन नई सेटिंग्स को प्रभावी होने के लिए रीबूट करने की आवश्यकता होगी।

    +0

    मैं इन सभी 'डेस्कटॉप ढेर' लेखन में भाषा को समझ नहीं पा रहा हूं जो कि सेवाओं को फोर्किंग पर लागू होते हैं, लेकिन इस उत्तर ने हमारे छिपे को बचाया। – covener

    +2

    अविश्वसनीय रूप से पर्याप्त, विंडोज 2008 सर्वर वेब संस्करण (Vista कोर), विंडोज 2008 सर्वर आर 2 (विंडोज 7 कोर), और विंडोज 2012 सर्वर आर 2 (विंडोज 8.1 कोर) पर एक ही सीमाएं लगाई गई थीं। मैंने अपना बदलकर 1024,20480,40 9 6 कर दिया और इन सभी सर्वरों पर 16 से 32 तक अधिकतम थ्रेड को संसाधन उपयोग पर कोई बुरा प्रभाव नहीं पड़ा, लेकिन उन प्रक्रियाओं पर चल रही सेवाओं में एक बढ़ी हुई क्षमता, साथ ही साथ अन्य प्रक्रियाओं को सफलतापूर्वक विकसित करने के लिए। धन्यवाद! बहुत स्पष्ट विवरण और कामकाज के लिए –

    +0

    +1। रिकॉर्ड के लिए, हालांकि, यदि आप किसी सेवा में कई बच्चे प्रक्रियाएं बना रहे हैं, तो आप इसे गलत कर रहे हैं। :-) [अनुमोदित, यदि आप यूनिक्स से कोड पोर्ट कर रहे हैं तो यह फिर से आर्किटेक्ट करने के प्रयास के लायक नहीं हो सकता है।] –

    1

    हमारे पास कई रिमोट डेस्कटॉप सर्वर थे जिन्हें हमें परीक्षण करने के लिए आवश्यक था, इसलिए हमने अपने आरडी सर्वर के लिए एडी पूछने के लिए एक पावरहेल स्क्रिप्ट लिखी और फिर इस रजिस्ट्री परिवर्तन को लागू किया। आनंद लें

    $newValue = "%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,20480,2048 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=sxssrv,4 ProfileControl=Off MaxRequestThreads=16" 
    $origValue = "%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,20480,768 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=sxssrv,4 ProfileControl=Off MaxRequestThreads=16" 
    
    if ($update) { 
        Clear-Variable update 
    } 
    
    $updateConfirm= [System.Windows.Forms.MessageBox]::Show("Update Desktop Heap Limitation to 2048?" , "Status" , 4) 
    if ($updateConfirm -eq "YES") { 
        $update = $true 
    } else { 
        $revertConfirm= [System.Windows.Forms.MessageBox]::Show("Revert Desktop Heap Limitation to 768?" , "Status" , 4) 
        if ($revertConfirm -eq "YES") { 
         $update = $false 
        } 
    } 
    
    if (($updateConfirm -ne "YES") -and ($revertConfirm -ne "YES")) { 
        Write-Host "User did not specify whether to update or revert Desktop Heap Limitation. Exiting Setup." 
        Read-Host "Press Enter to exit." 
        break 
    } 
    
    #Import Active Directory PowerShell module 
    if (Test-Path C:\Users\${env:USERNAME}\Documents\WindowsPowerShell\Modules\ActiveDirectory\ActiveDirectory.psm1) { 
        Import-Module ActiveDirectory -prefix AD 
    } else { 
        $s = New-PSSession -computerName DC01WDC01 
        Invoke-command { import-module ActiveDirectory } -session $s 
        Export-PSSession -session $s -commandname *-AD* -outputmodule ActiveDirectory -allowclobber 
        Import-Module ActiveDirectory -prefix AD 
        Remove-PSSession -session $s 
    } 
    
    $servers = Get-ADADComputer -Filter {(Name -Like "RDS*")} | Select -Expand Name 
    
    foreach ($server in $servers) { 
        Write-Host "Working on $server" -ForegroundColor Magenta 
        if(!(Test-Connection -ComputerName $server -Count 1 -quiet)) { 
         Write-Warning "$server : Offline" 
         Continue 
        } 
    
        if ($update -eq $true) { 
         Invoke-Command -ComputerName $server -ArgumentList $newValue -ScriptBlock { 
          Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems" -Name "Windows" -Value $args[0] 
          $result = Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems" | SELECT Windows 
          if ($result.Windows -like "*SharedSection=1024,20480,2048*") { 
           Write-Host "Successfully reverted Desktop Heap Limit to 2048" -ForegroundColor Green 
          } else { 
           Write-Warning "Update to registry value unsuccessful on $env:ComputerName" 
          }    
         } 
        } elseif ($update -eq $false) { 
         Invoke-Command -ComputerName $server -ArgumentList $origValue -ScriptBlock { 
          Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems" -Name "Windows" -Value $args[0] 
          $result = Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems" | SELECT Windows  
          if ($result.Windows -like "*SharedSection=1024,20480,768*") { 
           Write-Host "Successfully reverted Desktop Heap Limit to 768" -ForegroundColor Green 
          } else { 
           Write-Warning "Update to registry value unsuccessful on $env:ComputerName" 
          }  
         } 
        } 
    } 
    
    +0

    दुर्भाग्य से सेटिंग हमारी स्थिति में हमारे लिए काम नहीं करती है, लेकिन हो सकता है कि लिपि किसी अन्य समूह की जांच करने के लिए मशीनों के बड़े समूह के साथ मदद करे। :) – Shaun

    +0

    मेरे लिए काम किया, लेकिन इसे प्रभावी होने के लिए बदलाव करने के बाद रीबूट करना पड़ा। – user3725395

    संबंधित मुद्दे

     संबंधित मुद्दे