性能测试监控指标及分析调优 | 京东云技术团队

一、哪些因素会成为系统的瓶颈?

1、CPU,如果存在大量的计算,他们会长时间不间断的占用CPU资源,导致其他资源无法争夺到CPU而响应缓慢,从而带来系统性能问题,例如频繁的FullGC,以及多线程造成的上下文频繁的切换,都会导致CPU繁忙,一般情况下CPU使用率<75%比较合适。

2、内存,Java内存一般是通过jvm内存进行分配的,主要是用jvm中堆内存来存储Java创建的对象。内存的读写速度非常快,但是内存空间又是有限的,当内存空间被占满,对象无法回收时,就会导致内存溢出或内存泄漏。

3、磁盘I/O,磁盘的存储空间要比内存存储空间大很多,但是磁盘的读写速度比内存慢,虽然现在引入SSD固态硬盘,但是还是无法跟内存速度相比。

4、网络,带宽的大小,会对传输数据有很大影响,当并发量增加时,网络很容易就会成为瓶颈。

5、异常,Java程序,抛出异常,要对异常进行捕获,这个过程要消耗性能,如果在高并发的情况下,持续进行异常处理,系统的性能会受影响。

6、数据库,数据库的操作一般涉及磁盘I/O的读写,大量的数据库读写操作,会导致磁盘I/O性能瓶颈,进而导致数据库操作延迟。

7、当在并发编程的时候,经常会用多线程操作同一个资源,这个时候为了保证数据的原子性,就要使用到锁,锁的使用会带来上下文切换,从而带来性能开销,在JDK1.6之后新增了偏向锁、自旋锁、轻量级锁、锁粗化、锁消除。

二、哪些指标做为衡量系统的性能

1、RT响应时间,包括如下

1.1 数据库响应时间,即数据库操作的时间

1.2 服务端响应时间,服务端包括Nginx分发的请求所消耗的时间及服务端程序执行所消耗的时间。

1.3 网络响应时间,网络传输,网络硬件需要对传输的请求进行解析所消耗的时间

1.4 客户端响应时间,一般Web、App客户端,消耗时间可以忽略不计,但是如果客户端存在大量的逻辑处理,消耗的时间有能能就会变长。

2、TPS吞吐量

2.1 磁盘吞吐量

IOPS(Input/Output Per Second)每秒的输入输出量,这种是单位时间内系统能处理的I/O请求数量,I/O请求通常为读或写数据操作请求,关注随机读写性能,适用于随机读写频繁的应用,如小文件存储,邮件服务器。 数据吞吐量,这种是单位时间可以传输的数据量,对于大量顺序读写频繁的应用,传输大量连续数据,例如视频编辑。

2.2 网络吞吐量

指网络传输时没有丢帧的情况下,设备能够接受的最大数据速率。网络吞吐量不仅跟带宽有关系,还跟CPU处理能力、网卡、防火墙、以及I/O等紧密联系,吞吐量的大小由网卡的处理能力、内部程序算法以及带宽大小决定。

3、资源使用率

3.1 CPU使用率,首先可以先了解CPU的基本信息,包括物理CPU的个数、单个CPU的核数,然后可以通过命令查看使用率,vmstat、mpstat、top

3.2 内存使用率,free -m、vmstat、top

3.3 磁盘I/O, iostat、 iotop、

3.4 网络I/O,netstat、ifconfig、tcpstat、

三、性能测试注意的问题

1、我们在做性能测试的时候,系统的运行会越来越快,后面的访问速度比我们第一次访问的速度快了好几倍,这是因为Java语言编译的顺序是,.java文件先编译为.class文件,然后通过解释器将.class的字节码转换成本地机器码后,才能运行。为了节约内存和执行效率,代码最初被执行时,解释器会率先解释执行这段代码。随着代码被执行的次数增多,虚拟机发现某个方法或代码运行的特别频繁,就被认定为热点代码(Hot Spot Code)。为了提高热点代码的执行效率,在运行时虚拟机将会通过即时编译器(JIT)把这些代码编译成为本地平台相关的机器码,然后储存在内存中,之后每次运行代码时,直接从内存中获取。这样就会导致第一次系统运行慢,后面访问的速度快几倍。

2、在做性能测试的时候,每次测试处理的数据集都是一样的,但是结果却有差异,这是因为测试时,伴随着很多不稳定因素,比如机器其他进程的影响、网络波动以及每个阶段JVM垃圾回收的不同等。我们可以通过多次测试,将测试结果求平均,只要保证平均值在合理范围之内,并且波动不是很大,这种情况,性能测试就算通过。

