springboot内嵌Tomcat性能测试


测试目标

首先要明确测试目标,测试目标包含并发用户数、并发时间、需要到达的tps和成功率。包含以下两个场景

  1. 稳定性:1000并发用户数,12小时,tps1000以上,响应成功率100%
  2. 峰值:1000并发用户数,10分钟,tps5000以上,响应成功率100%

以稳定性为例,生产环境4个进程需要达到1000tps,则每个进程需要250tps,生产环境按测试环境50%计算,那么测试环境压测单进程需要达到500tps。

影响TPS因素

  1. 服务器的资源:CPU(资源、使用率)、内存(资源、使用率)、磁盘性能(写日志)

  2. 网络带宽(大量传输数据场景需要考虑):单位时间内传递的数据包太大,超过带宽的传输能力,间接造成服务器处理请求数量达不到上限

  3. 数据库配置:如果请求数据需要写入数据库,且需要写入多个表的时候,如果数据库的最大连接数不够,或者没有主从分离、读写分离等,就会导致数据库事务处理过慢,影响到TPS。

  4. 连接池: 连接池中可用连接数量不够,一般分为服务器连接池(比如Tomcat)和数据库连接池(或者理解为最大允许连接数也行)

  5. 应用限制:JVM内存,最大请求数,最大监听队列,最大线程数

  6. 通信连接机制:串行、并行、长连接、管道连接等不同连接方式

  7. 业务逻辑处理方式:同步、异步(内存、消息中心)

  8. 压力机:单机压测,分布式多机压测

    测试方式

  9. 通过本机Jemter对服务器进行并发的测试(测试结果需要考虑本机的限制)。

  10. 通过压测部门,多台机器进行并发测试。

    测试过程

  11. 选择空闲服务器部署需要压测的服务,如果并发要求比较高,可以增加服务器资源(CPU和内存),打开服务器限制(进程最大读取fd数,最大监听队列,系统fd总打开数)。

    # 打开进程最大文件数(open files)限制。
    # 设置单进程打开fd限制(用户)
    vim /etc/security/limits.conf # 追加: 
    *  hard  nofile    65535
    *  soft  nofile    65535
    以上配置为推荐值
    # 全局fd打开限制
    vim /etc/sysctl.conf
    fs.file-max = 2000000 # 系统最大能打开的fd数
    fs.nr_open = 2000000  # 单一进程能打开的fd数
    以上配置为推荐值
    #注意:设置nofile的hard limit还有一点要注意的就是hard limit不能大于/proc/sys/fs/nr_open, 假如hard limit大于nr_open,注销后将无法正常登录。
    # tcp 相关队列
    net.ipv4.tcp_max_syn_backlog = 8192 # tcp半连接队列(握手用)
    以上配置为推荐值
    # 监听队列,
    操作系统和服务配置的最小值,下列配置监听队列实际为20
    操作系统设置1024: net.core.somaxconn = 1024 
    以上配置为推荐值
    服务20:new ServerSocket(9090,20),tomcat默认值100
    tomcat推荐值(默认值)100(100) nginx推荐值(默认值)512(512)
  1. 配置应用相关的参数
    # 最大连接数 推荐值(默认值)8192(8192)
    server.tomcat.max-connections=8192
    # tomcat监听队列 受到操作系统最大监听队列的约束
    # 推荐值(默认值)100(100)
    server.tomcat.accept-count=100
    # 业务线程数
    # 推荐值(默认值)根据内存和cpu资源调整 (200)
    server.tomcat.max-threads=200
  2. 部署和配置性能监控相关的工具,springboot admin监控,prometheus监控。

压测过程中需要关注以下指标

cpu使用率:目标接近90%

内存使用率:使用接近JVM分配内存,JVM内存分配后需要给操作系统和其他服务预留一定资源

JVM gc情况:gc耗时

JVM线程状态:是否有很时间等待和死锁

磁盘IO:大量读写时需要关注

网络IO:大量数据传输时需要关注

  1. 进行压测,并发量未达到目标可能存在的情况。
    1.报错:根据报错日志分析
    2.应用挂了:一般先考虑内存泄漏
    3.服务器负载满但没有达到期望并发:扩CPU和内存
    4.服务器负载较低:考虑io和死锁的问题,io情况下可以根据数据库的负载,调大处理线程和连接池
  2. 参考配置

数据库连接数:(10-10)根据需要调整

tomcat线程数:默认200,一般够用

JVM内存:2G

异步线程池大小:推荐小于20

gc方式:4G以下 默认PSPO 4G以上G1

性能参考

服务器 JVM内存 并发用户 压测时间 TPS 网络(Mbps) CPU 内存
2C 4G 2G 1000 12小时 1500 95 80% 50%
4C 8G 4G 1000 12小时 1700 95 70% 50%

评论