【问题标题】:Performance Issue of Sending Large Object using NetMQ Multipart Message使用 NetMQ 多部分消息发送大对象的性能问题
【发布时间】:2016-07-20 15:09:18
【问题描述】:

我在 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 消息)中使用此代码,它将占用 90% 的 CPU 使用率。 经过一番研究,我尝试了以下两个代码。首先,我删除了第一帧(“批量发送”):

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 怎么样?是否有任何适当的文件?

【问题讨论】:

  • 您如何衡量这种性能改进? CPU的视觉观察?发送消息所需的总时间?还有什么?
  • 在得出这些结论之前,请务必重置所有内容
  • @EricJ.:通过 CPU 的视觉观察(在服务器任务管理器中)。
  • @JeroenHeier:不幸的是我没有得到这个。你是什​​么意思“重置一切”?究竟应该重置什么?
  • @EricJ.: P.S.事实上,我们将部分真实流量路由到客户端,这是一个真正的测试。

标签: c# performance zeromq netmq


【解决方案1】:

我发现,发送多部分消息存在问题。你可以看到这个链接http://hintjens.com/blog:84。 并且可能将您的消息编码为一条消息然后发送!

【讨论】:

    【解决方案2】:

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

    UPD:抱歉,我测错了。并行发送 100 条消息或仅发送一条消息时,性能仅为 120 msg/sec

    【讨论】:

    • 绝对不是 GC,因为一个大对象消息以三种相同的方式发送,除了它们有不同的顺序框架。
    • 完整代码在这里!除了创建了假消息而不是真正的序列化消息(实际上大小相同)。此外,我们的测试对于示例也有相同的结果。因此,没有更多要发布的内容了。
    猜你喜欢
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2013-06-06
    相关资源
    最近更新 更多