零零好车代码层面优化系统开发性能应该怎么做?

我们以前看到的很多架构变迁或者演进方面的文章大多都是针对架构方面的介绍,很少有针对代码级别的性能优化介绍。本文将针对一些代码细节方面的东西进行介绍,欢迎大家吐槽以及提建议。服务器环境

  • 服务器配置:4 核 CPU,8G 内存,共 4 台
  • MQ:RabbitMQ
  • 数据库:DB2
  • SOA 框架:公司内部封装的 Dubbo
  • 缓存框架:Redis、Memcached
  • 统一配置管理系统:公司内部开发的系统
  • 系统开发谢天华 135-0148-8501

问题描述

  1. 单台 40TPS,加到 4 台服务器能到 60TPS,扩展性几乎没有。
  2. 在实际生产环境中,经常出现数据库死锁导致整个服务中断不可用。
  3. 数据库事务乱用,导致事务占用时间太长。
  4. 在实际生产环境中,服务器经常出现内存溢出和 CPU 时间被占满。
  5. 程序开发的过程中,考虑不全面,容错很差,经常因为一个小 bug 而导致服务不可用。
  6. 程序中没有打印关键日志,或者打印了日志,信息却是无用信息没有任何参考价值。
  7. 配置信息和变动不大的信息依然会从数据库中频繁读取,导致数据库 IO 很大。
  8. 项目拆分不彻底,一个 Tomcat 中会布署多个项目 WAR 包。
  9. 因为基础平台的 bug,或者功能缺陷导致程序可用性降低。
  10. 程序接口中没有限流策略,导致很多 VIP 商户直接拿我们的生产环境进行压测,直接影响真正的服务可用性。
  11. 没有故障降级策略,项目出了问题后解决的时间较长,或者直接粗暴的回滚项目,但是不一定能解决问题。
  12. 我们针对线上的环境进行模拟,尽量真实的在测试环境中再现,采用数据库连接池为咱们默认的 C3P0。

    那么当压测到二万批,100 个用户同时访问的时候,并发量突然降为零!报错如下:

    com.yeepay.g3.utils.common.exception.YeepayRuntimeException: Could not get JDBC Connection; nested exception is java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.

    那么针对以上错误跟踪 C3P0 源码,以及在网上搜索资料发现 C3P0 在大并发下表现的性能不佳。

    线程池使用不当引起

    以上代码的场景是每一次并发请求过来,都会创建一个线程,将 DUMP 日志导出进行分析发现,项目中启动了一万多个线程,而且每个线程都极为忙碌,彻底将资源耗尽。

    那么问题到底在哪里呢???就在这一行!

    private static final ExecutorService executorService = Executors.newCachedThreadPool();

    在并发的情况下,无限制的申请线程资源造成性能严重下降,在图表中显抛物线形状的元凶就是它!!!那么采用这种方式最大可以产生多少个线程呢??答案是:Integer 的最大值!看如下源码:

    那么尝试修改成如下代码:

    private static final ExecutorService executorService = Executors.newFixedThreadPool(50);

时间: 2024-10-10 19:13:20

零零好车代码层面优化系统开发性能应该怎么做?的相关文章

C6000代码层面优化(一)

2014年8月7日,看了一片很长见识的博文,关于DSP如何优化的,有一个问题没有搞通,“百度”一下关键字,居然搜查了一模一样的博文N片,现在也搞不懂这篇博文的原创作者是谁了.反正我感觉直接转摘过去,要是消化不掉,也没啥意思,所以我把我可以理解消化的就先记录下来吧. 一.双重循环或多重循环在保证功能的前提下,减少嵌套循环的层数,原因有二个,如下: 1)优化器优化时只在最内层循环中形成一个 pipeline,这样循环语句就不能充分利用C6 的软件流水线,而且对于内部循环的次数较少的情况,消耗在 pr

车智汇分销系统开发价格

车智汇系统平台角色解析:车智汇系统开发卢先生[l36可微→3lO6电→l7l4]车智汇APP开发.系统开发,车智汇平台系统开发.车智汇系统开发.车智汇模式系统开发.车智会系统定制开发.车智汇消费返利系统开发,车智汇分销系统开发. 重视"人".即以消费者为核心,围绕消费者需求做文章,且具有可识别,可到达,可交互的特性.通过多渠道.多触点与消费者产生持续互动,把握核心消费人群的消费习惯.生活方式及潜在消费需求 提供"货".即注重提供专业化的商品服务,且单品可见,库存可见

