2

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);

このコードは、高トラフィック (たとえば、1 秒あたり 10MB のメッセージ) で使用される場合、CPU 使用率の 90% を占めています。いくつかの調査の後、次の2つのコードを試しました。まず、最初のフレーム (「一括送信」) を削除しました。

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);

驚いたことに、パフォーマンスが向上しました。次に、2 つのフレームを並べ替えます。大きなフレームを最初に移動することを意味します。次のように:

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 を使用するのはどうですか? それに関する適切な文書はありますか?

4

2 に答える 2

1

私が見つけたように、マルチパート メッセージの送信に問題があります。このリンクhttp://hintjens.com/blog:84を見ることができます。そしておそらくあなたのメッセージを 1 つのメッセージにエンコードしてから送信してください!

于 2016-07-20T07:09:18.710 に答える