【问题标题】:How can I get 100% CPU saturation with simple WCF app?如何使用简单的 WCF 应用程序获得 100% 的 CPU 饱和度?
【发布时间】:2026-01-26 03:15:01
【问题描述】:

我正在尝试编写简单的客户端-服务器应用程序,该应用程序可以使用 WCF 使用 100% 的 CPU。

程序正在发送 10000 次请求并正在接收字符串,如下例所示。我发送 f9b6af85-8826-49c8-9524-39511f1a241a 并接收“Hello f9b6af85-8826-49c8-9524-39511f1a241a”10000 次,我测量时间。我尝试将客户端数量从 2 个增加到 4 个,但 CPU 使用率为 30%。服务非常简单,它自托管在控制台应用程序中。客户端是 Web 表单应用程序。我需要建议:我应该怎么做才能获得 100% 的 CPU 使用率?我应该发送更多请求、增加客户数量、发送更大的消息还是做我缺少的其他事情?

服务:

public class HelloService : IHelloService
{
    public string Hello(string name)
    {
        return "Hello " + name;
    }
}

主持人:

class Program
{
    static void Main()
    {
        using (ServiceHost host = new ServiceHost(typeof(HelloWcf.HelloService)))
        {
            host.Open();
            Console.WriteLine("Host started @ " + DateTime.Now.ToString());
            Console.ReadLine();
        }
    }
}

客户:

private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;
            label1.Text = Guid.NewGuid().ToString();
            var start = DateTime.Now.TimeOfDay;
            HelloServiceReference.HelloServiceClient client;

            for (int i = 0; i < 10000; i++)
            {
                label2.Text = string.Empty;

                client = new HelloServiceReference.HelloServiceClient("NetTcpBinding_IHelloService");

                label2.Text = client.Hello(label1.Text);
                client.Close();
            }

            var end = DateTime.Now.TimeOfDay;

            var totalTime = end - start;

            label3.Text = string.Format("Total time of execution {0}", totalTime.ToString(@"mm\:ss\.ffff"));

            button1.Enabled = true;
        }

【问题讨论】:

  • 很可能您的 CPU 没有固定,因为 I/O 是瓶颈。为了使 I/O 成为瓶颈,您必须在处理请求时执行更多 CPU 密集型操作。
  • 做更多迭代?一次运行多个实例?
  • “我应该怎么做才能获得 100% 的 CPU 使用率” - 为什么?开发人员的目标是减少 CPU 使用率。
  • 此应用程序用于验证目的。我尝试了更多迭代 100000,但 CPU 使用率几乎没有增加。 @adv12 我可以为 exp 做什么?做一些数学运算?我还关闭了 TCP 卸载。
  • 如果它用于验证,我认为那么 30% 可能是你所能得到的。如果你坚持 100% 那么它更像是 CPU 基准测试工具。

标签: c# wcf testing


【解决方案1】:

尝试将一些线程排队,如下所示:

for (int cont = 0; cont < 100; i++)
{
    ThreadPool.QueueUserWorkItem(new WaitCallback((a) =>
    {
        while (true) 
        { 
        }
    }));
}

把它放在你的请求上,它会增加你的内存使用量。

【讨论】:

  • 你的意思是在我的客户端循环中,还是在我发送响应之前在服务中?
  • 如果你想强调你的服务器的内存,你可以在发送响应之前放入你的 wcf 方法
  • 好的,当我发送请求时,我现在有 100% 的 CPU 使用率,但是当我发送请求时,这在做什么?公共字符串 Hello(字符串名称) { for (int cont = 0; cont { while (true) { } })); } 返回“你好”+名字; }
  • 还有一个问题,当响应是发送时CPU保持在100%。
  • ThreadPool.QueueUserWorkItem 将任务放入要执行的队列中并等待它完成,但是使用 while(true) 行,它永远不会完成,所以可以根据需要提高 cpu 使用率。
【解决方案2】:

看一下我曾经回答过WCF performance, latency and scalability 的示例程序。包含完整的命令行代码。

线程代码使用较旧的模式,因为它来自 2011 年。但是它仍然可以完全消耗任何 CPU。

【讨论】:

    最近更新 更多