Redis性能测试疑问:10kB消息为何比5kB消息Ops/sec更高?
Docker环境下受限Redis性能异常:10kB消息Ops/sec高于5kB的原因解析
问题背景
我在Docker环境下对带有CPU/内存资源限制的Redis进行性能测试,使用Memtier Benchmark工具执行测试。意外发现,10kB大小的消息相比5kB消息,反而获得了更高的每秒操作数(Ops/sec)。测试结果图表如下:
可能的原因分析
- Docker资源调度的批量优化:Docker的CPU调度(尤其是CFS配额限制下)会倾向于给单次处理更大数据量的任务分配更长的时间片。10kB消息单次请求的数据量更大,Redis处理时能更充分利用分配到的CPU时间片,减少了调度切换的开销——相比5kB消息需要更多次的调度唤醒,10kB的请求在相同时间内完成的有效操作占比更高。
- Redis内部批量处理机制触发:Redis底层的内存分配、网络IO缓冲区处理存在批量优化逻辑。10kB的消息大小刚好触发了更高效的批量处理路径,而5kB可能落在优化阈值以下,无法享受到这部分性能提升。
- TCP打包效率差异:Memtier发送请求时,10kB消息更接近TCP最大段长度(MSS)的最优打包比例,产生的TCP分段更少,减少了TCP握手、ACK等网络层面的额外开销,间接提升了每秒操作数。而5kB小消息会生成更多零散的TCP包,增加了网络处理的消耗。
- 内存分配器的行为差异:Redis默认使用jemalloc内存分配器,不同大小的value会匹配不同的内存块规格。10kB的value刚好适配jemalloc的某个大内存块,分配和释放的开销更低;5kB则可能需要拼接小内存块或触发更频繁的碎片整理,拖慢了整体处理速度。
内容的提问来源于stack exchange,提问作者try_harder
相关产品推荐
相关产品推荐

