应用程序在A SYSTEM上消耗几乎100%的CPU

时间:2012-04-02 09:28:52

标签: c# cpu process cpu-usage

我的应用程序使用一些webservice并连接到服务器并位于系统托盘上。应用程序只读取用于连接服务器的第3部分应用程序(本地)。如果它读取任何不适当的行,则触发/处理适当的事件。塔尔是的。在我们的正常工作系统上进行了测试,它运行良好。在我的系统Quad 2.66GHz和3GB的RAM上,该应用程序消耗了25个CPU。

最近在包含2GB RAM系统的PIV 3.0Ghz系统上进行了检查,该应用程序占用了98个CPU。

这可能是什么?在更好的处理器上,该应用程序消耗的CPU几乎是我的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;
    }

为什么在该系统上需要这么多CPU?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

据猜测,25%是一个完整的核心,P4(更糟糕的是 - 更糟糕的是比较处理器的方式)是单线程的,所以它完全忙。

你的代码中有一个繁忙的循环(我怀疑),所以保持一个执行线程CPU一直处于忙碌状态。

在多核系统上,如果其他进程可用,其他进程将继续运行。

即使它在一个空的连接集上进行迭代,当你有这个紧密的循环时,CPU的使用仍将继续。要么睡一觉,要么不那么频繁地调用函数,要么正确地完成工作,然后进行选择或轮询,以便操作系统在你有数据时唤醒你

答案 1 :(得分:2)

它占用了执行线程中的所有可用CPU:单个内核几乎100%,4内核CPU占10%(执行它的内核的100%)。

正如@Douglas指出的那样,它可能是一个循环的结果,或者只是你的应用程序消耗的数据比它们的生产速度慢。

如果这是它的行为,那么它将使用所有可用的CPU时间。如果您不想使用所有CPU时间(因为它会降低系统速度或消耗太多电池),您可能会降低进程优先级。您无法设置System.Windows.Forms.Timer对象的优先级(它具有进程的优先级)。问题是你真的必须经常调用这个函数吗?最小化时你不能禁用它吗?无论如何我在想:应用程序只消耗100%的一个核心用于化妆...我明白改变一些有效的东西很烦人...