Hello, everyone: When I use redis-benchmark to test redis performance on my CentOS machine, it's interesting that I got two quite different results before and after upgrading linux kernel. Actually, it seems that I have got a better performance on the older linux kernel. Why is that?

Here is my test environment and test result:

Environment:

  • Alicloud ECS Centos 7.4
  • redis-5.0.7

install redis: make && make test run redis-server: ./redis-5.0.7/src/redis-server ./redis-5.0.7/redis.conf run redis-benchmark: ./redis-5.0.7/src/redis-benchmark

Test result:

Before upgrading linux kernel, the version of kernel is 3.10.0-693.el7.x86_64, and here is my test result:

[root@izm5edm84ihddad1da94chz ~]# tiange/redis-5.0.7/src/redis-benchmark
====== PING_INLINE ======
  100000 requests completed in 0.91 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.99% <= 1 milliseconds
100.00% <= 1 milliseconds
110253.59 requests per second

====== PING_BULK ======
  100000 requests completed in 0.93 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
107874.87 requests per second

====== SET ======
  100000 requests completed in 0.90 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
111482.72 requests per second

====== GET ======
  100000 requests completed in 0.91 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
109409.20 requests per second

====== INCR ======
  100000 requests completed in 0.90 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
111607.14 requests per second

====== LPUSH ======
  100000 requests completed in 0.89 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
112866.82 requests per second

====== RPUSH ======
  100000 requests completed in 0.90 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.94% <= 1 milliseconds
99.95% <= 4 milliseconds
100.00% <= 5 milliseconds
100.00% <= 5 milliseconds
111607.14 requests per second

====== LPOP ======
  100000 requests completed in 0.90 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 1 milliseconds
111607.14 requests per second

====== RPOP ======
  100000 requests completed in 0.89 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
111856.82 requests per second

====== SADD ======
  100000 requests completed in 0.90 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.98% <= 1 milliseconds
100.00% <= 1 milliseconds
110987.79 requests per second

====== HSET ======
  100000 requests completed in 0.87 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
114942.53 requests per second

====== SPOP ======
  100000 requests completed in 0.90 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
110619.47 requests per second

====== LPUSH (needed to benchmark LRANGE) ======
  100000 requests completed in 0.88 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
113378.68 requests per second

====== LRANGE_100 (first 100 elements) ======
  100000 requests completed in 2.41 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

98.62% <= 1 milliseconds
100.00% <= 1 milliseconds
41545.49 requests per second

====== LRANGE_300 (first 300 elements) ======
  100000 requests completed in 6.01 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

1.39% <= 1 milliseconds
95.38% <= 2 milliseconds
99.39% <= 3 milliseconds
99.95% <= 4 milliseconds
99.97% <= 5 milliseconds
99.98% <= 6 milliseconds
99.99% <= 7 milliseconds
100.00% <= 7 milliseconds
16644.47 requests per second

====== LRANGE_500 (first 450 elements) ======
  100000 requests completed in 8.20 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

0.44% <= 1 milliseconds
27.83% <= 2 milliseconds
96.09% <= 3 milliseconds
99.15% <= 4 milliseconds
99.82% <= 5 milliseconds
99.94% <= 6 milliseconds
99.98% <= 7 milliseconds
100.00% <= 7 milliseconds
12195.12 requests per second

====== LRANGE_600 (first 600 elements) ======
  100000 requests completed in 10.34 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

0.18% <= 1 milliseconds
2.59% <= 2 milliseconds
89.83% <= 3 milliseconds
96.70% <= 4 milliseconds
98.99% <= 5 milliseconds
99.71% <= 6 milliseconds
99.96% <= 7 milliseconds
99.98% <= 8 milliseconds
99.99% <= 9 milliseconds
100.00% <= 9 milliseconds
9670.25 requests per second

====== MSET (10 keys) ======
  100000 requests completed in 1.02 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.95% <= 1 milliseconds
99.95% <= 4 milliseconds
100.00% <= 4 milliseconds
97847.36 requests per second

And after upgrading linux kernel, the version of kernel changes to 3.10.0-1062.12.1.el7.x86_64, and here is my test result:

[root@izm5edm84ihddad1da94chz ~]# tiange/redis-5.0.7/src/redis-benchmark
====== PING_INLINE ======
  100000 requests completed in 2.49 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

98.54% <= 1 milliseconds
99.95% <= 2 milliseconds
99.97% <= 3 milliseconds
100.00% <= 4 milliseconds
100.00% <= 4 milliseconds
40176.78 requests per second

====== PING_BULK ======
  100000 requests completed in 2.46 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

98.51% <= 1 milliseconds
100.00% <= 1 milliseconds
40600.89 requests per second

====== SET ======
  100000 requests completed in 2.48 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

