第3章 云端部署 性能压测

[TOC]

私有部署

就是本地的私有化部署,在本机上调试程序,运行成功在本地打包部署云端。

操作系统及运行环境

数据库

应用程序

项目云端部署

操作系统及运行环境

阿里云centos虚拟机(ECS服务器)

数据库

本地备份

mysqldump -uroot -pxxh171015 --databases miaoshaproject >~/Downloads/miaosha.sql

会在 /Downloads 目录下生成 miaosha.sql

上传到服务器上

scp ~/Downloads/miaosha.sql hpms@202.117.35.221:/home/hpms/xxh009

在服务器端恢复

cd ~
mysql -uroot -p123456 <xxh009/miaosha.sql

应用程序

maven打包

<plugin>
          <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
mvn clean package

应用程序的jar上传到服务器

scp miaosha-1.0-SNAPSHOT.jar  hpms@202.117.35.221:/home/hpms/xxh009

外挂配置文件

加载项目外的application.properties

在项目目录下,新建application.properties文件

vi application.properties

项目目录下运行:

java -jar miaosha-1.0-SNAPSHOT.jar --spring.config.addition-location=application.properties

编写deploy脚本启动

##编写脚本
vi deploy.sh
##运行脚本前赋权限
chmod -R 777 *
##运行脚本
./deploy.sh &

如何关闭

##查看应用该端口的程序,显示的是这个端口号那个进程在使用
lsof -i:$PORT
##关掉对应的应用程序
sudo kill -9 PID

jmeter性能压测

线程组

Http请求

查看结果树

聚合报告

如何发现系统瓶颈问题

发现容量问题

server端并发线程数上不去

hpms@hpms-1:~/xxh009/miaosha$ ps -ef | grep java
hpms     17623 17622  4 20:59 pts/13   00:00:45 java -Xms400m -Xmx400m -XX:NewSize=200m -XX:MaxNewSize=200m -jar miaosha.jar --spring.config.addition-location=~/xxh009/miaosha/application.properties
hpms     17914 15396  0 21:15 pts/13   00:00:00 grep --color=auto java
##可以看17623这个进程上面对应有多少个线程
hpms@hpms-1:~/xxh009/miaosha$ pstree -p 17623
java(17623)─┬─{java}(17624)
            ├─{java}(17625)
            ├─{java}(17626)
            ├─{java}(17627)
            ├─{java}(17628)
            ├─{java}(17629)
            ├─{java}(17630)
            ├─{java}(17631)
            ├─{java}(17632)
            ├─{java}(17633)
            ├─{java}(17634)
            ├─{java}(17635)
            ├─{java}(17636)
            ├─{java}(17637)
            ├─{java}(17638)
            ├─{java}(17639)
            ├─{java}(17640)
            ├─{java}(17641)
            ├─{java}(17642)
            ├─{java}(17643)
            ├─{java}(17644)
            ├─{java}(17645)
            ├─{java}(17646)
            ├─{java}(17647)
            ├─{java}(17648)
            ├─{java}(17649)
            ├─{java}(17650)
            ├─{java}(17651)
            ├─{java}(17652)
            ├─{java}(17653)
            ├─{java}(17654)
            ├─{java}(17655)
            ├─{java}(17660)
            ├─{java}(17661)
            ├─{java}(17662)
            ├─{java}(17663)
            ├─{java}(17664)
            ├─{java}(17665)
            ├─{java}(17666)
            ├─{java}(17667)
            ├─{java}(17668)
            ├─{java}(17669)
            ├─{java}(17670)
            ├─{java}(17671)
            ├─{java}(17672)
            ├─{java}(17673)
            ├─{java}(17674)
            ├─{java}(17675)
            ├─{java}(17676)
            ├─{java}(17682)
            ├─{java}(17683)
            └─{java}(17684)
##tomcat服务器在没有丝毫压力的情况下内部维护了52个线程
hpms@hpms-1:~/xxh009/miaosha$ pstree -p 17623 | wc -l
52

查看SpringBoot配置

spring-configuration-metadata.json文件下

