之前几篇文章对cat进行了简介、安装部署、代码埋点,今天分享一下如何利用cat帮助我们做接口优化。

为什么要接口性能优化?

1.用户体验差:接口访问速度慢、如果一个页面打开需要好几秒,用户可能在页面没有完全打开时,就关掉页面离开了,造成用户流失,通过性能优化,减少服务器响应时长,可提高用户体验,较少用户的流失。

2.雪崩效应:接口访问速度慢,会带来雪崩效应,在微服务时代,一个功能页面可能需要调用多个服务接口,如果某一个接口响应速度慢,会导致调用这个接口的服务也变得很慢,最后会导致所有的服务整体变慢。

什么样的接口值得优化?

1.调用频繁且调用时间长的接口,值得优化。接口a被调用10000次,平均调用时长500ms,接口b被调用10次,平均调用时长3秒。优化接口a,假设从500ms优化到300ms,每一次节省200ms,总体优化时长是200万毫秒。优化接口b,即使从3秒优化到100ms,总体优化时长也只有29000毫秒。碰到这种情况建议优化接口a,性价比更高,更值得优化。

2.调用次数少,但每次调用都异常(如超时无返回),这样的接口也必须优化。

如何使用cat定位需要优化的接口?

1.挑选性价比高的接口(Transaction)

如上图选择的是cache-service应用,CacheService.mutliExecute调用最频繁,调用72万次,调用时长也比较多,可以作为被优化的接口。

2.通过条件筛选,提供Long-url、Long sql、Long sevice、Long call筛选条件,可以自行组合,调整时间长度。(Promblem)

3.调用出错,必须要修改处理(promblem)

接口如何优化?

1.查看调用链,定位哪个方法调用时间长

通过上图,发现接口存在循环调用,优化方案:调用批量操作接口,减少接口调用次数。

2.慢sql优化方法

第一步:explain查看sql执行计划,确认sql是否走索引。

第二步:确认数据库表是否建立索引,如果没有索引,创建合适的索引,保持最左原则。

第三步:如果存在索引,没有索引,分析其中原因

第四步:如果sql走了索引,依然很慢,缓存中间结果(异构一张中间表或者将结果缓存到redis中)

具体优化例子:

1.查询库存接口,数据库表存在索引,而没有使用到索引,是因为数据库表属性类型是varchar,sql中使用了in,然而传参的时候使用的是数值类型,导致发生了数据类型转换,导致没有走索引。优化方案,修改传参类型,使用字符串进行传参,优化之后从300ms降低到60ms。(如果数据库中是数值类型,参数使用字符串类型,即便发生了类型转换,依然可以走索引,很奇怪)。sql中使用in,作为多条件查询,有时候能走索引,有时候不能走索引,当in中只有1个值的时候,一定会走索引,当in中查询的结果,达到所有记录的一定比例的时候,不会走索引。

2.大表分页优化,定时任务,需要对大表分页查询,可以使用子查询的方式进行优化。举例:商品表100万条记录,需要每天定时更新商品的销量。一般做法使用多线程,每个线程处理200条数据

select * from item limit 900000,200

越往后执行,时间会越长,因为mysql需要定位前90万条记录,之后再取出后面的200条数据,因为没有走索引,所以会比较慢。

优化方案一:利用子查询

select * from item i,(select id from item limit 900000,200) as g where g.id = i.id

因为可以走索引,而且子查询使用到了覆盖索引,不需要进行第二次查询,可以提高查询速度。

优化方案二:主键Id区间法

前提条件表结构中存在自增长主键。取出表的最小值和最大值,将这两个值进行分段,每个线程处理一个区间。这样查询可以利用主键索引。

select * from item where id in (1,2,3,4,5,..200)

3.Jvm优化

查询库存优化之后,走了索引之后,的确快了很多,通过cat发现,库存服务有两个应用实例,有一个实例接口非常快,一个很慢,通过cat的Heartbeat发现慢的那台机器存在full gc,每隔一段时间就发生一次fullgc。

查看jvm的Gc命令

jstat -gcutil pid 2000

如果存在大量的YGC可以通过jmap命令定位哪些对象创建的多,然后进行代码优化,尽量减少对象的创建。或者调整jvm参数,增加Eden区的大小。如果存在大量的fullGC这种情况要引起注意,因为一次fullGC会消耗时间比较长,严重影响性能,需要调整jvm参数。

jmap -histo pid | grep com.galaxy(包路径)

top命令查看cpu,内存等使用情况

top

cpu使用过高优化方案

首先显示线程列表:

ps -mp pid -o THREAD,tid,time

找到了耗时最高的线程28802,占用CPU时间快两个小时了!

其次将需要的线程ID转换为16进制格式:

printf "%x" tid

最后打印线程的堆栈信息:

jstack pid |grep tid -A 30

无法获取数据库连接

可能是因为数据库在执行修改表结构造成了锁表

select * from information_schema.processlist where db = 'item' and state like '%lock%'

需要对查出来的进程进行kill掉。可以通过命令

kill 进程Id

获取redis连接失败,可能存在某些地方没有释放连接,可通过jstack命令进行定位

jstack –l pid > jstack.txt

