对于线上系统调优,它本身是个技术活,不仅需要很强的技术实战能力,很强的问题定位,问题识别,问题排查能力,还需要很丰富的调优能力。

本篇文章从实战角度,从问题识别,问题定位,问题分析,提出解决方案,实施解决方案,监控调优后的解决方案和调优后的观察等角度来与大家一起交流分享本次线上高并发调优整个闭环过程。

一 项目简要情况概述

该项目为基于SSM架构的商城类单体架构项目,其中有一个秒杀重磅模块,如下为当前线上环境的简要架构部署图,大致描述一下:

(1)项目为SSM架构

(2)服务器类别:1台负载均衡服务器(F5),3台运用程序服务器,1台计时器服务器,1台redis服务器,1台图片服服务器和1台基于Pass架构的Mysql主从服务器(微软云)

(3)调用逻辑:下图为简要调用逻辑

二 何为单体架构项目

从架构发展角度,软件项目经历了如下阶段的发展:

1.单体架构:可理解为传统的前后端未分离的架构

2.垂直架构:可理解为前后端分离架构

3.SOA架构:可理解为按服务类别,业务流量,服务间依赖关系等服务化的架构,如以前的单体架构ERP项目,划分为订单服务,采购服务,物料服务和销售服务等

4 微服务:可理解为一个个小型的项目,如之前的ERP大型项目,划分为订单服务(订单项目),采购服务(采购项目),物料服务(物料项目)和销售服务(销售项目),以及服务之间调用

三 本SSM项目引发的线上问题

问题一:当秒杀的时候,cpu暴增。

该系统每天秒杀分为三个时间端:10点,13点和20点,如下为秒杀的简要页面

图1

图2

图3

2.单台运用服务器cpu

3.单台运用服务器请求数

4.rdis连接数(info clients)

这个未保存截图,记得是600左右

connected_clients:600

5.mysql请求截图

四 排查过程及分析

(一)排查思路。

根据服务部署和项目架构,从如下几个方面排查:

(1)运用服务器:排查内存,cpu,请求数等;

(2)文件图片服务器:排查内存,cpu,请求数等;

(3)计时器服务器:排查内存,cpu,请求数等;

(4)redis服务器:排查内存,cpu,连接数等;

(5)db服务器:排查内存,cpu,连接数等;

(二)排查过程

在秒杀后30分钟内,

1.运用程序服务器cpu暴增,内存暴增,造成cpu和内存暴增的根本原因是请求数过高,单台运用服务器达到3000多;

2.redis请求超时

3.jdbc连接超时

4.通过gc查看,发现24小时内,FullGC发生了152次

5.再看看堆栈,发现有一些线程阻塞和死锁

jstat -l pid,也可以通过VisualVM分析

6.发现有2000多个线程请求无效资源

(三)造成本次系统异常主要因素分析

(1)在秒杀时,请求量过高,导致运用服务器负载过高;

(2)redis连接池满,获取不到连接,connot get a connection from thread pool

(3)jdbc连接池满,获取不到连接和超时

(4)存在大对象代码,如向list集合中不停添加对象,不能及时回收对象导致内存增加,频繁发生Full GC

(5)tomcat并发参数,jvm优化参数,jedis配置参数,jdbc配置参数不合理

(6)未对请求量进行削峰和限流

(7)资源连接未及时释放,如redis连接,jdbc连接未及时释放

五 最终解决方案

1.增加运用服务,做流量削峰和分流

由于该项目未增加MQ,因此只能采用硬负载,增加服务器水平扩展方式来实现流量削峰和流量分流

2.优化jvm参数,如下为本次优化后的参数

JAVA_OPTS="-server -Xmx9g -Xms9g -Xmn3g -Xss500k -XX:+DisableExplicitGC -XX:MetaspaceSize=2048m -XX:MaxMetaspaceSize=2048m -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Dfile.encoding=UTF8 -Duser.timezone=GMT+08"

关于这个jvm参数的优化,jvm理论是怎样的,官方建议是怎样的,实战是怎样的,将在下篇文章中分析。

3.优化tomcat并发相关参数

主要是两方面:

(1)修改bio协议为nio2 (2)根据服务器配置,业务场景,业务流量等合理设置相关参数,尽量达到最优

关于tomcat相关参数优化,在接下来的文章中分析。

4.redis 和jdbc参数优化

由于涉及到安全性问题,这里不列出

5.代码优化

(1)优化掉大对象

(2)优化未及时释放的对象和连接资源

6.解决000多个线程请求无效资源问题

在conf/context.xml增大缓存

cachingAllowed = "true"

cacheMaxSize = "102400"

/>

六 最终优化结果

经过几天观察,系统平稳

1.基本监控

2.GC

3.抽样器cou和内存

cpu

内存

七 总结

1.本篇文章从实战角度,从问题识别,问题定位,问题分析,提出解决方案,实施解决方案,监控调优后的解决方案和调优后的观察等角度来与大家一起交流分享本次线上高并发调优整个闭环过程,当然,由于篇幅的限制,

有些细节和优化手段未在本篇文章中提及;

2.虽然解决了该问题,但是从长远来看,该单体项目任然存在很大的问题和隐患,下面随便举几个:

(1)前后端紧耦合,未分离

(2)由于该系统秒杀业务属于非持续性并发,即局部性并发,当前并未做局部并发架构的调整

