你有没有好奇过,一台服务器大概能提供多少性能?我的应用需要多大的服务器配置才能满足用户的正常使用?我们在项目开始前,预估的服务器成本到底如何计算?
先说结论
在1核2G的服务器下,纯文本JSON返回的API的QPS大概在4.1W到4.5W之间,已经能提供不错的性能了。
| connections | QPS | Latency Stdev | 性能百分数 |
|---|---|---|---|
| 10 | 41372.66 | 84.82us | 91.0% |
| 20 | 43069.24 | 126.34us | 94.7% |
| 30 | 43021.34 | 168.49us | 94.6% |
| 40 | 43285.94 | 189.24us | 95.2% |
| 50 | 45467.67 | 187.15us | 100% |
如果是使用Guava、Caffeine这类基于内存的缓存库,那么会和这个数据差不多。如果使用Redis作为缓存,那么也能有这个数据80%以上的性能。如果API涉及到查询数据库的情况,那么请参考我之前的文章。当然如果你使用的是Spring Boot的话,建议找一台机器进行一轮压测试一下。
其实在使用之前,进行一轮简单业务的压测是很有必要的,有助于你对陌生框架的了解,毕竟就算是业务代码再怎么优化,也不可能突破框架的上限。
举个不恰当的例子,同配置的服务器下,如果Spring Boot的一个返回Hello World的API的QPS是1500,那么你的业务API也基本都会在1500以下的。
之前我们使用腾讯的TSF框架、Dubbo框架、Grpc之类的,都要先进行一轮压测,摸清上限。
之前也写过关于性能方面的一些文章,大家可以作为参考。
- 如果想对
压测指标的含义有了解,可以参考文章 压测指标怎么看?教你如何衡量你的服务性能 - 如果想对
JVM和Native下的压测结果有了解,可以查阅文章Quarkus Native模式下的性能对比(6)🔥 - 如果想知道写入和读取
DB数据库的压测结果,可以查阅文章Quarkus的Insert&Select数据库性能(5)🔥
服务器指标
如何查看服务器的CPU
可以使用下面的命令查询服务器的CPU配置
cat /proc/cpuinfo
查询结果大致如下,主要关注频率、核心数等等
如何查看服务器的内存
可以使用下面的命令查询服务器的内存配置
cat /proc/cpuinfo
查询结果大致如下,主要关注内存大小等等
当然也可以使用下面命令查看内存的使用情况
free -m
结果如下
我的服务器指标
| 服务器 | 指标 |
|---|---|
| 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
看结果,我们的程序正常运行中
选择压测工具
因为只是简单的压测,我选择了熟悉的压测工具wrk。wrk的基本用法可以通过命令行进行查询
开始压测
我们压测按照梯度进行不断增加,观察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左右,在内网环境下的表现是很不错的。