我正在尝试通过启动执行工作的控制台应用程序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();
}
}
我一直在寻找是否有最大的实例要启动,但它总是说它与操作系统支持的数量一样多。
我还检查了每个会话或每个用户是否有最大实例,但找不到任何描述类似内容的内容,或者我确实错过了。
答案 0 :(得分:6)
引用Raymond Chen的博客:"If you have to ask about various operating system limits, you're probably doing something wrong"。
即使有很多流程,计算机实际可以完成多少工作也是有限的。通过确定系统中的处理器数量并选择要执行的许多并发任务,您将获得更好的服务。然后,您的“program1”可以启动该进程并使用StartInfo来监视进程何时结束(同时通过重定向输出和错误流并根据需要记录它们来捕获任何错误输出。一旦进程完成,那么您应该启动队列中的下一个。
当你启动那么多进程时,系统会试图在100个进程之间切换上下文,并且不会做任何事情。
您可能会遇到内存限制,具体取决于您的子进程分配的内存量。你将有一堆进程启动并占用大块内存,但在处理器出现之前无所事事。如果它无法分配内存,它可能会阻塞并终止进程(取决于如何完成错误处理)。
答案 1 :(得分:1)
这很奇怪,因为默认情况下没有硬限制。但当然,这取决于启动的进程正在做什么(内存消耗,句柄分配,文件等)。例如,我在我的机器上使用“notepad.exe”进行了测试,如果我指定150个实例,我会运行150个notepad.exe。
您可以在此处查看有关流程限制的非常有趣的讨论:Pushing the Limits of Windows: Processes and Threads。
答案 2 :(得分:0)
首先,我绝对同意@Garo Yeriazarian。但要彻底,我建议查看这篇博文: http://xentelworker.blogspot.com/2005/10/i-open-100-explorer-windows-and-my.html