Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用NetMQ多部分消息发送大型对象的性能问题_C#_Performance_Zeromq_Netmq - Fatal编程技术网

C# 使用NetMQ多部分消息发送大型对象的性能问题

C# 使用NetMQ多部分消息发送大型对象的性能问题,c#,performance,zeromq,netmq,C#,Performance,Zeromq,Netmq,我使用C#(NetMQ)中的以下代码发送大型对象: var-client=new-DealerSocket(“”); var serializedData=新字符串('*',500000); var message=新列表(); Add(Encoding.UTF8.GetBytes(“BulkSend”); Add(Encoding.UTF8.GetBytes(serializedData)); client.TrySendMultipartBytes(TimeSpan.frommissions

我使用C#(NetMQ)中的以下代码发送大型对象:

var-client=new-DealerSocket(“”);
var serializedData=新字符串('*',500000);
var message=新列表();
Add(Encoding.UTF8.GetBytes(“BulkSend”);
Add(Encoding.UTF8.GetBytes(serializedData));
client.TrySendMultipartBytes(TimeSpan.frommissions(3000),消息);
如果在高流量(例如每秒10MB消息)中使用,则此代码将占用90%的CPU使用率。 经过一些研究,我尝试了以下两种代码。首先,我删除了第一帧(“批量发送”):

var-client=new-DealerSocket(“”);
var serializedData=新字符串('*',500000);
var message=新列表();
Add(Encoding.UTF8.GetBytes(serializedData));
client.TrySendMultipartBytes(TimeSpan.frommissions(3000),消息);
令人惊讶的是,性能有所提高。第二,我重新安排了两帧。我的意思是将大帧移到第一帧。例如:

var client = new DealerSocket("<connection String>");
var serializedData = new string('*', 500000);
var message = new List<byte[]>();
// change the order of two following codes
message.Add(Encoding.UTF8.GetBytes(serializedData));
message.Add(Encoding.UTF8.GetBytes("BulkSend"));

client.TrySendMultipartBytes(TimeSpan.FromMilliseconds(3000), message);
var-client=new-DealerSocket(“”);
var serializedData=新字符串('*',500000);
var message=新列表();
//更改以下两个代码的顺序
Add(Encoding.UTF8.GetBytes(serializedData));
Add(Encoding.UTF8.GetBytes(“BulkSend”);
client.TrySendMultipartBytes(TimeSpan.frommissions(3000),消息);
同样令人惊讶的是,性能得到了提高


有什么问题吗?如何提高性能?在netmq上使用zproto怎么样?关于这一点是否有合适的文档?

高CPU/低性能可能是由于GC和内存分配。我尝试使用使用NetMQ的框架发送相同大小的消息,服务器和客户端在同一台机器上工作。如果客户端在向服务器发送另一条消息之前等待响应,则我达到60K msg/秒。然而,如果客户端并行发送数百条消息,那么CPU同样高,吞吐量为每秒数十条消息。在某个时间点,我甚至出现了OutOfMemoryException。 如果你发布完整的代码就好了


UPD:对不起,我量错了。如果并行发送100条消息或仅发送一条消息,则性能仅为120msg/sec

正如我发现的,发送多部分消息存在问题。你可以看到这个链接。
并且可能把你的信息编码成一条信息然后发送出去

您如何衡量这一绩效改进?CPU的视觉观察?发送邮件所需的总时间?还有什么吗?在你画这些之前一定要重置所有东西conclusions@EricJ.:通过CPU的视觉观察(在服务器任务管理器中)。@JeroenHeier:不幸的是,我没有得到这个。“重置一切”是什么意思?具体应该重置什么?@EricJ.:P.S.事实上,我们将一部分真实流量路由到客户端,这是一个真实的测试。显然这与GC无关,因为一个大对象消息以三种相同的方式发送,只是它们的顺序帧不同。完整的代码在这里!除了创建假消息而不是真实的序列化消息(实际上大小相同)。此外,我们的测试对于示例也有相同的结果。所以,没有更多的东西可以释放了。
var client = new DealerSocket("<connection String>");
var serializedData = new string('*', 500000);
var message = new List<byte[]>();
message.Add(Encoding.UTF8.GetBytes(serializedData));
client.TrySendMultipartBytes(TimeSpan.FromMilliseconds(3000), message);
var client = new DealerSocket("<connection String>");
var serializedData = new string('*', 500000);
var message = new List<byte[]>();
// change the order of two following codes
message.Add(Encoding.UTF8.GetBytes(serializedData));
message.Add(Encoding.UTF8.GetBytes("BulkSend"));

client.TrySendMultipartBytes(TimeSpan.FromMilliseconds(3000), message);