libzmq在inproc://模式下性能测试

测试环境:

CPU:Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz * 2
内存:64GB 1333 MHz
OS:CentOS release 6.7

Libzmq:
https://github.com/zeromq/libzmq
master分支最新代码,版本号 4.2.1

测试准备:

测试代码perf/inproc_thr.cpp
主要改动(具体改动见附录diff)pull、push分别绑定不同的core(2,3)
测试数据量message count为 200000000

结果展示

Tables No zero mem Zero mem
64 4152871 [msg/s] 2126.270 [Mb/s] 3697188 [msg/s] 1892.960 [Mb/s]
128 2525915 [msg/s] 2586.537 [Mb/s] 2317762 [msg/s] 2373.388 [Mb/s]
256 2594865 [msg/s] 5314.284 [Mb/s] 2445809 [msg/s] 5009.017 [Mb/s]
400 2325507 [msg/s] 7441.622 [Mb/s] 2100720 [msg/s] 6722.304 [Mb/s]
500 2510163 [msg/s] 10040.652 [Mb/s] 2158671 [msg/s] 8634.684 [Mb/s]
700 2411668 [msg/s] 13505.341 [Mb/s] 2147783 [msg/s] 12027.585 [Mb/s]

附录:

diff --git a/perf/inproc_thr.cpp b/perf/inproc_thr.cpp
index e16d5b3..008a30f 100644
--- a/perf/inproc_thr.cpp
+++ b/perf/inproc_thr.cpp
@@ -46,6 +46,21 @@

 static int message_count;
 static size_t message_size;
+static int message_clear;
+
+void mybind_cpu(int cpu_id)
+{
+    cpu_set_t mask;
+    CPU_ZERO(&mask);
+    CPU_SET(cpu_id, &mask);
+    if (sched_setaffinity(0, sizeof(cpu_set_t), &mask) < 0) {
+        printf("Error: cpu id %d sched_setaffinity\n", cpu_id);
+        printf("Warning: performance may be impacted \n");
+    }
+    return;
+}
+

 #if defined ZMQ_HAVE_WINDOWS
 static unsigned int __stdcall worker (void *ctx_)
@@ -58,6 +73,8 @@ static void *worker (void *ctx_)
     int i;
     zmq_msg_t msg;

+    mybind_cpu(2);
+
     s = zmq_socket (ctx_, ZMQ_PUSH);
     if (!s) {
         printf ("error in zmq_socket: %s\n", zmq_strerror (errno));
@@ -77,9 +94,9 @@ static void *worker (void *ctx_)
             printf ("error in zmq_msg_init_size: %s\n", zmq_strerror (errno));
             exit (1);
         }
-#if defined ZMQ_MAKE_VALGRIND_HAPPY
-        memset (zmq_msg_data (&msg), 0, message_size);
-#endif
+        if (message_clear == 1) {
+            memset (zmq_msg_data (&msg), 0, message_size);
+        }

         rc = zmq_sendmsg (s, &msg, 0);
         if (rc < 0) {
@@ -123,13 +140,14 @@ int main (int argc, char *argv [])
     unsigned long throughput;
     double megabits;

-    if (argc != 3) {
-        printf ("usage: inproc_thr  \n");
+    if (argc != 4) {
+        printf ("usage: inproc_thr   \n");
         return 1;
     }

     message_size = atoi (argv [1]);
     message_count = atoi (argv [2]);
+    message_clear = atoi (argv [3]);

     ctx = zmq_init (1);
     if (!ctx) {
@@ -164,6 +182,8 @@ int main (int argc, char *argv [])
     }
 #endif

+    mybind_cpu(3);
+
     rc = zmq_msg_init (&msg);
     if (rc != 0) {
         printf ("error in zmq_msg_init: %s\n", zmq_strerror (errno));
@@ -172,6 +192,7 @@ int main (int argc, char *argv [])

     printf ("message size: %d [B]\n", (int) message_size);
     printf ("message count: %d\n", (int) message_count);
+    printf ("message clear: %d\n", (int) message_clear);

     rc = zmq_recvmsg (s, &msg, 0);
     if (rc < 0) {

你可能感兴趣的:(libzmq在inproc://模式下性能测试)