使用WCF流媒体高的CPU负载



我一直在对此问题进行大量研究,但不幸的是我找不到解决方案。我的问题是,即使在使用WCF(NetTCBinding,流式传输)时,即使在功能强大的机器上,我也经历了相当高的CPU负载 - 更具体地说,我的i5 860在处理20个客户端线程时的负载为20-40%。在部署真实服务(而不是测试项目)时,大约有50个真实的客户每秒发送小型数据包(每个传输约为20KB),CPU负载已经为80-90%。最后,应该有200多个客户

为了测试目的,我已经基于WCF流传输的NetTCPBinding设置了一个小型项目。其中已经有很多"绝望代码",因为我试图使它起作用...对于我的测试,我使用了20次发送到WCF服务的200MB文件。

这是合同:

[ServiceContract(Namespace = "WCFStreamTest.WCFService")]
public interface IStreamContract
{
    [OperationContract(Name = "ReceiveStream")]
    StreamMessage ReceiveStream(StreamMessage msg);
    [OperationContract(Name = "SendStream")]
    StreamMessage SendStream(StreamMessage msg);
}

此处使用的流媒体类只是一个包含字符串标题和流对象的MessageCeceCntract。

服务器代码如下:

[ServiceBehavior(IncludeExceptionDetailInFaults = false, InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = true, MaxItemsInObjectGraph = int.MaxValue)]
public class StreamService : IStreamContract
{
    public StreamMessage ReceiveStream(StreamMessage msg)
    {
        if (File.Exists(msg.Parameters))
            return new StreamMessage() { Parameters = msg.Parameters, DataStream = new System.IO.FileStream(msg.Parameters, System.IO.FileMode.Open, System.IO.FileAccess.Read) };
        return new StreamMessage();
    }
    public StreamMessage SendStream(StreamMessage msg)
    {
        if (msg.Parameters.Trim().Length > 0)
        {
            int bufferSize = 8096 * 4;
            byte[] buffer = new byte[bufferSize];
            int bytes = 0;
            while ((bytes = msg.DataStream.Read(buffer, 0, bufferSize)) > 0)
            {
                byte b = buffer[0];
                b = (byte)(b + 1);
            }
        }
        return new StreamMessage();
    }
}

测试项目只是使用SendStream方法进行测试 - 该方法只是读取数据流,而无能为力。

在这一点上,我想我会节省您的时间阅读,不要在此处发布完整的代码。也许指向演示项目的下载链接就足够了?(为了使其正常工作,客户端的程序中有一行。

WCFStreamTest项目

我对如何降低CPU使用的任何想法感到非常高兴...预先感谢您的任何帮助和提示...

您可以尝试在循环时让线程入睡,然后看看它的发展。

while ((bytes = msg.DataStream.Read(buffer, 0, bufferSize)) > 0)
{
    byte b = buffer[0];
    b = (byte)(b + 1);
    Thread.Sleep(100);
}

如果是视频流服务,则可能必须调整睡眠间隔。

相关内容

  • 没有找到相关文章