Как я могу получить размер частного рабочего набора двух процессов с одинаковым именем? - PullRequest
0 голосов
/ 09 января 2020

Наше приложение утечки памяти. Мы можем наблюдать за размером памяти go в Диспетчере задач, и в итоге он вызывает исключение OutOfMemory. Поскольку он все еще находится в бета-версии, и для достижения этой цели требуется несколько недель, он пока еще не продемонстрирован, но мы не можем официально выпустить его, пока не решим эту проблему.

Одна часть программы запускает расчет с заданным интервалом. Мы хотим посмотреть, протекает ли эта часть. Если мы изменим интервал, наклон графика потребления памяти в зависимости от времени должен измениться пропорционально.

Итак, я написал небольшую программу, которая должна была прочитать размер частного рабочего набора всех процессов, которые имеют имя нашего приложения. Важный раздел этой программы ниже. Проблема, с которой я сталкиваюсь, заключается в том, что нет прямого способа получить размер частного рабочего набора. Вместо этого мне нужно получить счетчик производительности, и нет способа получить этот счетчик по идентификатору процесса. Вы можете получить его только по имени. Поскольку у меня есть два процесса с одним и тем же именем, я всегда получаю размер рабочего набора для первого процесса и никогда для второго. Есть ли способ получить счетчик производительности, используя идентификатор процесса вместо имени процесса? Есть ли лучший показатель памяти, который по-прежнему будет указывать на то, есть ли у меня утечка памяти, даже если число не совпадает с тем, которое я вижу в диспетчере задач?

Для будущих тестов я мог бы просто изменить имя одного исполняемого файла перед началом теста, но я бы предпочел не делать этого, и я бы не стал перезапускать текущий тест.

            List<int> processIDs = new List<int>();
            foreach (Process namedProcess in namedProcesses)
            {
                processIDs.Add(namedProcess.Id);
            }

            List<Process> simShopProcesses = new List<Process>();

            // foreach (Process namedProcess in simShopProcesses)
            foreach (int processID in processIDs)
            {
                Process simShopProcess = Process.GetProcessById(processID);
                PerformanceCounter pc = new PerformanceCounter(("Process", "Working Set - Private", simShopProcess.ProcessName);
                double pws = pc.RawValue / 1024.0;

                //private void timer1_Tick(object sender, EventArgs e)
                //{
                //    System.Diagnostics.Process[] simShopProcesses = System.Diagnostics.Process.GetProcessesByName("SimShopService");
                //    if (simShopProcesses.Count() > 0)
                //    {
                //        textBox1.Text = simShopProcesses[0].NonpagedSystemMemorySize64.ToString();
                //        textBox1.Refresh();
                //    }            
                //}
                double npsm = simShopProcess.NonpagedSystemMemorySize64;
                memorySet.Process_id = simShopProcess.Id;
                memorySet.Reading_time = DateTime.Now;
                memorySet.Private_working_set = pws;
                memorySet.Nonpaged_system_memory = npsm;
                memorySet.Thread_count = simShopProcess.Threads.Count;

                WriteMessage(string.Format("Process ID: {3}: Private working set: {0} Kb; nonpaged system memory: {1} Kb; thread count: {2}", 
                                            pws, npsm, simShopProcess.Threads.Count, simShopProcess.Id));
                memorySet.Insert();
                memorySet.Close();

                if (pws > m_memoryLimit && m_memoryLimit > 0)
                {
                    WriteMessage(string.Format("Memory usage exceeds limit of {0}; killing process.", m_memoryLimit));
                    KillService(simShopProcesses[0]);
                }

                pc.Close();
            }
...