我一直在对此问题进行大量研究,但不幸的是我找不到解决方案。我的问题是,即使在使用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);
}
如果是视频流服务,则可能必须调整睡眠间隔。