下载jstack.txt进行分析,搜索Lock关键词,可以方便定位问题。最好的方法,对连接的操作,进行统一的封装,不留给开发人员犯错的机会。

遇到问题不可怕,可怕的是同样的问题重复犯。将开发过程中遇到的问题,记录下来,总结定期复盘,可避免重犯同样的错误。吃一堑,长一智,特此记录下来和大家分享,希望对你有所帮助。

接口监控_java应用监控之利用cat接口性能优化,每一次都是血的教训相关推荐

  1. java 文件监控_Java 文件监控,实时监控文件加载

    前段时间设计一个文件自动加载系统模块,功能就像是在Tomcat的webapps目录下发布war包那样,只要一有war包加载进来,tomcat立刻就会去解压这个war包,并把它挂载在tomcat上,供网 ...

  2. 一个类可以实现多个接口吗_Java入门:基础知识(面向对象:接口)

    接着上一篇的基础知识,今天俺们来学习一下: 面向对象 (万物皆对象) 三大特征(封装.继承.多态) 接口 接口 概述:接口是一种引用数据类型,是方法的'集合',接口的内部主要是定义方法,包含常量.抽象 ...

  3. JAVA调用SAP接口地址_Java以webservice方式调用SAP接口传输数据

    Java以webservice方式调用SAP接口传输数据,在SAP中生成 会计凭证/冲销会计凭证 1.生成会计凭证(已完成) 2.冲销会计凭证(以下教程截图以该接口为例) Java调用sap的webs ...

  4. java tomcat 监控_java程序监控tomcat实现项目宕机自动重启并发送邮件提醒

    最近由于老项目频繁挂掉,由于项目经过多批人之手,短时间难以定位问题,所以只好写一个监控程序. 时间比较紧半天时间,而且水平有限大神勿喷,有好的方法还请赐教. 1.问题描述:分两种情况1.1.tomca ...

  5. java接口配置文件_Java读取property配置文件,另接口的配置

    为了程序容易修改,不用把接口的的信息放在程序里面,如果是那样,接口的端口改变就会造成很麻烦,所以把它写在配置文件properties中 1.新建一个配置文件property  如:test.prope ...

  6. java ini文件_java应用监控之prometheus、node export、grafana安装和配置

    为了与时俱进,介绍基于docker的安装部署,如果想用非docker化部署,可以参考官网教程 对于docker的安装,在cat安装部署已经介绍过了,这里就不再重复了,如果还有不清楚的可以点击这里 do ...

  7. 利用IDocHostUIHandler接口屏蔽WebBrowser的弹出菜单

    简单说两句:大致就是实现IDocHostUIHandler接口,挂接IDocHostUIHandler接口可以利用ICustomDoc接口或IOleObject接口实现,这里演示了利用ICustomD ...

  8. App首屏接口性能优化

    目前所在项目组开发的是一款母婴产品,集工具和社区属性.截止本文发布,注册用户接近7000万,首屏接口日访问量过百万.在首屏中,会给用户展现不同的数据,比如每日任务,宝宝(婴儿)每日概述,胎教音乐,运动 ...

  9. mybatis接口中的方法重载_MyBatis的Mapper接口以及Example的实例函数及详解

    一.mapper接口中的方法解析 mapper接口中的函数及方法 方法 功能说明 int countByExample(UserExample example) thorws SQLException ...

最新文章

  1. kalivm 虚拟机访问win文件夹_利用vmware搭建属于自己的win虚拟环境
  2. 关于枚举,enum、Enum、EnumSet、RegularEnumSet、JumboEnumSet
  3. linux中export与source的作用
  4. CENTOS7配置静态IP后无法ping通外部网络的问题
  5. ORM框架-工具-产品开发之四 开发代码生成器 Template Studio Development (一)
  6. nodejs 保存html文件路径,nodejs如何将获得的数据保存到本地?
  7. java dot画图_小O的图案 (Java代码)(最简单的解法)
  8. 对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数(Java)
  9. 基于库函数STM32流水灯的实现
  10. Hadoop阅读笔记(一)——强大的MapReduce
  11. 3.1 Zend_Db_Adapter
  12. 近期看到AlphaGo算法最清晰的解读
  13. Qt实战案例(18)——Qt位置相关函数汇总实例
  14. Word 中自动设置匹配章、节序号的标题
  15. 1.计算机领域的安全世界观
  16. Bert:Pre-training of Deep Bidirectional Transformers forLanguage Understanding
  17. 简单制作视频画面水平镜像播放特效
  18. php 7.1 国内下载地址,PHP下载|PHP for windowsV7.1.4官方版
  19. MySQL 闪回原理与实战
  20. 2.2 线性微分方程与常数变易法

热门文章

  1. 浅谈PHP语音里的流程控制及实现方法
  2. 一会儿花雨停了的飞鸽传书
  3. P8U8 最中听的话,不要做每件事都考虑太多。
  4. 我的飞鸽传书程序,很好!!!
  5. 飞鸽传书文件传输实现原理
  6. Windows函数错误处理
  7. 如何零基础开始自学Python编程,值得一看!
  8. 为什么中国开发不出流行的操作系统和编程语言呢?
  9. 程序员过端午的正确姿势,一般人看不懂
  10. Git的安装与使用教程