关于如何测试服务器能承受的性能
有时候我在想一个问题:"想要知道服务器会不会多少个并发用户进来后会崩掉"
崩掉指的是 服务无法访问,各种报错,异常,或者访问异常缓慢.
很显然,我们的服务器不是无限制能访问的.但是到底能承受多少用户同时在线访问呢,当有人问你服务器能支持多少人同时在线,怎么去量化这个问题回答具体数值?
进过思考我得出如下一个结论。此结论与程序/性能/业务内容无关。通用的计算理论.
假设1:你的游戏10分钟内有6000个用户注册进来,在线数量假设能保持在6000人同时。
假设2:你的游戏有大概12个功能,新手引导之后正常操作步骤,玩家大概会在30秒内操作完这12个功能。
那么,为了保证游戏能正常进行,需要至少进行如下测试。
1.进行并发测试模拟新用户注册操作:并发线程数量=6000/10/60秒=10个并发操作/秒。
2.同时进行并发测试,模拟老用户点击操作:并发线程数量=6000*12/30秒=2400个并发操作随机访问业务功能/秒
**************以下是需要的线程数量推测计算******************
多线程下:假设使用CountDownLatch 来测试执行20个任务需要的总时间 假设花费时间是5秒钟,线程池设置数量为4
那么得出:
20任务 * 4线程 * 每线程执行速度 = 5秒
每线程执行速度 = 5秒 / (20任务*4线程)
1秒内执行完10任务需要的线程数量:10任务 * X个线程 * (5秒/(20任务*4线程))=1秒
X个线程=(1秒/(5秒/(20任务*4线程)))/10任务 =(1*20*4/5)/10=(1*20*4)/(10*5)=1.6个
注意:每线程执行速度并不是固定值,因为任务类型不同(io密集型/cpu密集型)和线程池数量不同会有差异。
测试时执行任务越多,线程池数量越大计算的误差会越小。每线程执行速度结果值越稳定。
以上具体数值根据各自程序测试实际结果代入,即可算出2400个并发操作/秒 需要设置多少个线程数量才能实现。
以上计算方式的用途:当有人问你单服能承载多少人同时在线,可以通过以上测试并计算告知具体数值。 开服时涌入压力这段时间,忽略网络请求情况的数据。
通过这一系列计算,你就能知道你的服务能承载多少用户在线不卡.你的线程池数量需要设置成多少.
关于线程池还有一点需要告诉大家,不知道大家是否留意.那就是:不同类业务不要共用同一个线程池,否则会一旦发生阻塞,会影响所有业务.分开则不会互相干扰