avatar

聚焦Java性能优化 打造亿级流量秒杀系统【学习笔记】02_云端部署

云端部署

我自己在前一段时间因为疫情原因白嫖了一波阿里云的服务器,美滋滋,想着把博客部署到云端上,现在项目也要发表到云端,就写一下配置方案吧

3.3 操作系统及运行环境

阿里ECS 云服务器 学生机的配置是 2GB CPU + 4GB 内存 操作系统 Ubuntu 18.04 64位,配置环境Jdk+mysql+tomcat(详见另一篇文章带你搞定阿里云Ubuntu版本配置Java环境JDK+MySQL+Tomcat)

3.4 数据库部署

数据库Linux指令:

  • 下载安装 : sudo apt install mariadb-server
  • 查看状态:sudo systemctl status mysql
  • 启动:sudo systemctl restart mysql

安装Mariadb数据库

将miaosha表备份,上传到服务器

mysql -uroot -psxy123 < ~/tmp/miaosha.sql

3.5 打包上传

maven打包上传

可以使用IDEA自带的maven打包可执行jar包,生成如下的文件夹:

执行java -jar miaosha-1.0-SNAPSHOT.jar

发现缺少springboot maven打包的plugin,添加到pom.xml

1
2
3
4
<plugin>          		
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

再启动maven工具生成jar,发现多了一个.jar.orgin文件,上传miaosha-1.0-SNAPSHOT.jar包到服务器

mkdir www //新建一个www目录

pwd 查询当前目录

mv /目录1 /目录2 移动目录1的文件到目录2下

chmod -R 777 * 给这个文件夹授予读写和可执行权限

tail -f nohup.out 查看运行日志

ps -ef | grep java 查看当前运行的java进程(包含进程号)

netstat -anp | grep 1302 查看进程号为1302的端口号

netstat -lntp 查看开放端口号

3.6 编写deploy脚本

编写deploy脚本,实现自动打包上传并java执行的操作。

服务端springboot配置文件application.properties里面的配置可能随着设备环境不同而变化,每次直接修改源码又很复杂,可以采用外挂配置文件的方法。

  1. 在项目目录下新建 vim application.properties外挂配置文件,修改文件,指定服务器端口server.port = 80
  2. 执行 java -jar miaosha.jar --spring.config.addition-location=/var/www/miaosha/application.properties
  3. 新建deploy.sh文件,编辑nohup指令,设置最大/最小堆栈为400m,JVM新生代200m,最大新生代大小200m,指定额外配置文件
1
2
nohup java -Xms400m -Xmx400m -XX:NewSize=200m -XX:MaxNewSize=200m -jar miaosha.jar
--spring.config.addition-location=/var/www/miaosha/application.properties
  1. 后台方式启动应用程序 ./deploy.sh & 避免关闭控制台,应用程序关闭的风险。输出nohup.out文件

3.7 压测工具Jmeter

  • 线程组
  • Http请求
  • 查看结果树
  • 聚合报告

下载Jmeter安装包,进入bin文件夹下,启动jmeter.sh

3.8 并发容量问题

Linux命令:

pstree - p 进程号 查看进程下的所有线程

pstree -p 进程号 | wc - l 统计进程下的线程数

ps -ef | grep java 查看正在进行的线程

top H 查看cpu进程情况

查看SpringBoot配置

  • spring-configuration-metadata.json文件下
  • 查看各个节点的配置

server.tomcat.accept-count :等待队列长度,默认100

server.tomcat.max-connections:最大可被连接数,默认10000

server.tomcat.max-threads:最大工作线程数,默认200

server.tomcat.min-spare-threads:最小工作线程数,默认10

默认配置下,连接超过10000后出现拒绝连接情况

默认配置下,触发的请求超过200(工作线程)+100(等待队列)后拒绝处理

3.9 定制化内嵌tomcat开放

tomcat保持KeepAlive的好处是:可以不用每次进行耗时的http请求断开和连接的操作,只用传输数据;而坏处就是:若连接空闲造成资源的浪费并且容易成为黑客攻击的对象。

所以定制化内嵌Tomcat成为需求,我们需要关注两个参数:

  • keepAliveTimeOut:多少毫秒后不响应的断开keepalive
  • maxKeepAliveRequests:多少次请求后keepalive断开失效

使用WebServerFactoryCustomizer<ConfigurableServletWeb ServerFactory>定制内嵌tomcat配置

3.10 另一个容量问题

响应时间变长,TPS上不去

单Web容量上限

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

MySQL数据库QPS容量问题

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

MySql数据库TPS容量问题

  • 非插入更新删除操作:同查询
  • 插入操作:1w~10w tps (依赖配置优化,后续)
文章作者: SkironYong
文章链接: https://skironyong.github.io/SkironYong.github.io/posts/b5dce66b.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 SkironYong
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论