调优 - 连接数调整
为什么要调整
一般来说,现在的redis连接都会有池化技术, Redis连接池技术有以下好处:
资源复用:连接池允许多个客户端共享一定数量的数据库连接。当一个客户端完成操作并释放连接时,这个连接可以被另一个客户端重用,而不是关闭后重新建立,这大大减少了创建和销毁连接所需的时间和资源。
减少等待时间:预创建的连接可以立即提供给需要它们的客户端。这意味着应用程序不需要等待建立连接就可以执行操作,从而提高了响应速度。
提高性能:连接池可以减少因频繁打开和关闭连接造成的开销,因为建立数据库连接通常是一个高成本的操作,包括网络延迟、认证等过程。
连接数控制:连接池可以限制系统中活跃的总连接数。这防止了系统打开过多的连接,从而避免了对数据库服务器资源的过度消耗和可能的拒绝服务。
自动管理:连接池通常提供自动化的连接管理功能,如检测空闲连接、移除无效连接等,而不需要开发者手动干预。
减轻数据库压力:通过重用连接,连接池使得数据库服务器不必处理大量短生命周期的连接,这有助于维持数据库的稳定性和性能。
配置灵活性:可以根据应用程序的负载特征和数据库服务器的能力对连接池进行配置,如调整池的大小、连接的生命周期等。
故障恢复:当某个连接发生故障时,连接池可以提供一个新的连接替代它,从而增强了应用程序的鲁棒性。
更好的并发处理:在高并发环境下,连接池可以更有效地管理不同线程或进程的连接需求,减少了锁的竞争和上下文切换的成本。
简化编程模型:开发者可以从连接池中获取连接,执行操作,然后返回连接,而无需关心连接的创建和关闭,简化了编程模型。
总的来说,连接池技术显著提升了对数据库的操作效率,对于维护大型、高并发的应用程序至关重要。在使用 Redis 这类内存数据库时,由于其响应时间极快,连接池的优势尤为突出。
但是在连接池中创建的连接数过多或过少同样会带来许多问题:
如果连接数过多:
- 资源消耗: 每个连接都会占用内存和其他系统资源。连接数过多可能会导致服务器资源紧张,影响系统的稳定性。
- 性能下降: 过多的连接可能会导致数据库服务器过载,响应时间变长,从而影响整体性能。
- 操作系统限制: 操作系统可能对同时打开的文件描述符数有限制。打开过多的连接可能会耗尽这些资源,影响系统的其他部分。
- 连接竞争: 在多线程环境中,大量的线程可能会同时尝试获取连接,导致竞争激烈,响应时间增加。
- 成本增加: 如果你的数据库解决方案按连接数收费,过多的连接将导致不必要的成本增加。
- 扩容导致数量增加:当前很多系统上线时,都是以先扩容再缩容的方式上线的,如系统有20台机器,上线时会扩容为40台机器,在新的20台机器上上线新代码,这20台上线成功后,再下线原来的20台机器,完成热部署。这种情况下,会同时又40台机器的连接数,可能会打满连接数
总的来说,redis的连接数会由于服务器资源受到限制,后续如果有业务增长导致扩容,可能会使连接数被打满从而导致不可用
如果连接数过少:
- 性能瓶颈: 连接数不足可能会导致应用程序等待空闲连接而无法执行操作,从而创建性能瓶颈。
- 并发能力受限: 连接池大小限制了系统的并发处理能力,太少的连接意味着在高并发情况下,应用程序的响应能力下降。
- 资源未充分利用: 如果数据库服务器能够处理更多并发连接,但连接池未能提供足够的连接,那么数据库服务器的处理能力就没有得到充分利用。
- 用户体验恶化: 用户可能会因为必须等待可用连接而面临延迟,这会直接影响到用户体验。
- 吞吐量下降: 应用程序的最大吞吐量受限于可用连接的数量,限制了最大执行操作的速率。
如何调整
首先明确一点,需要多少连接数是由客户端(即应用系统)决定的,服务端(也就是redis集群)决定的是当前集群资源最大能创建多少连接数,因此调整连接数是调整应用系统的核心连接数和最大连接数。
思路
那么应该如何调整呢?
最好的思路是查看当前系统的QPS,并假设每一次QPS请求都会请求一次redis服务,因此可以根据此来调整连接数。
可以通过redis请求耗时计算出每秒处理请求数,再计算
- 单机每秒可处理的核心请求数 = 单机核心连接数 * 每秒处理请求数
- 单机每秒可处理的最大请求数 = 单机最大连接数 * 每秒处理请求
观察业务系统 平均 和 峰值 的qps请求,计算出业务的单机qps请求;只需要满足以下条件,则redis连接数调整就是合理的:
- 每秒可处理的核心请求数 > 平均qps请求数
- 每秒可处理的最大请求数 > 峰值qps请求
举例
假设 Redis请求平均耗时:10ms (这个可以与DBA确认,需要包含命令处理时间和网络IO),那么Redis每秒处理请求数就是:1s/10ms = 100个
假设订单系统有20台机器,当前系统总的平均QPS为5K,峰值QPS为10K,压测峰值QPS为40K,那么系统的单机QPS为
- 平均qps为:5K/20 = 250;
- 峰值qps为:10K/20 = 500;
- 压测峰值qps:40K/20 = 2000
因此Redis的单机连接数可以调整为:核心连接数 5,最大连接数20
假设将 “Redis单机核心连接数” 调整为5,则Redis单机每秒可处理核心请求数 = Redis单机核心连接数 x Redis每秒处理请求数 = 5 x 100 = 500qps,大于等于系统的单机请求量250~500,可以满足业务系统平均和峰值的qps请求;
假设将“Redis单机最大连接数”调整为20,则Redis单机每秒可处理最大请求数 = Redis单机核心连接数 x Redis每秒处理请求数 = 20 x 100 = 2000qps,大
于等于单机请求量2000,可以满足业务系统平均和峰值的qps请求,并且能达到压测qps;
不过,为了让系统有所冗余,一般会给出更大点的连接,防止有时并发情况下的连接数不够用导致系统不可用。如核心连接数调整为8,最大连接数调整为25。