(3)由于该系统秒杀业务与该项目紧紧耦合在一起,未进行隔离,未独立成单独模块,未单独部署,从而存在因秒杀业务造成整个系统瘫痪的风险;

(4)未做流量削峰和流量限流,如加mq等软手段;

(5)redis未做高可用集群

觉得不错,别忘了随手点赞+转发哦!

java商城并发_一次线上商城系统高并发优化,涨姿势了~相关推荐

  1. java计算机毕业设计古惠农产品线上销售系统源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计古惠农产品线上销售系统源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计古惠农产品线上销售系统源码+mysql数据库+系统+lw文档+部署 本源码技术栈: 项目 ...

  2. 多商户商城源码,搭建线上商城,满足用户多种需求

    电子商务是伴随信息经济而发展起来的,20世纪90年代兴起于美国.欧洲等发达国家,我们可以将其理解为在开放的互联网环境下,运用服务器实现消费者的网上购物.企业间商业交易等,大家常说的B2B(企业与企业间 ...

  3. 微信 日志服务器 并发大,微信高性能线上日志系统xlog剖析

    微信高性能线上日志系统xlog剖析 做移动开发的同学经常会遇到一个头疼的问题,就是当用户反馈一些问题,又比较冷僻难以复现的时候(不是Crash),常常就会陷入一筹莫展的境地.因此,很多人就研发了相关的 ...

  4. python异步高并发_通过python异步通讯方式构建高并发压力测试工具

    背景说明 在工作中,要对一个接口进行压测,我当时就想通过python自己编写一个压力发生器. 初步方案(单线程循环发送) 通过循环向服务端发送请求,代码如下: #采用单步循环的方式循环测试 impor ...

  5. java 线程僵死_一次线上jboss僵死问题分析

    问题再现: 个人中心在上周四上线(2012.9.13)第一次上线,由于种种缘由,遗留了部分低级别的BUG,后于次日修复,下午4时再次上线. 当日晚上8点,运维发现user-web 五台服务器中四台jb ...

  6. python访问数据库如何解决高并发_使用 Python 和 Oracle 数据库实现高并发性

    随着趋势发展的核心转向更多而不是更快发展,最大限度地提高并发性的重要性日益凸显.并发性使得编程模式发生了新的转变,可以编写异步代码,从而将多个任务分散到一组线程或进程中并行工作.如果您不是编程新手并且 ...

  7. 线上商城做活动,页面氛围布置不能少

    一个商城系统要做营销,该从哪些方面入手营造商城活动氛围,对于线上商城系统来说,除了营销的价格氛围,另一个重要的氛围就是视觉氛围,能让人第一眼注意到,并产生兴趣,这就迈出了营销的关键一步.所以,线上商城 ...

  8. 现在很多的企业都有自己的线上商城,那该怎么运营企业自己的线上商城呢?

    线上商城建立不难,但是线上商城运营起来却并不简单,据统计越有五成的企业建立了自己的线上商城,但有效进行线上商城运营的企业不到一成,因此如何有效的进行线上商城运营是许多企业面临的难题. 一般来说要做好线 ...

  9. 「newbee-mall新蜂商城开源啦」SpringBoot+MyBatis开发JavaWeb线上商城项目

    我的想法很简单,就是做一个大家都能运行的商城项目,而不是缺胳膊少腿的项目,不求有多么完善,也不求有多少技术栈,我目前的想法就是大家都可以运行它.使用它,至于完善它嘛,给我点时间哈. 本项目开源地址: ...

最新文章

  1. Java Socket实战之一:单线程通信
  2. java B2B2C源码电子商务平台-基于Consul的分布式锁实现
  3. 注解@NotNull/@NotEmpty/@NotBlank
  4. oracle 9i 手工建库,简单记录Oracle 9i数据库手工建库过程
  5. c语言实现socket转json,C++解析JSON进行网络传输--一个通过JSON方式的socket传输
  6. 深入理解Tomcat系列之一:系统架构(转)
  7. linux中更改用户密码_如何在Linux中更改用户密码
  8. layui框架和vue哪个好_小颖的前端框架
  9. marlab中主成分得分怎么求_线性回归中多重共线性处理——主成分分析法
  10. c语言一维高斯滤波器,高斯滤波简介,高斯滤波性质及应用
  11. 高频功率放大器的设计实现
  12. 想自学PLC编程该按什么步骤来?
  13. 预测科技未来发展趋势的10个定律
  14. 成为Lowe‘s劳氏供应商的条件
  15. 【Trick】调优方法warmup
  16. 用request获取请求地址Ip
  17. 用spss进行数据的标准化处理_什么是数据标准化、中心化、归一化?SPSS又如何实现?...
  18. jquery $.fn 是什么意思
  19. 计算机视觉之边缘提取
  20. 以太坊:快速入门 Truffle

热门文章

  1. SQL返回受影响行数
  2. 3721软件测试,3721A-3721A电子负载│亚锐直流电子负载
  3. SSM实现的进销存系统源码
  4. VM报错Before you can run VMware several modules must be compiled and loaded into the running kernel
  5. 如何利用Python网络爬虫抓取微信朋友圈的动态
  6. Vue Router:vue中实现前端路由
  7. 星载InSAR技术在地质灾害监测领域的应用
  8. R语言 PCA 主成分分析
  9. 百度糯米 php 面试题,百度糯米php笔试题.doc
  10. 开源医疗软件国外实践及其在中国推进探讨