dragonfly不是即装即用的redis黑盒,需满足linux 5.10+内核、ulimit -l unlimited、docker 20.10+等硬性要求,否则启动失败或压测异常;redis协议兼容存在lua、事务、连接池等细节差异;性能需通过--io-threads、--worker-threads和--maxmemory-policy参数启动时显式配置。

Dragonfly 不是“装上就能当 Redis 用”的黑盒,它对 Linux 内核、内存锁限制和线程配置有明确硬性要求。跳过这些直接跑 docker run,大概率在压测时出现连接超时、快照失败或 QPS 卡在几万不动——这不是配置问题,是环境没达标。
Linux 内核和系统限制必须提前检查
Dragonfly 依赖 io_uring,只支持 Linux 5.10+;低于这个版本,连启动都会报 io_uring_setup: Operation not permitted。别信“Docker 镜像里自带内核”这种说法,宿主机内核才是关键。
- 运行
uname -r确认内核 ≥ 5.10;Ubuntu 20.04 默认是 5.4,但某些云厂商定制镜像可能仍是 5.3,得手动升级 -
ulimit -l必须为unlimited或至少-1,否则 Dragonfly 启动时会拒绝加载大页内存,日志里反复出现setrlimit memlock failed - 修改
/etc/security/limits.conf,加两行:* soft memlock unlimited* hard memlock unlimited,然后重新登录终端生效
Docker 部署最简可行命令(不是 docker-compose)
官方 docker-compose.yml 默认挂载路径和端口对调试不友好,且容易因 volume 权限导致快照写入失败。生产环境建议用 host 网络 + 显式 ulimit 启动:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 确保 Docker 版本 ≥ 20.10(低版本不支持
--ulimit传memlock=-1) - 一条命令跑起来:
docker run -d --name dragonfly --network=host --ulimit memlock=-1 -v /data/dragonfly:/data docker.dragonflydb.io/dragonflydb/dragonfly --dir /data --maxmemory 8g -
--dir /data必须显式指定,否则快照默认写进容器临时文件系统,重启即丢 - 不加
--maxmemory会导致 Dragonfly 尝试吃光所有内存,跟系统 OOM killer 正面刚
Redis 兼容性不是 100%,这些命令要验证
Dragonfly 声称兼容 Redis 协议,但实际踩坑多在边缘行为:比如 CLIENT LIST 返回字段顺序不同、CONFIG GET 不返回 tcp-keepalive、SCAN 游标在空库时返回 0 而非空字符串。更关键的是事务和 Lua 的兼容粒度。
- 用你线上真实客户端连接后,务必跑一遍:
redis-cli -p 6379 ping、redis-cli -p 6379 set foo bar、redis-cli -p 6379 get foo—— 这三步通了不代表能上,只是门槛 - 重点验证:
redis-cli -p 6379 eval "return redis.call('GET', KEYS[1])" 1 foo(Lua)、redis-cli -p 6379 multi; set x 1; exec(事务)、redis-cli -p 6379 hset user:1 name alice age 25(复合结构) - 如果你用的是 Lettuce 或 StackExchange.Redis,注意它们默认启用
tcp-keepalive,而 Dragonfly 当前版本不识别该配置项,连接池可能异常断开
性能调优绕不开的三个配置项
开箱即用的 Dragonfly 在单机 16 核机器上,QPS 很难突破 30 万。真正释放性能得动这三项:
-
--io-threads:建议设为物理 CPU 核数 × 0.75(比如 16 核就设 12),设太高反而因上下文切换拖慢延迟 -
--worker-threads:必须 ≤--io-threads,通常设成相同值;设成 0 表示禁用多线程 worker,退化为单线程模式 -
--maxmemory-policy:默认是noeviction,但如果你依赖 LRU/LFU 驱逐,必须显式改成allkeys-lru或其它策略,否则内存满后直接拒绝写入
这些参数不能写在配置文件里动态 reload,必须随进程启动时传入。改完要 docker kill && docker run 全量重启,没有热重载。










