测试环境:
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
结果展示
TablesNo zero memZero mem
644152871 [msg/s] 2126.270 [Mb/s]3697188 [msg/s] 1892.960 [Mb/s]1282525915 [msg/s] 2586.537 [Mb/s]2317762 [msg/s] 2373.388 [Mb/s]2562594865 [msg/s] 5314.284 [Mb/s]2445809 [msg/s] 5009.017 [Mb/s]4002325507 [msg/s] 7441.622 [Mb/s]2100720 [msg/s] 6722.304 [Mb/s]5002510163 [msg/s] 10040.652 [Mb/s]2158671 [msg/s] 8634.684 [Mb/s]7002411668 [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 <message-size> <message-count>\n");
+
if (argc !=
4) {
+
printf (
"usage: inproc_thr <message-size> <message-count> <message-clear>\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) {
转载请注明原文地址: https://ju.6miu.com/read-965118.html