Java电商秒杀系统性能优化(二)——云端部署,性能压测【从本地调试到云端上线的必经之路】

释放双眼,带上耳机,听听看~!

云端部署,性能压测

  • 云端部署流程

  • 1、 云端部署硬件功能

    • 2、云端部署java环境
    • 3、云端部署MySQL数据库环境
    • 4、云端部署应用服务研发环境
  • 性能压测,发现并发容量问题

  • jmeter性能压测

    • 发现容量问题
  • Tomcat性能优化

  • Tomcat的作用

    • Tomcat默认内嵌配置
    • Tomcat调优
  • 发现容量问题

在云端的部署秒杀项目的方案及云端部署的意义,引入了jmeter压测工具完成了性能的摸底测试,发现容器等基础配置的性能瓶颈并进行性能优化;

云端部署流程


1、 云端部署硬件功能

  • 去阿里云或者腾讯云注册一个账号;
  • 购买ecs服务器,学生有价格优惠,可以选择包月或者按需选择;

2、云端部署java环境

  • 从oracle官网下载1.8rpm安装包并上传到服务器;
  • 适用rpm -ivh ***.rpm安装jdk

3、云端部署MySQL数据库环境


1
2
3
4
5
6
7
8
9
1 1. yum install mysql* yum install mariadb-server  //安装mysql;
2 2. systemctl start mariadb.service //启动mysql
3 3. mysqldadmin -u root password   //修改root的密码
4 4. mysql -uroot -ppassword  //连接mysql
5 5. mysqldump -uroot -proot -databases miaosha> miaosha.sql 备份数据库
6 6. 上传数据文件到服务器上
7 7. mysql -uroot  -proot < miaosha.sql 恢复数据文件
8
9

4、云端部署应用服务研发环境

  1. 本地在项目根目录下适用mvn clean package打包生成miaosh.jar文件;

  2. 将jar包服务上传到服务端并编写额外的application.propertities配置文件;

  3. 编写deploy.sh脚本启动对应的项目;


1
2
3
1nohup java -Xms2048m -Xmx2048m -XX:NewSize=1024m -XX:MaxNewSize=1024m -jar miaosha.jar -sping.config.addtitionlocation=/var/www/miaosha/application.properties
2
3
  1. 使用deploy.sh&启动应用程序;
  2. 打开阿里云的网络安全组配置,将80端口开放给外网可以使用;

参数说明:
java: java命令启动,设置JVM的初始大小和最大内存为2048m,2个G,设置JVM中初始新生代和最大新生代大小为1024m,设置成一样的目的是为了减少扩展jvm内存池过程中向操作系统索要分配的消耗;

性能压测,发现并发容量问题


jmeter性能压测

采用jmeter进性能压测, KeepAlive采用长连接,向服务端发送请求之后,希望服务端不要立刻断开连接,而是等待复用连接;

  • 线程组(组装线程池)

启动多个线程,并发测试服务端的压力;
线程组参数: 线程数:100/ Ramp-Up时间:10/循环次数:10

  • Http请求 右键线程组添加HTTP请求,协议http
  • 查看结果树,右键监听器,查看结果树;
  • 聚合报告

发现容量问题

在安装完jmeter之后,对项目进行性能压测,发现server端的并发线程数上不去;
采用 pstree -p 进程号|wc -l 查看线程数;采用top -H查看机器性能;

Tomcat性能优化


Tomcat的作用

Tomcat是一个轻量级应用服务器,是支持运行Servlet/JSP应用程序的容器,运行在jvm上,绑定IP地址并监听TCP端口;运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;

在做web项目时多数需要http协议,基于请求和响应,servlet就是在服务器端运行的java程序,通过配置文件拦截你的请求,并进行相应处理,然后展示给你相应界面;Tomcat就可以创建servlet,去运行web项目,相当于一个应用服务器,作为serlet的容器;

