为何Docker环境下Redis性能比原生部署时更低?
Docker环境下Redis性能低于原生部署的原因分析
我在1核CPU、1GB内存、Ubuntu 22.04系统的VPS上完成了Redis性能对比测试,结果显示Docker部署的Redis性能均低于原生部署,以下是测试细节及可能的影响因素:
测试场景及结果
1. 宿主机原生Redis(性能最优)
部署与测试命令:
sudo apt-get update sudo apt-get install redis # redis_version:6.0.16 redis-benchmark -q -n 100000
测试结果:
PING_INLINE: 23004.37 requests per second PING_BULK: 21915.41 requests per second SET: 23792.53 requests per second GET: 22867.60 requests per second INCR: 23894.86 requests per second LPUSH: 25252.53 requests per second RPUSH: 24551.93 requests per second LPOP: 24414.06 requests per second RPOP: 24307.24 requests per second SADD: 23512.82 requests per second HSET: 24746.35 requests per second SPOP: 22758.31 requests per second ZADD: 23969.32 requests per second ZPOPMIN: 22701.47 requests per second LPUSH (needed to benchmark LRANGE): 24113.82 requests per second LRANGE_100 (first 100 elements): 17531.56 requests per second LRANGE_300 (first 300 elements): 7954.18 requests per second LRANGE_500 (first 450 elements): 6106.12 requests per second LRANGE_600 (first 600 elements): 5296.89 requests per second MSET (10 keys): 30012.00 requests per second
2. Docker中Redis(容器外测试,性能最差)
部署与测试命令:
docker pull redis:6.0.17 docker run --name redis -p 6378:6379 -d redis:6.0.17 redis-benchmark -q -n 100000 -p 6378
测试结果:
PING_INLINE: 7548.31 requests per second PING_BULK: 7623.69 requests per second SET: 7474.96 requests per second GET: 7474.96 requests per second INCR: 7488.95 requests per second LPUSH: 7443.25 requests per second RPUSH: 7487.27 requests per second LPOP: 7401.92 requests per second RPOP: 7163.84 requests per second SADD: 7252.16 requests per second HSET: 7192.17 requests per second SPOP: 7217.61 requests per second ZADD: 7331.38 requests per second ZPOPMIN: 7597.63 requests per second LPUSH (needed to benchmark LRANGE): 7392.62 requests per second LRANGE_100 (first 100 elements): 6248.05 requests per second LRANGE_300 (first 300 elements): 6377.55 requests per second LRANGE_500 (first 450 elements): 5748.45 requests per second LRANGE_600 (first 600 elements): 4578.75 requests per second MSET (10 keys): 6895.60 requests per second
3. 容器内运行测试(略慢于宿主机)
测试命令:
docker exec -it redis sh redis-benchmark -q -n 100000
测试结果:
PING_INLINE: 22416.50 requests per second PING_BULK: 21654.40 requests per second SET: 23413.72 requests per second GET: 22351.36 requests per second INCR: 22784.23 requests per second LPUSH: 24467.83 requests per second RPUSH: 23651.84 requests per second LPOP: 23781.21 requests per second RPOP: 23691.07 requests per second SADD: 22747.95 requests per second HSET: 24301.34 requests per second SPOP: 22172.95 requests per second ZADD: 24301.34 requests per second ZPOPMIN: 22578.46 requests per second LPUSH (needed to benchmark LRANGE): 24177.95 requests per second LRANGE_100 (first 100 elements): 13817.88 requests per second LRANGE_300 (first 300 elements): 7212.93 requests per second LRANGE_500 (first 450 elements): 5898.31 requests per second LRANGE_600 (first 600 elements): 4890.45 requests per second MSET (10 keys): 29154.52 requests per second
4. Docker Compose跨容器测试(性能中等)
配置文件:
# Dockerfile FROM redis:6.0.17 CMD redis-benchmark -q -n 100000 -h redis
# docker-compose.yml version: "3.9" services: web: build: . redis: image: "redis:6.0.17"
测试结果:
PING_INLINE: 16173.38 requests per second, p50=1.495 msec PING_MBULK: 15172.20 requests per second, p50=1.503 msec SET: 15989.77 requests per second, p50=1.503 msec GET: 15701.05 requests per second, p50=1.511 msec INCR: 16121.23 requests per second, p50=1.487 msec LPUSH: 16428.46 requests per second, p50=1.495 msec RPUSH: 14630.58 requests per second, p50=1.639 msec LPOP: 15542.43 requests per second, p50=1.567 msec RPOP: 15518.31 requests per second, p50=1.551 msec SADD: 14900.91 requests per second, p50=1.567 msec HSET: 15176.81 requests per second, p50=1.575 msec SPOP: 14918.69 requests per second, p50=1.583 msec ZADD: 15855.40 requests per second, p50=1.543 msec ZPOPMIN: 15248.55 requests per second, p50=1.551 msec LPUSH (needed to benchmark LRANGE): 16466.33 requests per second, p50=1.495 msec LRANGE_100 (first 100 elements): 10330.58 requests per second, p50=2.423 msec LRANGE_300 (first 300 elements): 5361.07 requests per second, p50=4.671 msec LRANGE_500 (first 500 elements): 3863.99 requests per second, p50=6.191 msec LRANGE_600 (first 600 elements): 3718.99 requests per second, p50=6.559 msec MSET (10 keys): 20618.56 requests per second, p50=1.415 msec
可能的性能影响因素
从测试数据的差异可以看出,不同部署方式的性能差距主要来自以下几个方面:
网络层开销:这是最显著的因素。容器外通过端口映射(
-p)访问Redis时,数据包需要经过Docker的桥接网络、NAT转换,相比原生的本地套接字或直连TCP,额外的网络转发带来了巨大的性能损耗。而容器内测试使用localhost访问,网络开销极小,性能接近原生;Docker Compose的跨容器测试使用自定义桥接网络,NAT开销比宿主机端口映射小,但仍存在一定的转发损耗。容器隔离机制的微小开销:即使是容器内测试,性能略低于原生,这是因为Docker通过cgroups进行资源限制、namespace实现隔离,这些机制会带来非常轻微的CPU调度、内存管理开销,在资源紧张的1核1G VPS上会被放大。
Redis版本差异:原生Redis是6.0.16,Docker使用的是6.0.17,虽然版本差异极小,但不排除小版本间的细微性能差别。
资源限制:Docker默认会限制容器的资源使用,如果没有显式配置CPU、内存的限制参数,容器可能无法完全利用宿主机的资源,在1核CPU的环境下,这种资源竞争会导致性能下降。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

