【发布时间】: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