2011-06-13 166 views
1

我試圖通過啓動一個控制檯應用程序program2來執行並行處理,它可以完成工作。它由program1啓動,它知道要啓動多少個實例。多個實例

在某些時候,程序無法啓動更多的實例。即使你增加instancesmount,它也只會啓動到極限。在這種情況下,只有92.如果我將限制設置爲100或200,它仍然只在服務器上啓動92。

我寫在C#程序,它在Windows Server 2008中

這裏運行是代碼:

for (int instanceCount = 0; instanceCount < InstancesAmount; instanceCount++) 
{  
    using (System.Diagnostics.Process myProcess = new System.Diagnostics.Process()) 
    { 
     if (hiddeConsoleWindow) 
     { 
      myProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
     } 

     myProcess.StartInfo.FileName = ExecutablePathProgram2; 

     System.Security.SecureString password = new System.Security.SecureString(); 
     foreach (char c in ConfigurationSettingsManager.ProcessStartPassword.ToCharArray()) 
     { 
      password.AppendChar(c); 
     } 

     myProcess.StartInfo.UserName = ConfigurationSettingsManager.ProcessStartUserName; 
     myProcess.StartInfo.Password = password; 
     myProcess.StartInfo.Domain = ConfigurationSettingsManager.ProcessStartDomain; 
     myProcess.StartInfo.UseShellExecute = false; 

     myProcess.Start(); 
    } 
} 

我一直在尋找,如果有最大情況下推出,但它總是說它和操作系統支持的一樣多。

我也檢查是否有每個會話或每個用戶的最大實例,但找不到任何描述這樣的事情,或者我確實想念它。

回答

6

引用Raymond Chen的博客:"If you have to ask about various operating system limits, you're probably doing something wrong"

即使有很多進程,計算機可以完成多少工作也是有限制的。通過確定系統中處理器的數量並選擇要執行的許多併發任務,可以更好地服務您。然後,您的「程序1」可以啓動進程並使用StartInfo來監視進程何時結束(同時通過重定向輸出和錯誤流並根據需要記錄它們來捕獲任何錯誤輸出。一旦進程完成,那麼您應該推出在隊列中的下一個。

當您啓動,許多進程,系統將顛簸嘗試100個程序之間進行切換上下文並不會得到太多的做任何事情。

您可能正在運行到內存限制取決於你的子進程分配多少內存,你會有一堆進程啓動並佔用大量的內存,但在處理器出現之前什麼也不幹,如果它不能分配內存,可能會嗆死過程(取決於如何處理錯誤)。

+0

好的。這聽起來很合邏輯,但是系統並沒有吸引人,因爲啓動的實例正在運行,而pc的內存和cpu沒有5%的使用率。我發現了一些奇怪的東西。其實program1是一個服務,program2是一個控制檯。以及如果我將program1轉換爲控制檯它達到了我以前指定的金額,但不是服務。 – dragonlord 2011-06-13 19:49:17

+0

更具體地說,Program1是一個WCF服務,而Program2是一個控制檯,全部在VS2010中編寫框架4 – dragonlord 2011-06-13 19:55:53

0

首先,我絕對同意@Garo Yeriazarian。但要徹底,我建議看看這篇博文: http://xentelworker.blogspot.com/2005/10/i-open-100-explorer-windows-and-my.html

+0

該問題通過增加非交互式工作站的堆大小來解決。 對於我的配置: %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 我只是將值768增加到10000.我不必擔心用戶桌面和這些東西因爲只有一個用戶。 – dragonlord 2011-06-13 20:55:36

1

這很奇怪,因爲默認情況下沒有硬限制。但是,當然,這取決於啓動的進程在做什麼(內存消耗,處理分配,文件等)。例如,我已經在我的機器上用「notepad.exe」對其進行了測試,如果指定了150個實例,則會運行150個notepad.exe。

您可以在這裏查看關於過程限制的非常有趣的討論:Pushing the Limits of Windows: Processes and Threads