RPC服务线程池大小及集群规模评估

写在前面的话

一个RPC服务在发布时不可避免的要设置其线程池大小,而我们往往却只根据经验来设置,需知不同场景不同业务下其需要配置不同的值方能使系统更稳定。以下内容是我认为应该去考虑的因素和具体的一些步骤,留待慢慢验证。

一、评估单机最佳线程数

根据该RPC服务提供的具体业务场景,设置不同线程池数量,进行单机压测。观察在不同的压力梯度下,单机系统资源的运行情况,包括CPU使用率,内存使用率,GC频率,网络流量,IO繁忙度等。

需要注意的是抛开具体场景去压测是毫无意义的,不同的业务场景下CPU,IO的开销比例是不同的(即下面公式的W/C)。只有限定业务场景,进行压测,才能找到适合该CPU,IO比例的线程池设置。

图、一种线程池计算公式。

img

二、评估单机最佳TPS

根据上面得出的线程池,测试在不同的TPS下,单机系统状态。找到如下区间的TPS:

1)CPU使用率:40% ~ 70%

2)内存使用率:40% ~ 60%

3)网络TCP重传数较低

4)磁盘使用率稳定

三、评估集群规模

假设上一步单机下得出的最佳单机NodeTPS,接下来考虑集群的规模。一般遵循以下步骤:

1)通过历史监控数据,找到RPC服务每秒接收的峰值请求数,记为ClusterTPS。

2)初步估算集群规模为:ClusterNum = ClusterTPS / NodeTPS

3)考虑集群滚动更新比例,记为P,则 ClusterNum = ClusterNum / (1 - P)

4)增加安全系数Secure(值大于1),ClusterNum = ClusterNum * Secure

5)大促时流量成倍增加,要保证SLA的话,则集群数量也需要相应倍增。

四、评估示例

假设有RPC服务经过压测,历史数据采集和整理,得出以下信息

1)单机线程池最优为500,最佳TPS为200

2)集群TPS为:3000

3)初步估算集群规模:3000/200 = 15

4)集群滚动更新比例为20%,则集群规模为:15 / (1 - 0.2) = 18.75

5)安全系数为1.2,则集群规模为:18.75 * 1.2 = 22.5

6)若大促是平时4倍流量,则大促时集群规模应为:22.5 * 4 = 90

写在后面的话

此评估模型不一定精准,但是可提供一种思路去科学的设置线程池参数和选择集群规模。至于精准性,本着先有而后优,非一蹴而就。需要在实践中不断迭代总结,优化思路和方法。

评论