97.29% <= 1 milliseconds
99.90% <= 2 milliseconds
99.93% <= 3 milliseconds
99.99% <= 4 milliseconds
100.00% <= 4 milliseconds
40322.58 requests per second

====== GET ======
  100000 requests completed in 2.49 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

98.38% <= 1 milliseconds
100.00% <= 1 milliseconds
40176.78 requests per second

====== INCR ======
  100000 requests completed in 2.46 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

98.41% <= 1 milliseconds
99.95% <= 4 milliseconds
99.98% <= 5 milliseconds
100.00% <= 5 milliseconds
40617.39 requests per second

====== LPUSH ======
  100000 requests completed in 2.48 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

98.13% <= 1 milliseconds
100.00% <= 1 milliseconds
40241.45 requests per second

====== RPUSH ======
  100000 requests completed in 2.48 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

98.28% <= 1 milliseconds
100.00% <= 1 milliseconds
40387.72 requests per second

====== LPOP ======
  100000 requests completed in 2.50 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

97.75% <= 1 milliseconds
99.95% <= 4 milliseconds
99.98% <= 5 milliseconds
100.00% <= 5 milliseconds
40064.10 requests per second

====== RPOP ======
  100000 requests completed in 2.49 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

97.89% <= 1 milliseconds
100.00% <= 1 milliseconds
40160.64 requests per second

====== SADD ======
  100000 requests completed in 2.48 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

98.34% <= 1 milliseconds
99.95% <= 4 milliseconds
99.98% <= 5 milliseconds
100.00% <= 5 milliseconds
40371.42 requests per second

====== HSET ======
  100000 requests completed in 2.47 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

97.80% <= 1 milliseconds
99.95% <= 4 milliseconds
99.98% <= 5 milliseconds
100.00% <= 5 milliseconds
40485.83 requests per second

====== SPOP ======
  100000 requests completed in 2.46 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

98.24% <= 1 milliseconds
100.00% <= 1 milliseconds
40584.41 requests per second

====== LPUSH (needed to benchmark LRANGE) ======
  100000 requests completed in 2.49 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

97.78% <= 1 milliseconds
99.95% <= 2 milliseconds
99.95% <= 4 milliseconds
99.98% <= 5 milliseconds
100.00% <= 5 milliseconds
40128.41 requests per second

====== LRANGE_100 (first 100 elements) ======
  100000 requests completed in 3.81 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

63.99% <= 1 milliseconds
98.14% <= 2 milliseconds
99.94% <= 3 milliseconds
99.97% <= 4 milliseconds
99.99% <= 5 milliseconds
100.00% <= 5 milliseconds
26239.83 requests per second

====== LRANGE_300 (first 300 elements) ======
  100000 requests completed in 7.09 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

1.00% <= 1 milliseconds
72.28% <= 2 milliseconds
95.00% <= 3 milliseconds
98.69% <= 4 milliseconds
99.92% <= 5 milliseconds
99.97% <= 6 milliseconds
99.99% <= 7 milliseconds
100.00% <= 7 milliseconds
14102.38 requests per second

====== LRANGE_500 (first 450 elements) ======
  100000 requests completed in 9.31 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

0.44% <= 1 milliseconds
10.61% <= 2 milliseconds
85.26% <= 3 milliseconds
94.81% <= 4 milliseconds
98.46% <= 5 milliseconds
99.71% <= 6 milliseconds
100.00% <= 6 milliseconds
10743.45 requests per second

====== LRANGE_600 (first 600 elements) ======
  100000 requests completed in 11.53 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

0.19% <= 1 milliseconds
2.15% <= 2 milliseconds
51.12% <= 3 milliseconds
90.92% <= 4 milliseconds
96.13% <= 5 milliseconds
98.53% <= 6 milliseconds
99.62% <= 7 milliseconds
99.96% <= 8 milliseconds
100.00% <= 9 milliseconds
100.00% <= 9 milliseconds
8669.27 requests per second

====== MSET (10 keys) ======
  100000 requests completed in 2.54 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

95.16% <= 1 milliseconds
99.89% <= 2 milliseconds
99.90% <= 3 milliseconds
99.93% <= 4 milliseconds
99.98% <= 5 milliseconds
100.00% <= 5 milliseconds
39385.59 requests per second

Comment From: SplendidSky

Finally I found it is a Linux kernel issue. It is corresponding to the patch of Spectre(CVE-2017-5753 and CVE-2017-5754). Try this: echo 0 > /sys/kernel/debug/x86/pti_enabled echo 0 > /sys/kernel/debug/x86/ibpb_enabled echo 0 > /sys/kernel/debug/x86/ibrs_enabled

Ref: https://access.redhat.com/articles/3307751 https://access.redhat.com/articles/3311301