四、定位性能问题的时候,可以使用自下而上的策略分析排查

当我们进行压测之后,我们会输出一份性能测试报告,其中包括,RT、TPS、TP99,被压服务器的CPU、内存、I/O,以及JVM的GC频率。通过这些指标可以发现性能瓶颈。我们可以采用自下而上的方式进行分析。

1、首先从操作系统层面,查看系统的CPU、内存、I/O、网络的使用率是否异常,再通过命令查找异常日志,最后通过日志分析,找到导致瓶颈的问原因。

2、还可以从Java应用的JVM层面,查看JVM的垃圾回收频率以及内存分配情况是否存在异常,分析垃圾回收日志,找到导致瓶颈的原因。

3、如果系统和JVM层面都没有出现异常情况,然后可以从应用服务业务层查看是否存在性能瓶颈,例如,Java编程问题,读写数据库瓶颈等。

五、优化性能问题的时候,可以使用自上而下的策略进行优化

整体的调优顺序,我们可以从业务调优到编程调优,最后再到系统调优

1、应用层调优

首先是优化代码,代码问题往往会因为消耗系统资源而暴漏出来,例如代码导致内存溢出,使JVM内存用完,而发生频繁的FullGC,导致CPU偏高。

其次是优化设计,主要是优化业务层和中间件层代码,例如可以采用代理模式,放在频繁调用的创建对象的场景里,共享一个创建对象,减少创建对象的消耗。

再次是优化算法,选择合适的算法降低时间复杂度。

2、中间件调优

MySQL调优

1)、表结构与索引优化。

主要是对数据库设计、表结构设计以及索引设置维度进行的优化,设计表结构的时候,考虑数据库的水平与垂直的拓展能力,提前规划好将来数据量、读写量的增长,规划好分库分表方案。对字段选择合适的数据类型,优先选用较小的数据结构。

2)、SQL语句优化。

主要是对SQL语句进行的优化,使用explain来查看执行计划,来查看是否使用了索引,使用了哪些索引。也可以使用Profile命令分析语句执行过程中各个分步的耗时。

3)、MySQL参数优化。

主要是对MySQL服务的配置进行优化,例如连接数的管理,对索引缓存、查询缓存、排序缓存等各种缓存大小进行优化

4)、硬件及系统配置。

对硬件设备和操作系统设置进行优化,例如调整操作系统参数、禁用swap、增加内存、升级固态硬盘。

3、系统调优

首先是操作系统调优,Linux操作的内核参数设置可以进行调优,已达到提供高性能的目的。
其次,JVM调优,设置合理的JVM内存空间,以及垃圾回收算法来提高性能,例如,如果业务逻辑会创建大对象,我们就可以设置,将大的对象直接放到老年代中,这样可以减少年轻代频发发生YongGC,减少CPU的占用时间。

4、调优的策略

首先是时间换取空间,有的时候系统对查询速度要求不高,对存储空间要求较高,这个时候我们可以考虑用时间换取空间。

其次是空间换取时间,用存储空间提升访问速度,典型的就是MySQL的分库分表策略,MySQL表单数据存储千万以上的时候,读写性能就会下降,这个时候我们可以将数据进行拆分,以达到查询的时候,每个表的数据是少量的,以达到提升性能的目的。

5、兜底策略

系统调优后,仍然还会存在性能问题,这个时候我们需要有兜底策略, 首先是限流,对系统的入口设置最大访问限制,同时采取断熔措施,返回没有成功的请求。 其次是横向扩容,当访问量超过某一个阈值时,系统可以自动横向增加服务。

作者:京东健康 牛金亮

内容来源:京东云开发者社区

本文转载于网络 如有侵权请联系删除

