✅1核2G的服务器大概能提供多少的QPS?

1,064 阅读4分钟

你有没有好奇过,一台服务器大概能提供多少性能?我的应用需要多大的服务器配置才能满足用户的正常使用?我们在项目开始前,预估的服务器成本到底如何计算?

先说结论

1核2G的服务器下,纯文本JSON返回的APIQPS大概在4.1W4.5W之间,已经能提供不错的性能了。

connectionsQPSLatency Stdev性能百分数
1041372.6684.82us91.0%
2043069.24126.34us94.7%
3043021.34168.49us94.6%
4043285.94189.24us95.2%
5045467.67187.15us100%

如果是使用Guava、Caffeine这类基于内存的缓存库,那么会和这个数据差不多。如果使用Redis作为缓存,那么也能有这个数据80%以上的性能。如果API涉及到查询数据库的情况,那么请参考我之前的文章。当然如果你使用的是Spring Boot的话,建议找一台机器进行一轮压测试一下。

其实在使用之前,进行一轮简单业务的压测是很有必要的,有助于你对陌生框架的了解,毕竟就算是业务代码再怎么优化,也不可能突破框架的上限。

举个不恰当的例子,同配置的服务器下,如果Spring Boot的一个返回Hello World的API的QPS是1500,那么你的业务API也基本都会在1500以下的。

之前我们使用腾讯的TSF框架、Dubbo框架、Grpc之类的,都要先进行一轮压测,摸清上限。

之前也写过关于性能方面的一些文章,大家可以作为参考。

服务器指标

如何查看服务器的CPU

可以使用下面的命令查询服务器的CPU配置

cat /proc/cpuinfo

查询结果大致如下,主要关注频率核心数等等

image.png

如何查看服务器的内存

可以使用下面的命令查询服务器的内存配置

cat /proc/cpuinfo

查询结果大致如下,主要关注内存大小等等

image.png

当然也可以使用下面命令查看内存的使用情况

free -m

结果如下

image.png

我的服务器指标

服务器指标
CPU主频2595.122
CPU数量1
内存大小1846480 kB (约2G)

这是一台1核2G的服务器,CPU是AMD的,主频不高。

部署服务

部署一个简单的Java程序用于压测

我编写了一个简单的程序,返回一个JSON格式的字符串,代码逻辑类似于

    router.get("/hello").handler(context ->
      context.response()
        .putHeader("content-type", "application/json; charset=utf-8")
        .end(JsonObject.of("key", "hello, 地球").encode())
    );

打包后的Jar名字是draw-world-1.0.0-SNAPSHOT-fat.jar,启动后,我们可以用下面命令行看到这个程序。

ps -ef|grep java

看结果,我们的程序正常运行中

image.png

选择压测工具

因为只是简单的压测,我选择了熟悉的压测工具wrk。wrk的基本用法可以通过命令行进行查询

image.png

开始压测

我们压测按照梯度进行不断增加,观察API的性能瓶颈,分别使用10、20、30、40、50个链接进行压测,压测时间是1分钟。

10个链接

./wrk -c10 -d1m http://127.0.0.1:18888/hello

1分钟过去了,结果如下

Running 1m test @ http://127.0.0.1:18888/hello
  2 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   241.00us   84.82us   6.36ms   94.64%
    Req/Sec    20.80k     1.90k   23.41k    79.50%
  2482504 requests in 1.00m, 258.06MB read
Requests/sec:  41372.66
Transfer/sec:      4.30MB

20个链接

./wrk -c20 -d1m http://127.0.0.1:18888/hello

又1分钟过去了,结果如下

Running 1m test @ http://127.0.0.1:18888/hello
  2 threads and 20 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   464.06us  126.34us  11.49ms   93.57%
    Req/Sec    21.66k     1.85k   44.71k    87.43%
  2588465 requests in 1.00m, 269.07MB read
Requests/sec:  43069.24
Transfer/sec:      4.48MB

30个链接

./wrk -c30 -d1m http://127.0.0.1:18888/hello

又又1分钟过去了,结果如下

Running 1m test @ http://127.0.0.1:18888/hello
  2 threads and 30 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   698.48us  168.49us   7.93ms   92.20%
    Req/Sec    21.62k     1.81k   24.41k    80.92%
  2581724 requests in 1.00m, 268.37MB read
Requests/sec:  43021.34
Transfer/sec:      4.47MB

40个链接

./wrk -c40 -d1m http://127.0.0.1:18888/hello

又又又1分钟过去了,结果如下

Running 1m test @ http://127.0.0.1:18888/hello
  2 threads and 40 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     0.92ms  189.24us   7.71ms   87.94%
    Req/Sec    21.75k     1.94k   24.44k    76.50%
  2597414 requests in 1.00m, 270.00MB read
Requests/sec:  43285.94
Transfer/sec:      4.50MB

50个链接

./wrk -c50 -d1m http://127.0.0.1:18888/hello

又又又又1分钟过去了,结果如下

Running 1m test @ http://127.0.0.1:18888/hello
  2 threads and 50 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.10ms  187.15us   7.66ms   88.87%
    Req/Sec    22.85k     1.86k   24.98k    88.50%
  2728446 requests in 1.00m, 283.62MB read
Requests/sec:  45467.67
Transfer/sec:      4.73MB

QPS大致是在4w-4.5w左右,在内网环境下的表现是很不错的。