{
      "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties$Tomcat",
      "defaultValue": 100,
      "name": "server.tomcat.accept-count",
      "description": "Maximum queue length for incoming connection requests when all possible request processing threads are in use.",
      "type": "java.lang.Integer"
    },
  {
    "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties$Tomcat",
      "defaultValue": 10000,
      "name": "server.tomcat.max-connections",
      "description": "Maximum number of connections that the server accepts and processes at any given time. Once the limit has been reached, the operating system may still accept connections based on the \"acceptCount\" property.",
      "type": "java.lang.Integer"
    },
{
      "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties$Tomcat",
      "defaultValue": 200,
      "name": "server.tomcat.max-threads",
      "description": "Maximum number of worker threads.",
      "type": "java.lang.Integer"
    },
{
      "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties$Tomcat",
      "defaultValue": 10,
      "name": "server.tomcat.min-spare-threads",
      "description": "Minimum number of worker threads.",
      "type": "java.lang.Integer"
    }

查看各个节点的配置

server.tomcat.accept-count:等待队列长度,默认100
server.tomcat.max-connections:最大可被连接数,默认10000
server.tomcat.max-threads:最大工作线程数,默认200
server.tomcat.min-spare-threads:最小工作线程数,默认10

默认配置下,连接超过 10000 后出现拒绝连接情况
默认配置下,并发的请求数量超过 200(max-threads)+ 100(accept-count)后拒绝处理

当对应的所有的工作线程全部用完后,tomcat会将之后的请求丢到 accept-count 这个等待队列中,当等待队列还被塞满,对应的请求会被拒绝

修改配置

4核8G内存tomcat的最大线程数是:800

hpms@hpms-1:~/xxh009/miaosha$ cat application.properties
server.port=8080
server.tomcat.accept-count=1000
server.tomcat.max-threads=800
server.tomcat.min-spare-threads=100

再次查看java进程PID

hpms@hpms-1:~/xxh009/miaosha$ ps -ef |grep java
hpms     18945 18944 92 22:18 pts/13   00:00:39 java -Xms400m -Xmx400m -XX:NewSize=200m -XX:MaxNewSize=200m -jar miaosha.jar --spring.config.addition-location=~/xxh009/miaosha/application.properties
hpms@hpms-1:~/xxh009/miaosha$ pstree -p 18945|wc -l
139

上面我们可以看到是52

当再次压测时

线程数:2000
Rame-up时间:10
循环次数:100

此时

服务端

hpms@hpms-1:~/xxh009/miaosha$ pstree -p 18945|wc -l
842

定制化内嵌Tomcat开发

关注参数:

keepAliveTimeOut:多少毫秒后不响应断开keepalive

maxKeepAliveRequests:多少次请求后keepalive断开失效

使用WebServerFactoryCustomizer< ConfigurableServletWebServer >定制化内嵌tomc配置

响应时间变长 TPS上不去

单Web容器上限

线程数量: 4核CPU 8G内存单进程调度线程数800-1000以上,后即花费巨大的时间CPU调度上

等待队列的长度:队列做缓冲池,但也不能无限长,消耗内存,出入队也耗CPU

MySql数据库QPS容量问题

主键查询:千万级别数据=1-10毫秒

唯一索引查询:千万级别数据=10-100毫秒

非唯一索引查询:千万级别数据=100-1000毫秒

无索引:百万级别数据=1000毫秒+ (全表扫描)

MySql数据库TPS容量问题

非插入更新删除操作:同查询

插入操作:1W~10w tps


   转载规则


《第3章 云端部署 性能压测》 徐兴华 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
第4章 分布式扩展 第4章 分布式扩展
[TOC] 本章目标 nginx反向代理负载均衡 分布式会话管理 使用redis实现分布式会话存储 单机部署结构: #nginx反向代理负载均衡 单机容量问题,水平扩展表象:单机cpu使用率增高,memory占用增加,网络带宽使用增
2019-06-16
下一篇 
第2章 秒杀项目框架回顾 第2章 秒杀项目框架回顾
秒杀系统的框架 层与层之间的交互方式 Data Obiect和Domain Model比如我们需要刻画的用户, 在业务层的Domain Model中UserModel的属性 private Integer id; @NotBla
2019-06-12
  目录
I I