从代码层面优化系统性能应该怎么做?

我们以前看到的很多架构变迁或者演进方面的文章大多都是针对架构方面的介绍,很少有针对代码级别的性能优化介绍.本文将针对一些代码细节方面的东西进行介绍. 服务器环境 服务器配置:4 核 CPU,8G 内存,共 4 台 MQ:RabbitMQ 数据库:DB2 SOA 框架:公司内部封装的 Dubbo 缓存框架:Redis.Memcached 统一配置管理系统:公司内部开发的系统 问题描述 单台 40TPS,加到 4 台服务器能到 60TPS,扩展性几乎没有. 在实际生产环境中,经常出现数据库死锁导致整

火爆的车享家模式系统开发详解

车享家是一个关于用车的全方位平台!上线至今都十分火热,盈利能力也强,通过结合"高效线上运营"和"优质线下服务",全方位打通汽车"看.选.买.用.卖",简单来看,是淘宝+o2o的联合体.目前汽车市场蓬勃发展,汽车保有量突破1.8亿,市场基数大,中国大面积进入汽车脱保阶段,该类车主面临重新选择,移动互联网时代到来,民众对互联网接受程度更高,优质信息更容易传播:使得这一类产品极有可能成为下一个风口.那么该如何开发这一一款产品呢?微电=175-2043*

系统开发完之后要做的一些事情

很多人都会开发系统,但运营好一个系统却非常的难. 重点的几个方面 1.对象:用户信息管理,你存储的用户信息越完善,用户的粘度就越大,把用户的手机,地址及用户与用户之间的关系(重点)要完善,有了这些信息做活动就再也不用担心了. 2.主力:不断完善用户的主要访问内容,网站吸引用户最大的内容是什么?如何去完善,如何提高用户吸引力.怎么去扩展,你开发一个东西,是否有利有弊.譬如我开发一个用户购买记录,这个用户购买记录对于价格高,销量少,会不会有影响. 3.辅助:配合一些活动,如签到,小游戏,积分奖励,吸

什么是系统开发 有钱还APP开发需要哪些知识

系统开发,对于外行来说,有钱还app系统开发找吴燕:156微2227电7887:有钱还众筹系统开发案例,有钱还众筹软件开发,就是坐在电脑面前不停的敲代码,但是对于内行来说,虽然还是坐在电脑面前敲代码,但是系统开发的程序语言差距是很大的,就好比做PHP的和做Java的就完全不一样的程序内容.什么是系统开发?系统开发需要哪些知识? | 什么是系统开发 系统开发包括两种,软件系统开发和硬件系统开发. 软件系统开发,信息系统开发.应用软件系统开发等等,这类是以编写代码进行开发.软件系统是指由系统软件.支

Hive架构层面优化之四 常用复杂/低效的统计从源上给出,以避免上层作业过多计算

案例一:trackinfo,基础表处理常用的低性能UDF 背景描述:日志信息10分钟加载一次到实时日志表trackreal中(按小时分区),为了保证实时性,在加载的过程中并没有做任何的过滤处理,加载到trackreal表后再过滤非法数据.爬虫数据等,生成按天增量日志表trackinfo,然后根据不同的page_type来统计流量. 解决方案如下: select '首页', count(*) pv, #每条记录就是一条pv count(distinct session_id) uv #根据sess

Python学习笔记_零零一:Python基本介绍

Python介绍 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构.Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节.类似于PHP和Perl语言.Python 是交互式语言: 这意味着,您可以在一个Python提示符,直接互动执行写你的程序.Python 是面向对象语言: 这意味着Python支持面向对象的风格或代码封装

java代码效率优化

[转载于http://blog.163.com/user_zhaopeng/blog/static/16602270820122105731329/] 1. 尽量指定类的final修饰符 带有final修饰符的类是不可派生的. 如果指定一个类为final,则该类所有的方法都是final.Java编译器会寻找机会内联(inline)所有的 final方法(这和具体的编译器实现有关).此举能够使性能平均提高50% . 2. 尽量重用对象. 特别是String 对象的使用中,出现字符串连接情况时应用S