1.估计线程数存在的难点
线程个数越多,线程切换频繁,会浪费资源在线程切换上面;线程个数少无法充分利用cpu资源,也会造成资源浪费,所以在实际中我们一般会设置一个大概的数值,但是这个数值具体是怎么计算出来的也没有一个合理的算法,所以本文参考一些文章提供一种近似估计服务器需要设置的线程个数的方案。
2.服务器类型
交互型:客户端和服务端交互较多,每次交互cpu需要消耗的时间较少,大部分时间等待在线程切换和网路传输上
计算型:客户端和服务端交互很少,例如定时任务服务器,大部分时间是消耗在cpu计算上
3.估算线程个数
官方计算公式:
最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
计算型服务器因为 线程等待时间<<线程CPU时间,所以线程等待时间可以忽略不计,所以这种服务器的最佳线程数目等于CPU数目
交互性服务器:因为涉及到很多的接口,每个接口的等待时间和cpu时间不一定相等,甚至相同的接口也有细微的差别,根据网络情况和服务器情况有关,所以我们主要估计这种服务器需要设置的线程个数。
具体估计方案:
假设我们的服务器中有三个接口,这三个接口为:
查询用户详情
查询订单信息
查询账单信息
通过后台的监控系统我们可以统计到这三个接口的调用次数为100,200,700,所以我们知道这三个接口的调用比例为1:2:7,我们可以通过编写测试压测程序分别对接口按比例进行测试调用,可以统计出每个接口的平均响应时间,假设分别为1s,2s和3s,这里的响应时间包括等待时间+cpu时间,在后端程序代码通过AOP统计出每个接口的平均cpu时间,假设分别为100ms,200ms和400ms。
应用平均响应时间 = 1/101+2/102+7/103=2.4s
应用平均cpu时间 = 1/10100+2/10200+7/10400=330ms=0.3s
服务器的cpu核数 = 8
所以我们可以估计出最佳线程数目为:2.4/0.3*8=64
这是一种近似估计方法,但是实际中随着线程数量的增加,测算出的结果可能会有误差,所以一般会将上述计算出来的线程个数按90%或者80%来作为最终结果。
网友评论