Приложение, потребляющее почти 100% ЦП в системе - PullRequest
1 голос
/ 02 апреля 2012

Мое приложение использует некоторые веб-сервисы и подключается к серверу и находится в системном трее. Приложение только читает из приложения третьей части (локального), которое используется для подключения к серверу. Если он читает какую-либо неподходящую строку, то запускает / обрабатывает соответствующие события. Это все. Был протестирован на наших нормальных рабочих системах, и он работает нормально. На моей системе Quad 2,66 ГГц и 3 ГБ оперативной памяти приложение потребляет 25 ЦП.

Недавно проверено на системе PIV 3,0 ГГц, содержащей 2 ГБ ОЗУ, приложение потребляет 98 ЦП.

Что это может быть? На лучшем процессоре приложение потребляет почти в 4 раза больше ресурсов процессора, чем мое. Почему так ? Какие могут быть причины для того же. Любые идеи, чтобы справиться с тем же.

После подключения этот код активен. Cmd запускается для использования стороннего приложения, и я использую этот код для чтения вывода того же самого:

    private void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        string d = e.Data;

        if (!string.IsNullOrEmpty(d))
        {
            if (sb != null)
                sb.Append(d + "\n");
            //Console.WriteLine("LINE = " + d);
            ERROR_CODE = -1;
            if (d.IndexOf("Initialization Sequence Completed") >= 0)
            {
                connected = true;
                Console.WriteLine("********* Connected = " + connected);
                return;
            } else if (isInValidLine(d))
            {
                if (d.IndexOf("Exiting") >= 0 || d.IndexOf("The requested name is valid but does not have an IP address.") >= 0)
                {
                    if (caughtExp == false)
                    {
                        connected = false;
                        caughtExp = true;
                        errorMsg = d;
                        ERROR_CODE = ERROR_EXIT;
                        OnOpenVpnDisConnectionEvent();
                    }
                }
                else if (d.IndexOf("errno=", StringComparison.OrdinalIgnoreCase) > 0
                    || d.IndexOf("error:2006D080", StringComparison.OrdinalIgnoreCase) >= 0
                    || d.IndexOf("code=995", StringComparison.OrdinalIgnoreCase) >= 0
                    || d.IndexOf("There are no TAP-Win32 adapters on this system", StringComparison.OrdinalIgnoreCase) >= 0
                    || d.IndexOf("Error opening configuration file", StringComparison.OrdinalIgnoreCase) >= 0
                    || (d.IndexOf("CreateIpForwardEntry: Access is denied.", StringComparison.OrdinalIgnoreCase) >= 0 
                                        && d.IndexOf("[status=5 if_index=", StringComparison.OrdinalIgnoreCase) >= 0)
                    || d.IndexOf("CreateFile failed on TAP device") >= 0  )
                {
                    // Want to handle all and go for ReConnect, atmost possible
                    caughtExp = true;
                    connected = false;
                    errorMsg = d;
                    ERROR_CODE = ERROR_FATAL;
                    OnOpenVpnDisConnectionEvent();
                }

                return;
            }
        }
        return;
    }

    private bool isInValidLine(string line)
    {
        if (line.IndexOf("errno=", StringComparison.OrdinalIgnoreCase) >= 0 
            || line.IndexOf("error:2006D080", StringComparison.OrdinalIgnoreCase) >= 0
            || line.IndexOf("code=995", StringComparison.OrdinalIgnoreCase) >= 0
            || line.IndexOf("There are no TAP-Win32 adapters on this system", StringComparison.OrdinalIgnoreCase) >= 0
            || line.IndexOf("Error opening configuration file", StringComparison.OrdinalIgnoreCase) >= 0
            || line.IndexOf("Exiting") >= 0
            || line.IndexOf("The requested name is valid but does not have an IP address.") >= 0
            || line.IndexOf("CreateFile failed on TAP device") >= 0    // && (line.IndexOf("General failure (ERROR_GEN_FAILURE) (errno=31)") >= 0) ) 
            )
        {
            return true;
        }

        return false;
    }

Почему в этой системе так много ЦП?

Любая помощь высоко ценится.

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

По некоторым оценкам, 25% - это одно полное ядро, а P4 (кстати, гораздо хуже - МГц - ужасный способ сравнения процессоров) - однопоточный, поэтому он полностью занят.

В вашем коде занят цикл (я подозреваю), поэтому один поток выполнения все время занят процессором.

В многоядерной системе другие процессы перейдут на другие ядра, если онидоступны.

Использование ЦП будет продолжаться, пока у вас есть этот замкнутый цикл, даже если он перебирает пустую коллекцию соединений.Либо усыпьте его, либо вызывайте функцию реже, либо выполняйте работу должным образом, и сделайте выбор или опрос, чтобы ОС разбудила вас, когда у вас есть данные

2 голосов
/ 03 апреля 2012

Он потребляет все доступные ЦП в потоке выполнения: почти 100% для одного ядра, 25% для 4-ядерного ЦП (100% ядра, где он выполняется).

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

Если это его поведение, то оно будет использовать все доступное процессорное время.Если вы не хотите использовать все процессорное время (поскольку оно замедляет работу вашей системы или потребляет слишком много батареи), вы можете уменьшить приоритет процесса.Вы не можете установить приоритет объекта System.Windows.Forms.Timer (он имеет приоритет процесса).Вопрос в том, нужно ли вам так часто вызывать эту функцию?При сворачивании вы не можете отключить его?Во всяком случае, я думаю: приложение потребляет 100% одного ядра только для макияжа ... Я понимаю, что это раздражает, чтобы изменить то, что работает, но ...

...