Есть идеи, почему эта простая программа (создающая сеанс PowerShell) занимает так много памяти (~ 150 МБ)? - PullRequest
5 голосов
/ 10 ноября 2011

Я довольно новичок в программировании PowerShell.Я создаю удаленные сеансы для выполнения некоторых команд программно.Однако он потребляет так много памяти (порядка ~ 150 до 200 МБ).И больше сеансов, больше памяти.

Не могли бы вы помочь мне разобраться в проблеме?

  1. В чем виновник?
  2. Как я могу это исправить?

Наблюдения: 1. После выполнения команды CreateRunSpace она занимает около 3 МБ.


Кто-то сталкивался с той же проблемой при создании пространств выполнения:

http://social.technet.microsoft.com/Forums/en-US/winserverpowershell/thread/69ccce9d-4696-4886-a5d0-5d2d2e1e4e6d

"Возможная утечка дескриптора пространства выполнения PowerShell"

Все еще исследует, чтобы найтиответ хотя ...

Удаление pssession сделало пространство для освобождения дескрипторов и устранило утечку памяти.Теперь он переключается с ~ 30 до 40 МБ.


Спасибо!

(FYI - ссылка на System.Management.Automation.dll)

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management.Automation.Runspaces;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            int success = 0;
            int fails = 0;
            for (int i = 0; i < 50; i++)
            {
                Runspace rs = RunspaceFactory.CreateRunspace();
                //After this the memory will be incremented by ~3Mb in taskmanager
                rs.Open();
                using (Pipeline pl = rs.CreatePipeline())
                {
                    Command cmd = new Command("new-pssession");
                    pl.Commands.Add(cmd);
                    var retval = pl.Invoke();
                    if (retval.Count > 0)
                    {
                        success++;
                    }
                    else
                    {
                        fails++;
                    }
                    pl.Stop();
                }
                rs.Close();
                rs = null;
            }
            GC.Collect();

        }

    }
}

Ответы [ 2 ]

3 голосов
/ 11 ноября 2011

Похоже, что удаление-pssession из пространства выполнения освободило дескрипторы памяти и устранило утечку.Теперь он занимает ~ 35 МБ.

int success = 0;
int fails = 0;
for (int i = 0; i < 50; i++)
{
    Runspace rs = RunspaceFactory.CreateRunspace();
    rs.Open();
    using (Pipeline pl = rs.CreatePipeline())
    {
        Command cmd = new Command("new-pssession");
        pl.Commands.Add(cmd);
        var retval = pl.Invoke();
        if (retval.Count > 0)
        {
            success++;
            PSSession Session = (PSSession)retval[0].BaseObject;
            using (Pipeline pl2 = rs.CreatePipeline())
            {
                Command cmd2 = new Command("remove-pssession");
                cmd2.Parameters.Add("Id", Session.Id);
                pl2.Commands.Add(cmd2);
                var retval2 = pl2.Invoke();
                pl2.Stop();
            }
        }
        else
        {
            fails++;
        }
        pl.Stop();
    }
    rs.Close();
    rs = null;
}
0 голосов
/ 10 ноября 2011

Runspace объект одноразовый, это то же самое, если вы код:

using (Runspace rs = RunspaceFactory.CreateRunspace())
{
}
...