我们的服务器一直没有经过压力测试,无法回答客户到底租什么配置的服务器才能满足多少用户量的问题。这两天下决心把这个事情做了。
我们的服务器上主要运行着两种服务:RESTFUL和MQTT BROKER。对于前者来说,连接不是长期的,是偶发的,只有在APP运行的时候才会连接服务器,调用REST接口。对于后者来说,要分两种情况:APP和主机。APP连接MQTT BROKER和调用REST接口类似,也是偶发的,但是主机则是长时间连接MQTT BROKER。
所以主要是要测试主机连接的最大数量和服务器配置的关系,RESTFUL这方面基本上可以忽略,因为并发在线数量的经验值是1/100,和主机连接不是同一个数量级的。
本来是想参照此文章:Centos 6.5下 mosquitto 阿里云单机压力测试,使用emqtt_benchmark来测试的,但是ERLANG安装过程出现问题解决不了,后来就放弃了。最后是根据此文章:mosquitto在Linux环境下的部署/安装/使用/测试,采用简单粗暴的命令行(mosquitto_sub)来进行的测试。
因为发起客户端连接也很消耗内存,所以我找了八台电脑,同时向服务器发起连接。使用下面的脚本,每次发起一千个连接。
#!/bin/bash
c=1
while [ $c -le 1000 ]
do
mosquitto_sub -h [服务器IP] -p [服务器端口] -u [MQTT用户名] -P [MQTT密码] -d -t 'test/#' -k 3600 &
(( c++ ))
done
其中3600代表一个小时内保持连接。结果在测试过程中发现,最多只能连接1024个,再多的连接会导致服务器出现“Client connection from [客户端IP] denied access by tcpd.”这样的错误。
按照此文章:Re: [mosquitto-dev] (Help) Access denied tcpd using Mosquitto V1.4.2 going over 1024 connections 上提到的方法,修改了ulimit及mosquitto.conf等,都没有起到效果。后来经高人指点,修改了/etc/systemd/system/mosquitto.service才突破了连接数的限制。
以下是测试过程中目标服务器CPU和内存消耗的变化情况:
连接数 CPU MEM
1000 3.3 0.4
2000 6.3 0.4
3000 8.3 0.4
4000 9.7 0.4
5000 11.3 0.4
6000 12.3 0.4
7000 13.3 0.4
8000 14.6 0.4
9000 15.3 0.4
10000 16.3 0.4
11000 17.6 0.5
12000 18.6 0.5
13000 20.9 0.5
14000 21.3 0.5
15000 22.6 0.6
16000 23.3 0.6
17000 25.9 0.6
18000 26.7 0.6
19000 28.7 0.6
20000 29.9 0.7
因为最大连接数设置为20000,所以测试到两万个连接就没有再继续测试了,但是结论已经可以得出:大概每增加1000个连接,会多消耗1.4%的CPU,0.02%的内存。
服务器的配置如下:
双核,每个处理器都是Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz主频 2499.998MHz,缓存 : 33792 KB。内存:4046316KB(3.86G)。
虽然没有继续测试下去 ,但是大概可以推断,当CPU占用达到50%时(目前其它进程的CPU占用大概15%),可以支持到34000个连接。这样总CPU占用率可以保持在70%左右。
内存占用比较小就不计算了,实际上内存主要是被MONGODB占用。而MONGODB占用内存的量主要是由大表的尺寸决定的(不断累积数据的大表),经验值是每1万条数据会多占用3M的内存。而每个用户平均多产生2300条数据。如果按34000个用户来计算,就需要23G的内存。所以如果按数据库来计算,每4G内存只能支持到6000个用户。不过大表的数据量(每用户2300条)是可以根据程序规则调整的。
再来计算带宽,每个主机每隔1分钟发一次54B的数据到云端,这是数据量最大的部分。也就是平均每秒钟发0.9B。每10000台主机就是8.79K/s。34000个用户也只需要30K/s。加上其它突发性需求(并发在线用户数大时,至少要让每个用户有1K/s的流量),3M的带宽应该足以应付(34000个用户)。初期可以先申请1M的带宽,或者先按流量付费,后期再加。
综上,选择服务器时,初期可以选择一个配置最低的,1核1G内存1M带宽,可以支持1500~17000个用户。(根据内存和CPU分别计算的),因为内存可以调整策略,预计最终能相对稳定支持的用户数量是15000。
如果是2核4G内存3M带宽,可以支持6000~34000个用户。(根据内存和CPU分别计算的),因为内存可以调整策略,预计最终能相对稳定支持的用户数量是30000。