我在C#(NetMQ)中使用以下代码发送大对象:
var client = new DealerSocket("<connection String>");
var serializedData = new string('*', 500000);
var message = new List<byte[]>();
message.Add(Encoding.UTF8.GetBytes("BulkSend"));
message.Add(Encoding.UTF8.GetBytes(serializedData));
client.TrySendMultipartBytes(TimeSpan.FromMilliseconds(3000), message);
如果该代码用于高流量(例如每秒10MB消息),则该代码占CPU使用率的90%。 经过一番研究,我尝试了以下两个代码。首先,我删除了第一帧(“批量发送”):
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);
令人惊讶的是,性能得到了改善!
有什么问题?如何提高性能?在netmq上使用zproto怎么样?是否有适当的文件?
答案 0 :(得分:0)
高CPU /低性能可能是因为GC和内存分配。我尝试使用我的框架发送相同的消息大小,该框架使用NetMQ,服务器和客户端在同一台机器上工作。如果客户端在向服务器发送另一条消息之前等待响应,则达到60K msg / sec。然而,如果客户端并行发送数百条消息,那么CPU也很高,吞吐量是每秒数十条消息。在某个时间点,我甚至得到了OutOfMemoryException。 如果您发布完整的代码,那就太好了。
UPD:抱歉,我测错了。如果并行发送100条消息,或者只发送一条,则性能仅为 120 msg / sec
答案 1 :(得分:0)
正如我发现的那样,发送多部分消息时出现问题。您可以看到此链接http://hintjens.com/blog:84。 并且可能将您的消息编码为一条消息然后发送它!