Redis作为当前最流行的内存数据库之一,其性能表现直接影响着整个系统的响应能力。这次我们对一个3分片×2副本的Redis集群进行了全面的性能测试,重点考察了Predixy代理在不同配置下的表现。测试过程中,我们经历了从发现问题到逐步优化的完整历程,最终实现了QPS提升86%、P99延迟降低92%的显著效果。
测试集群部署在Kubernetes环境中,具体配置如下:
环境配置的合理性直接影响测试结果的准确性。我们特别注意了以下几点:
整个测试架构采用典型的三层设计:
code复制客户端(redis-benchmark) → Predixy代理(2副本) → Redis Server(6 Pod)
这种架构模拟了生产环境中常见的访问模式。Predixy作为代理层,负责将客户端请求路由到正确的Redis分片,同时提供连接池、读写分离等高级功能。
提示:在实际部署时,Predixy副本数的选择需要权衡资源消耗和性能需求。我们的测试从2个副本开始,后续会根据测试结果考虑是否扩容。
我们主要关注以下核心指标:
测试操作选择了最基础的SET和GET命令,因为这些操作最能反映Redis的核心性能。测试并发量从50逐步增加到4000,覆盖了从低负载到高并发的各种场景。
整个测试过程分为三个阶段:
这种分阶段测试方法可以清晰看到每个优化措施的实际效果,避免一次性修改多个参数导致无法准确评估单个因素的影响。
在初始配置下(WorkerThreads=1),测试结果如下:
| 并发数 | SET QPS | SET P99 | GET QPS | GET P99 |
|---|---|---|---|---|
| 50 | 24,655 | 45.0ms | 27,670 | 39.4ms |
| 100 | 29,308 | 40.8ms | 28,703 | 46.8ms |
| 1000 | 23,753 | 71.0ms | - | - |
| 4000 | 23,855 | 191.1ms | - | - |
从数据可以看出几个明显特征:
分析初始测试结果,我们识别出以下主要瓶颈:
注意:在分析性能瓶颈时,我们使用了Kubernetes的监控工具观察Pod的资源使用情况,同时结合Redis的slowlog功能分析延迟较高的操作。
在初始测试中,我们发现部分Redis Pod处于Pending状态,这显然会影响性能。解决资源分配问题后,所有Pod都进入Running状态,测试结果如下:
| 指标 | 初始测试 | 扩容后测试 | 提升幅度 |
|---|---|---|---|
| 峰值QPS | 29,762 | 32,342 | +8.6% |
| 100并发P99 | 40.8ms | 46.1ms | +13% |
| 1000并发QPS | 23,753 | 24,851 | +5% |
虽然QPS有小幅提升,但P99延迟反而有所增加,这说明单纯的Pod可用性改善并不能解决根本的性能问题。
基于对单线程瓶颈的分析,我们将Predixy的WorkerThreads从1增加到4,测试结果对比如下:
| 并发数 | WT=1 QPS | WT=1 P99 | WT=4 QPS | WT=4 P99 | QPS提升 | P99降低 |
|---|---|---|---|---|---|---|
| 50 | 28,106 | 38.3ms | 51,573 | 2.01ms | +83% | -95% |
| 100 | 31,348 | 46.1ms | 50,352 | 3.26ms | +61% | -93% |
| 1000 | 24,851 | 76.6ms | 54,377 | 29.52ms | +119% | -61% |
这一优化带来了显著改善:
将所有测试数据汇总对比,可以清晰看到优化效果:
| 指标 | 初始(WT=1) | 扩容后(WT=1) | WT=4优化 | 总提升 |
|---|---|---|---|---|
| 峰值QPS | 29,762 | 32,342 | 55,432 | +86% |
| 100并发QPS | 29,308 | 31,348 | 50,352 | +72% |
| 100并发P99 | 40.8ms | 46.1ms | 3.26ms | -92% |
| 1000并发QPS | 23,753 | 24,851 | 54,377 | +129% |
通过绘制QPS随并发数变化的曲线,我们可以观察到:
这种现象说明增加工作线程数确实提高了系统的并发处理能力,使系统能够在更高并发下维持较好的性能。
延迟表现是另一个关键指标:
这表明WorkerThreads=4已经解决了低并发下的延迟问题,但在极高并发下仍可能出现排队现象。
尽管WorkerThreads=4带来了显著改善,但我们仍发现了一些潜在问题:
基于测试结果和瓶颈分析,我们提出以下优化建议:
增加WorkerThreads到8:
bash复制kubectl edit configmap redis-2ffca4ed-predixy-conf -n qfusion-admin
# 修改WorkerThreads参数为8
提高CPU限制到2000m:
bash复制kubectl edit qfr redis-2ffca4ed -n qfusion-admin
# 修改predixy.resources.limits.cpu: "2"
# 修改predixy.resources.requests.cpu: "1000m"
扩容Predixy副本到4个:
bash复制kubectl scale statefulset redis-2ffca4ed-predixy -n qfusion-admin --replicas=4
连接池优化:
如果实施全部推荐优化,预期性能如下:
| 指标 | 当前(WT=4) | 预期优化后 | 提升幅度 |
|---|---|---|---|
| 峰值QPS | 55,000 | 150,000+ | +170% |
| 2000并发P99 | 240ms | <50ms | -80% |
| 系统容量 | 中等 | 大规模 | 显著提升 |
高延迟问题:
QPS上不去:
资源不足问题:
容量规划:
监控告警:
渐进式优化:
通过这次全面的性能测试,我们不仅找出了当前配置下的性能瓶颈,还验证了优化措施的有效性,为生产环境部署提供了可靠依据。后续我们将继续监控系统表现,根据实际运行情况进一步调优。