相关文章

  • 在CentOS7上启用和使用firewalld

    正确配置的防火墙是整个系统安全的最重要方面之一。FirewallD是一个完整的防火墙解决方案,可以管理系统的iptables规则并提供D-Bus接口以对其进行操作。从CentOS7开始,FirewallD取代iptables作为默认的防火墙管理工具。在本教程中,我们向你展示如何在CentOS7系统上使用FirewallD设置防火墙,并向你说明基本的FirewallD概念。先决条件在开始本教程之前,请确保你使用具有sudo特权的用户帐户或root用户登录到服务器。最佳实践是以sudo用户而不是root用户身份运行管理命令。如果你的CentOS系统上没有sudo用户,则可以按照这些说明创建一个用户。基本防火墙概念FirewallD使用区域和服务的概念,而不是iptables链和规则。根据你将要配置的区域和服务,你可以控制系统允许或禁止的流量。FirewallD可以使用firewall-cmd命令行实用程序进行配置和管理。防火墙区域区域是预定义的规则集,用于基于计算机所连接的网络上的信任级别来指定应允许的流量。你可以将网络接口和源分配给区域。以下是FirewallD提供的区域,根据区域的信任

  • 509. 斐波那契数

    509.斐波那契数链接 斐波那契数,通常用F(n)表示,形成的序列称为斐波那契数列。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是: F(0)=0,F(1)=1 F(N)=F(N-1)+F(N-2),其中N>1.复制 给定N,计算F(N)。 示例1: 输入:2 输出:1 解释:F(2)=F(1)+F(0)=1+0=1.复制 示例2: 输入:3 输出:2 解释:F(3)=F(2)+F(1)=1+1=2.复制 示例3: 输入:4 输出:3 解释:F(4)=F(3)+F(2)=2+1=3.复制 提示: 0≤N≤30 go语言 funcfib(Nint)int{ ifN==0{ return0 } ifN<=2{ return1 } n1,n2:=1,1//n1为n-1,n2为n-2 fori:=3;i<N;i++{ n1,n2=n1+n2,n1 } returnn1+n2 } funcfib2(nint)int{ ifn==0||n==1{ returnn } dp:=make([]int,n+1) dp[0]=

  • 干货 | 如何做AB实验分流

    作者简介WillWang,携程技术专家,负责AB实验分流和其他数据智能项目的开发。关注大数据和分布式方面,会做一些深入的开发部署和结合业务数据的基准调试工作。一、背景携程是业界比较早进行AB实验的公司。AB实验可以简单认为是传入一个实验号和用户分流ID到AB实验分流器,分流器吐出分流版本A、B、C、D等,通过截取应用流量落地一段时间的分流数据,就可以分析具体版本的优劣,决定启用新版本或者沿用老版本。携程的AB分流器沿用至今,在业务发展上发挥了很大作用,但也存在一些问题。1)携程内部,除了携程App,还有小程序、Online页面等都在用AB实验分流器,这些分流器是不同部门维护的不同接口,导致AB实验人员在开发的时候,有时候会用错,或者经过几轮沟通才能找到适合的分流器接口;2)AB实验分流器在公司越来越多的AB实验应用接入的时候,响应效率不尽人意,没有开始的时候那么好。还有实验新配置的分流规则,在一个访问量大的页面如携程App酒店主页上很难即时生效,有时候要等到凌晨访问量较少时才生效;3)AB实验方法论也需要改进,从而更精确地指导AB实验结论。但AB实验分流器前端接口里直接引用了AB实验配

  • 业务逻辑开发套路的三板斧

    点击上方“码农沉思录”,选择“设为星标”优质文章,及时送达背景作为一个研发,我们工作中都会处理面临下面这些困惑:又加需求,一个方法本来就处理了300行,现在又加50行。状态逻辑太多了,产品第2期又加了一个逻辑,代码结构要调整,很头疼。每个人都在吐槽,业务研发在工作中处理最多的就是ifelse,好不容易写个switch都能给同事吹一周。以上三个场景应该是日常需求迭代优化中面临最多的场景了,作为一个自称编码水平较高的人,总结了以下三个真实的场景,给出一些可选的方案。第一板斧:抽象事件,驱动业务核心梳理产品逻辑中的主流程节点,整理节点所需要的依赖数据已经节点触发后对应的业务逻辑。类比消息队列,也是不同的业务方订阅自己的事件源,进行不同的处理。不同点在于一个是分布式,一个是本文描述单机业务处理场景。实际例子举一个用户注册之后的场景,需要:发短信发优惠券如果用户注册成功之后,直接发了mq消息,那么用户系统和券系统分别订阅这个消息进行处理。不过这里讨论的是在一个项目模块中处理完所有相关的逻辑。代码将在UserRegistered()中一步一步去处理逻辑,之后需求又加入了初始化A数据和初始化B数据两

  • Flink 四种优化Flink应用程序的方法

    Flink是一个复杂的框架,并提供了许多方法来调整其执行。在本文中,我将展示四种不同的方法来提高Flink应用程序的性能。如果你不熟悉Flink,你可以阅读其他介绍性的文章,比如这个,这个和这个。如果你已经熟悉ApacheFlink,本文将帮助你更快地创建应用程序。1.使用Flinktuples当你使用像groupBy,join或keyBy这样的操作时,Flink提供了多种方式在数据集中选择key。你可以使用key选择器函数: //Joinmoviesandratingsdatasets movies.join(ratings) //Usemovieidasakeyinbothcases .where(newKeySelector<Movie,String>(){ @Override publicStringgetKey(Moviem)throwsException{ returnm.getId(); } }) .equalTo(newKeySelector<Rating,String>(){ @Override publicStringgetKey(Ratin

  • 专访图灵奖得主David Patterson:8年前就得知被提名,AI跃迁看好边缘计算

    栗子李根发自清华 量子位报道|公众号QbitAI2017年图灵奖,最终颁给了JohnL.Hennessy和DavidA.Patterson.他们一个是前斯坦福大学校长、现Alphabet董事长,另一个是UC伯克利退休教授,现谷歌TPU项目的科学家。他们因开创性的RISC方法——全称精简指令集计算机(reducedinstructionsetcomputer)而加冕计算机科学领域最高荣誉。而这一次,DavidA.Patterson在荣膺图灵奖后,首次来到中国。在一场清华荣誉博士学位授予和题为《计算机体系结构,下一个黄金时代》的演讲之后,Patterson教授接受了量子位专访。 这位新晋图灵奖得主、一代计算机体系结构宗师、任教UC伯克利40年教授,影响几代工程师的教材《计算机体系结构:量化研究方法》的编写者……向我们分享了更多讲座之外的所思所感。关于图灵奖,关于芯片和软硬件趋势,关于AI瓶颈和跃迁关键,还有科研人才留校or去企业的抉择建议。Patterson教授言无不尽。△DavidA.Patterson教授 图灵奖?“8年前就告诉我被提名了”Patterson教授说,他早在8年前就被剧透

  • Swift 冒泡排序及优化

    冒泡排序是大家都常用的排序方法冒泡排序算法的运作如下:(从后往前)比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。冒泡排序是稳定的排序算法时间复杂度 冒泡排序的最佳时间复杂度为O(n),即初始状态就是排好序的。 冒泡排序的最坏时间复杂复杂度为O(n2),即初始状态就是逆序的。 冒泡排序的平均时间复杂复杂度为O(n2)根据这个原理代码如下://冒泡排序 funcbubbleSort(_nums:inout[Int]){ letn=nums.count foriin0..<n{ forjin0..<(n-1-i){ ifnums[j]>nums[j+1]{ nums.swapAt(j,j+1) } } } } //使用 varnums=[1,3,6,9,0,5,2,4,8,7] bubbleSort(&nums) print(nums) //[0,

  • PHP如何通过编程在服务端验证以太坊签名

    以太坊有一个非常强大的JavaScript生态系统。有一些很棒的开源项目,比如ethereumjs-util,它提供了一个用以太坊帐户签名的即插即用功能。JavaScript的一个缺点是,在许多领域,它带来了安全问题。一个这样的安全风险是显而易见,这是由于我努力在EthTools.com上实现持久性认证(仍然是一个正在进行的被警告了的工作)。利用开源项目(如ethereumjs-util)来签署任意的数据消息是相当容易的。然而,不容易的是告诉服务器有人已经成功地验证了某帐号的所有权。当然这也不是绝对正确的,你也可以很容易做到这一点。简单地构建一个简单的API端点,并在成功认证后向其发出请求。真正的问题是,创建一个“假”请求并将其发送到上述(易于识别-只需在控制台中查看)端点非常容易。我可以轻松发出请求,说我已经验证了任何帐户的所有权。凭借尖端技术……特别是处理“真实价值”的技术,尤其重要的是安全性体现出了它应有的重要性并被重视,特别是在历史上出现各种被利用的攻击的情况下。而且即使是在初期,以太坊也吸引了最优秀的人——那些知道在做什么的人。如果有安全漏洞,有人会找到它。现在。。虽然可以确

  • nw.js如何处理拖放操作

    nw.js如何处理拖放操作其实拖放(drag-drop)操作是Html5的功能,不是nw.js的内置API,那么我们采用Html5应用一般的处理方法就可以了。首先我们看一下一个正常的页面,直接拖放一个文件过来的效果。页面代码:<html><head><title>拖放测试</title></head><bodystyle="background-color:rgba(0,0,0,0);"><pid="output"><h1>拖放测试</h1></p><script></script></body></html>如下图:下面我们拖拽一张图片过来。nw.js会按照chrome浏览器默认处理文件的方式来处理拖放的文件,能显示的会直接显示,不能显示的会变成资源下载。这肯定不是桌面应用想要的效果,那么Html5是如何处理拖放的呢?1.1如何禁用拖放操作在Html元素上,我们可以通过ondra

  • MySQL:由USE DB堵塞故障引发的思考

    遇到故障,我们往往想的是如何解决这个故障,而不是从故障的根本去思考出现这个故障的原因?这样的结果,只能使我们得到了鱼,失去了渔。今天,我们就来分享一个由USEDB堵塞故障引发的思考案例。故障描述今天一个朋友遇到数据库遇到一个严重的故障,故障环境如下:MYSQL5.6.16RR隔离级别GITD关闭表现如下:usedb不能进入数据库showtablestatus不能查询到表信息schema.processlist来看有大量的Waitingfortablemetadatalock情急之下他杀掉了一大堆线程后发现还是不能恢复,最后杀掉了一个没有及时提交的事物才恢复正常。也仅仅留下了如下图的一个截图:故障信息提取还是回到上图,我们可以归纳一下语句类型如下:1、CREATETABLEAASSELECTB 其STATE为sendingdata 2、DROPTABLEA 其STATE为Waitingfortablemetadatalock 3、SELECT*FROMA 其STATE为Waitingfortablemetadatalock 4、SHOWTABLESTATUS[like

  • Elasticsearch 滚动查询请求

    在Elasticsearch中,一次查询只能得到一次独立的结果,在分页中这是很不方便的。当用Elasticsearch进行第n页查询的时候,Elasticsearch在内部查询了从开始到n页的所有数据,只是在返回的时候抛弃了前面n-1页的内容。这样对查询大量数据的时候是非常不方便的。但Elasticsearch提供了滚动API来解决此问题   为了使用scroll,在第一次搜索请求的查询中指定scroll参数,它告诉Elasticsearch需要保持搜索的上下文多长时间。例如: GEThttp://x:9200/20001_event/_search?scroll=1m&pretty= Body类型:application/json { "size":20, "query":{ "match":{ "person_id":"6042" } }, "sort":[ "_doc" ] }复制 保持时间的参数如下所示:□y——年□M——月□w——周□d——天□h——小时□m——分钟□s——秒 返回值中包含一个scroll_id,可将这个ID传递给scrollAPI来搜索

  • Mac系统升级至OS X Mavericks后Genymotion出现的问题及解决方法

    Apple的系统升级终于免费了,可开心满满地升级到OSXMavericks后,Android模拟器之王Genymotion罢工了。遇到两个问题:1.UnabletoloadVirtualBoxEngine;2.解决问题1后,又会遇到模拟器上下颠倒的问题(状态栏跑到最下面去了)本文提供了这两个问题的解决方法。 Android开发周刊: http://www.mobiletuts.me   问题1:UnabletoloadVirtualBoxEngine 解决方案:升级VirtualBox至4.3.2版VirtualBox4.3.2forOSXhosts  下载链接: 问题2:好容易升级了VirtualBox,打开Genymotion后模拟器画面上下颠倒 对于这个问题,Genymotion的开发人员是这么解释的:使用Intel集成显卡的用户在升级至Mavericks后会遇到该问题,而使用独立显卡的(比如使用NvidiaGPU的MBPRetina)就不存在该问题。   http://stackoverflow.com/questions

  • UIImageView、UISlider、UISwitch、UIStepper、UISegmentControl

    UIImageView——图像视图 作用:专门用来显示图片的控件 1.设置图像 [self.imageViewsetImage:[UIImageimageNamed:@"abc.png"]]; 2.设置显示模式 设置图片居中显示,并且保持原来宽高比 imageView.contentMode= UIViewContentModeScaleAspectFit;复制 扩充:UIImageView的序列帧动画 UIImageView可以让一系列的图片在特定的时间内按顺序显示 属性说明: animationImages:要显示的一组图片序列 animationDuration:完整地显示所有图片所需的时间 animationRepeatCount:动画的执行次数(默认为0,代表无限循环) 相关方法: -(void)startAnimating;开始动画 -(void)stopAnimating;停止动画 -(BOOL)isAnimating;是否正在运行动画复制     UISlider——滑块控件 作用:用来显示进度值,并且可以手动修改进度值 1.基本

  • 发言模板

    问题: 我 CSS 你 CSS   博客园:冷色008 百度:冷色008

  • JS瀑布流布局

    好久没有更新博客喽,今天来说一个瀑布流布局。 瀑布流在很多网站已有很多,现在只说一下简单的实现原理吧, 1、计算一行可以排放几个元素 2、建立一个数组用于存放第一行的每个元素的高度。 3、得到数组中的最少值和索引 4、设置第二行的第一个元素的TOP值为数组中的最小值,同时设置它的LEFT值为第一行索引元素的LEFT值 5、将数组为索引值的元素设置为(第四条中的top值加它的高度)   效果如下图: 代码如下: <!DOCTYPEhtml> <html> <headlang="en"> <metacharset="UTF-8"> <title></title> <style> *{ margin:0; padding:0; } #main{ position:relative; } .box{ padding:15px0015px; float:left; } .pic{ padding:10px; border:1pxsolid#ccc; border-radius:5px; box

  • Servlet工作原理生命周期

    Servlet 4.1简介 Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。 使用Servlet就可以实现,根据不同的登录用户在页面上动态显示不同内容。 Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet 介绍完Servlet是什么以后,接下来我们就按照快速入门->执行流程->生命周期->体系结构->urlPattern配置->XML配置的学习步骤,一步步完成对Servlet的知识学习,首选我们来通过一个入门案例来快速把Servlet用起来。 4.2快速入门 需求分析:编写一个Servlet类,并使用IDEA中Tomcat插件进行部署,最终通过浏览器访问所编写的Servlet程序。 具体的实现步骤为: 创建Web项目web-demo,导入Servlet依赖坐标 <dependency> <groupId>javax.servlet</groupId> <ar

  • Orange

      相册 广场 游戏 登录 注册 关注此空间   hoo'sspace       2010-04-0521:33 《Orange’s一个操作系统的实现》实验笔记 生成软盘镜像文件a.img的方法 Windows平台 1.      使用WinHex软件,新建大小为1474560bytes的文件,然后保存。 2.      使用WinImage软件,新建大小为1.44MB的文件,然后保存,注意,保存的类型为“所有文件(*,*)”,文件名为“a.img”。 Linux平台 1.      使用dd命令:ddif=/dev/zero   of=a.imgbs=512count=2880 Windows和linux如果安装了borchs虚拟机,则还可以通过bximage命令

  • 喜欢听的歌

    lalaloveonmymind. WhiteFlag

  • Navicat破解方法【很靠谱】

    感谢博主的分享【笔芯】:https://blog.csdn.net/a599174211/article/details/82795658

  • JAVA 线上故障排查全套路

    线上故障主要会包括CPU、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top三连,然后依次jstack、jmap伺候,具体问题具体分析即可。 CPU 一般来讲我们首先会排查CPU方面的问题。CPU异常往往还是比较好定位的。原因包括业务逻辑问题(死循环)、频繁gc以及上下文切换过多。而最常见的往往是业务逻辑(或者框架逻辑)导致的,可以使用jstack来分析对应的堆栈情况。 使用jstack分析CPU问题 我们先用ps命令找到对应进程的pid(如果你有好几个目标进程,可以先用top看一下哪个占用比较高)。 接着用top-H-ppid来找到CPU使用率比较高的一些线程 然后将占用最高的pid转换为16进制printf'%x\n'pid得到nid 接着直接在jstack中找到相应的堆栈信息jstackpid|grep'nid'-C5–color 可以看到我们已经找到了nid为0x42的堆栈信息,接着只要仔细分析一番即可。 当然更常

  • leetcode786. 第 K 个最小的素数分数(优先队列)

    链接:https://leetcode-cn.com/problems/k-th-smallest-prime-fraction/ 题目 给你一个按递增顺序排序的数组arr和一个整数k。数组arr由1和若干素数 组成,且其中所有整数互不相同。 对于每对满足0<i<j<arr.length的i和j,可以得到分数arr[i]/arr[j]。 那么第 k 个最小的分数是多少呢? 以长度为2的整数数组返回你的答案,这里 answer[0]==arr[i] 且 answer[1]==arr[j]。 用例 示例1: 输入:arr=[1,2,3,5],k=3 输出:[2,5] 解释:已构造好的分数,排序后如下所示: 1/5,1/3,2/5,1/2,3/5,2/3 很明显第三个最小的分数是2/5 示例2: 输入:arr=[1,7],k=1 输出:[1,7]   提示: 2<=arr.length<=1000 1<=arr[i]<=3*104 arr[0]==1 arr[i]是一个素

相关推荐

推荐阅读