Tomcat的调用过程

  • tomcat要能够同时接收多个客户端发来的请求,那么就需要多线程;
  • tomcat想要调用servlet就是得到这个servlet对象和类所在地址的映射关系;
  • tomcat本身并不知道客户端会访问哪一个servlet,所以tomcat必须要能够动态的去调用servlet对象,那么就需要用到java的反射机制;
  • 定位到具体的servlet并调用get或post方法并响应客户端;

Tomcat默认内嵌配置


打开Springboot项目中,双击shift,搜索spring-configuration-metadata.json文件,可以查看各个节点的配置;

tomcat默认参数是为开发环境制定,而非适合生产环境,尤其是内存和线程的配置,默认都很低,容易成为性能瓶颈;

  • server.tomcat.accept-count:等待队列长度。默认100;
  • server.tomcat.max-connections:最大可被连接数,默认10000
  • server.tomcat.max-threads:最大工作线程数,默认200
  • server.tomcat.min-spare-threads:最小线程数,默认10
  • 默认配置下,连接超过10000后出现拒绝连接情况;
  • 默认配置下,触发的请求超过200+100后拒绝处理;

定制化内嵌Tomcat开发

  • keepAliveTimeOut:多少毫秒后不响应的断开keepalive(设置在服务端上)
  • maxKeepAliveRequests:多少次请求后keepalive断开失效
  • 使用WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>定制化内嵌tomcat配置

Tomcat调优

  1. 优化连接配置.这里以tomcat7的参数配置为例,需要修改conf/server.xml文件,修改连接数,关闭客户端dns查询


1
2
3
4
5
6
7
8
9
10
11
12
1&lt;Connector port=&quot;8080&quot;
2protocol=&quot;org.apache.coyote.http11.Http11NioProtocol&quot;
3connectionTimeout=&quot;20000&quot;
4redirectPort=&quot;8443&quot;
5maxThreads=&quot;500&quot;
6minSpareThreads=&quot;20&quot;
7acceptCount=&quot;100&quot;
8disableUploadTimeout=&quot;true&quot;
9enableLookups=&quot;false&quot;
10URIEncoding=&quot;UTF-8&quot; /&gt;
11
12
  1. 利用缓存和压缩

对于静态页面最好是能够缓存起来,这样就不必每次从磁盘上读。这里我们采用了 Nginx 作为缓存服务器,将图片、css、js 文件都进行了缓存,有效的减少了后端 tomcat 的访问。

可以用 gzip 压缩,其实很多图片也可以用图像处理工具预先进行压缩,找到一个平衡点可以让画质损失很小而文件可以减小很多;

  • 采用集群,实现横向扩展,那么组建 tomcat 集群是有效提升性能;

内存调优:设置JVM的一些参数
-Xmx3550m -最大可用内存;
-Xms3550m -JVM促使内存为3550m;
-Xmn2g 年轻代大小为2G;
-Xss128k -设置每个线程的堆栈大小;
-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)设置为4,则年轻代与年老代所占比值为1:4;
-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4;
-XX:MaxPermSize=16m:设置持久代大小为16m;
-XX:MaxTenuringThreshold=0:设置垃圾最大年龄;

发现容量问题

响应时间长,TPS也上不去;

  • 单个Web容器有上限

线程数量:4核cpu 8G内存单进程调度线程数800-1000以上后即花费巨大的时间在cpu调度上;
等待队列长度:队列做缓冲池用,但也不能无限长,消耗内存,出队入队也耗cpu;

  • Mysql数据库QPS容量问题

主键查询:千万级别数据 1-10毫秒
唯一索引查询:千万级别数据=10-100毫秒
非唯一索引查询:千万级别数据=100-1000毫秒
无索引:百万条数据=1000毫秒+

  • Mysql数据库TPS容量问题

给TA打赏
共{{data.count}}人
人已打赏
安全技术

详解Node.js API系列 Crypto加密模块

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索