NetMQ Multipart Message发送大对象的性能问题
Performance Issue of Sending Large Object using NetMQ Multipart Message
我在 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%。
经过一些研究,我尝试了以下两个代码。首先,我删除了第一帧("Bulk Send"):
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/low 性能可能是因为 GC 和内存分配。我尝试使用我的框架发送相同大小的消息,该框架使用 NetMQ,服务器和客户端在同一台机器上工作。如果客户端在向服务器发送另一条消息之前等待响应,我达到了 60K msg/sec。然而,如果客户端并行发送数百条消息,CPU 也很高,吞吐量为每秒数十条消息。在某个时间点,我什至遇到了 OutOfMemoryException。
如果你 post 完整代码就好了。
UPD:对不起,我测错了。并行发送 100 条消息或仅发送一条消息时,性能仅为 120 msg/sec
据我所知,发送多部分消息时出现问题。你可以看到这个linkhttp://hintjens.com/blog:84。
并可能将您的消息编码为一条消息,然后发送!
我在 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%。 经过一些研究,我尝试了以下两个代码。首先,我删除了第一帧("Bulk Send"):
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/low 性能可能是因为 GC 和内存分配。我尝试使用我的框架发送相同大小的消息,该框架使用 NetMQ,服务器和客户端在同一台机器上工作。如果客户端在向服务器发送另一条消息之前等待响应,我达到了 60K msg/sec。然而,如果客户端并行发送数百条消息,CPU 也很高,吞吐量为每秒数十条消息。在某个时间点,我什至遇到了 OutOfMemoryException。 如果你 post 完整代码就好了。
UPD:对不起,我测错了。并行发送 100 条消息或仅发送一条消息时,性能仅为 120 msg/sec
据我所知,发送多部分消息时出现问题。你可以看到这个linkhttp://hintjens.com/blog:84。 并可能将您的消息编码为一条消息,然后发送!