Несколько экземпляров

#c# #process #multiprocessing

#c# #процесс #многопроцессорность

Вопрос:

Я пытаюсь выполнить параллельную обработку, запустив консольное приложение 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();
    }
}
  

Я искал, есть ли максимальное количество экземпляров для запуска, но всегда говорится, что их столько, сколько поддерживает ОС.

Я также проверил, есть ли максимальное количество экземпляров на сеанс или на пользователя, но не смог найти ничего, что описывало бы что-то подобное, или я пропустил это.

Ответ №1:

Цитирую блог Рэймонда Чена: «Если вам приходится спрашивать о различных ограничениях операционной системы, вы, вероятно, делаете что-то неправильно».

Существует предел тому, какой объем работы на самом деле может выполнить компьютер даже при таком количестве процессов. Вам будет удобнее определять количество процессоров в системе и выбирать такое количество одновременных задач для выполнения. Затем ваша «program1» могла бы запустить процесс и использовать StartInfo для отслеживания завершения процесса (и одновременно фиксировать любые выходные данные с ошибками, перенаправляя выходные данные и потоки ошибок и регистрируя их по мере необходимости. Как только процесс завершается, вы должны запустить следующий в очереди.

Когда вы запускаете такое количество процессов, система будет барахтаться, пытаясь переключить контекст между 100 процессами, и почти ничего не добьется.

Вы можете столкнуться с ограничениями памяти в зависимости от того, сколько памяти выделяют ваши дочерние процессы. У вас будет множество процессов, запускающихся и занимающих куски памяти, но ничего не делающих, пока не подойдет их очередь на процессоре. Если он не может выделить память, он, вероятно, остановит процесс (в зависимости от того, как выполняется обработка ошибок).

Комментарии:

1. ОК. Это звучит логично, но система вообще не работает, потому что запущенные экземпляры работают, а память и центральный процессор ПК не загружены на 5%. И я обнаружил кое-что странное. На самом деле program1 — это сервис, а program2 — консоль. что ж, если я конвертирую program1 в консоль, она достигнет объема, который я указал ранее, но не службы.

2. Чтобы быть более конкретным, Program1 — это служба WCF, а Program2 — консоль, все они написаны на VS2010, framework 4

Ответ №2:

Это странно, поскольку по умолчанию жесткого ограничения нет. Но, конечно, это зависит от того, что делает запущенный процесс (потребление памяти, распределение дескрипторов, файлов и т.д.). Например, я протестировал это с «notepad.exe «на моей машине, и я получаю 150 notepad.exe выполняется, если я укажу 150 экземпляров.

Здесь вы можете ознакомиться с очень интересным обсуждением ограничений процесса: расширение границ Windows: процессы и потоки.

Ответ №3:

Во-первых, я определенно согласен с @Garo Ериазаряном. Но чтобы быть доскональным, я бы рекомендовал ознакомиться с этим сообщением в блоге: http://xentelworker.blogspot.com/2005/10/i-open-100-explorer-windows-and-my.html

Комментарии:

1. Проблема решается путем увеличения размера кучи неинтерактивной рабочей станции. для моей конфигурации: %SystemRoot%system32csrss.exe ObjectDirectory= Windows SharedSection =1024,20480,768 Windows=On SubSystemType= Windows ServerDll=basesrv, 1 ServerDll=winsrv: инициализация пользовательского сервера,3 ServerDll=winsrv: инициализация пользовательского сервера, 2 ServerDll=sxssrv, 4 ProfileControl=Off MaxRequestThreads = 16 я просто увеличиваю значение 768 до 10000. мне не нужно беспокоиться о рабочем столе пользователя и тому подобных вещах, потому что есть только один пользователь.