01 | 如何制定性能调优标准?
该思维导图由 AI 生成,仅供参考
为什么要做性能调优?
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了如何制定Java应用的性能调优标准,强调了性能调优的重要性和实施方法。文章首先指出了没有经过性能测试的产品可能存在潜在问题,因此需要制定性能调优标准。在介入性能调优方面,建议在项目开发初期不过于在意性能优化,而是在代码层面保证有效的编码。接着,文章列举了体现系统性能的参考因素,包括CPU、内存、磁盘I/O、网络、异常、数据库和锁竞争,并介绍了衡量系统性能的重要指标——响应时间。此外,还详细讨论了吞吐量、计算机资源分配使用率和负载承受能力等性能指标。最后,作者分享了在实际项目中对系统性能的要求和如何进行系统性能测试的经验,并提出了思考题,引发读者对其他衡量系统性能的指标的思考。整篇文章通过实例和技术原理深入浅出地解释了性能调优的重要性和实施方法,对于Java应用的性能调优具有一定的指导意义。
《Java 性能调优实战》,新⼈⾸单¥59
全部留言(77)
- 最新
- 精选
- 杨军首先很高兴终于有人开Java性能优化的课程,我在工作中需要接触很多这方面的工作,希望通过学习这次课程能带来更多收获。 然后我想请教老师一个问题,CPU利用率和系统负载这两个指标之间是什么关系?网上很多资料讲的不清不楚,看不明白。
作者回复: 杨军你好,系统负载代表单位时间内正在运行或等待的进程或线程数,代表了系统的繁忙程度,CPU利用率则代表单位时间内一个线程或进程实时占用CPU的百分比。我们知道,一个进程或者线程在运行时,未必都在实时的利用CPU的。 比如,在CPU密集型的情况下,系统的负载未必会高,但CPU的利用率肯定会高,一个线程/进程一直在计算,它对CPU的实时利用率是100%,而系统负载是0.1; 又比如,而对于I/O密集型的程序来说,有可能CPU的利用率不高,但系统的负载却会非常高,这是因为I/O经常引起阻塞,这样导致很多线程/进程被处于阻塞等待状态,处于等待的线程或进程也是属于负载线程/进程的。 通过以上两个例子,不知道有没有让你分清楚两个指标的区别,有问题保持沟通。
2019-05-214174 - 遇见阳光老师,tps qps这块还是有点不太清楚。
作者回复: 遇见阳光 你好,TPS(transaction per second)是单位时间内处理事务的数量,QPS(query per second)是单位时间内请求的数量。TPS代表一个事务的处理,可以包含了多次请求。很多公司用QPS作为接口吞吐量的指标,也有很多公司使用TPS作为标准,两者都能表现出系统的吞吐量的大小,TPS的一次事务代表一次用户操作到服务器返回结果,QPS的一次请求代表一个接口的一次请求到服务器返回结果。当一次用户操作只包含一个请求接口时,TPS和QPS没有区别。当用户的一次操作包含了多个服务请求时,这个时候TPS作为这次用户操作的性能指标就更具有代表性了。
2019-05-21280 - kaixiao7老师,关于JVM的异常问题,您在@陆离的回答中说"平时的业务异常避免生成栈追踪信息,在异常中用字符串描述业务异常信息即可",我通过throw new Exception("aaa"),debug时发现还是会调用fillInStackTrace()方法。我是不是理解错了呢?具体该怎么做?感谢
作者回复: 可以自己实现自定义异常,继承RuntimeException,然后将writableStackTrace设置为false。 以下是RuntimeException的构造函数: protected RuntimeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); }
2019-06-0462 - Maxwell请问老师最近段时间遇到端口被CLOSE_WAIT占用,重启后过了半天又重现,以前没有出现过,一般如何排查
作者回复: 可以通过tcpdump抓包看看连接状态,分析是否是服务端的FIN packet没有发出去。 正常的关闭流程是:服务端在接收到客户端发送的关闭请求FIN后,会进入CLOSE_WAIT状态,同时发送ACK回去。在完成与客户端直接的通信操作之后,再向客户端发送FIN,进入LAST_ACK状态。 如果连接是CLOSE_WAIT状态,而不是LAST_ACK状态,说明还没有发FIN给Client,那么可能是在关闭连接之前还有许多数据要发送或者其他事要做,导致没有发这个FIN packet。 建议确定关闭请求的四次握手,哪个环节出了问题,再去排查业务代码,可能是由于超时或者异常导致没有正常关闭连接。
2019-06-01436 - 天持今天查个问题,发现有台机器cpu使用率,明显比其他机器高了10%左右,其他指标也没发现问题,不懂呀,好好学习
作者回复: 你好 天持,机器的cpu高是不是我们服务进程导致的呢,可以使用top命令查看各个进程的cpu使用率,如果是我们服务进程导致的,可以再通过系统命令top -H -p 进程ID 查看具体线程的cpu使用率,如果确定某个线程的cpu使用率异常,可以使用jstack系统命令导出系统日志进行分析。这是帮我们确定是不是服务性能问题,不过按照我的经验,10%的高出,比较难排查出具体的问题,线程的cpu使用率不断在变化,我们很难区分到底哪个线程使用cpu异常。 如果确定是我们代码问题,我们也可以使用排除法进行分析,将你怀疑可能产生问题的代码注释掉,一个一个排除,这也是最笨的方法,但有时候找不到问题的时候就很受用。 如果不是代码问题,还有就是服务器的配置问题,不同的服务器配置,系统资源使用率也会不一样。
2019-05-2029 - QQ怪我觉得还有接口返回200的成功率吧
作者回复: 晚上好 QQ怪,你说的很对。我们平时在使用AB进行压测时,会有一个failed requests指标,本身接口没有异常的情况下,压测出现了异常,也是说明这个接口有性能问题。还有就是percentage of the requests served within a certain time这个指标,这个指标对金融交易系统来说是非常重要的,如果有99%的请求是1ms返回,但有1%是500ms返回,这对于某些对交易时间要求极致的金融系统来说也是性能问题。感谢你的回答,期望我的回答能让你满意!
2019-05-20229 - 大树抛出异常需要构建异常栈,对异常进行捕获和处理,这个过程比较消耗系统的性能,怎么理解?为什么这个过程就消耗性能?消耗什么性能呢?CPU?内存?
作者回复: 创建异常对象时会调用父类Throwable的fillInStackTrace()方法生成栈追踪信息,也就是调用native的fillInStackTrace()方法去爬取线程堆栈信息,为运行时栈做一份快照,正是这一部分开销很大
2020-03-2528 - Phoenix想请教下老师,使用MySQL经常会遇到业务需要实时导出大量业务数据的需求,那么如何在不影响业务和不分库的的情况满足业务实时导出大量数据的需求呢?
作者回复: 你好 Phoenix,切忌在主库中操作这种报表类的导出,在写入和查询都在一个主库进行,会造成数据库性能瓶颈,严重的会导致数据库死锁。我们可以将数据库读写分离,写业务走主(写)库,导出数据可以从从(读)库导出。这种实现方式,首先能提高数据导出的性能,其次不影响写业务。 如果你们公司有大数据中心,可以考虑将需要导出的数据实时同步到大数据中心,通过实时的流计算处理生成不同需求的业务数据。 希望以上的回答能让你满意,如果有问题保持沟通!
2019-05-2026 - 诸葛异常:Java 应用中,抛出异常需要构建异常栈,对异常进行捕获和处理,这个过程非常消耗系统性能。如果在高并发的情况下引发异常,持续地进行异常处理,那么系统的性能就会明显地受到影响。 老师好,高并发调用方法之后第一步就是检验一堆入参,如果入参有问题立即抛出异常给前端,不再处理下边的逻辑了,这样有问题吗?我看系统性能还可以啊。压力测试也还行。如果有问题的话那应该怎么做呢,检验错误后给前端放回code码然后返回空对象吗?感谢
作者回复: 如果没有生成堆栈追踪信息,不会有性能问题。一般业务异常避免生成堆栈追踪信息,我们知道这个异常是什么原因,所以直接返回字符串就好了。而系统异常,一般都会生成堆栈追踪信息,以便追踪源头,更好的排查问题。
2019-05-2622 - Mr. Huang老师您好,请问您提到的那几个响应时间测试,有没有比较好的工具推荐
作者回复: 你好Mr.Huang,比较常用的压力测试工具有AB,这是一个Linux系统工具,使用起来很简便,还有jmeter工具,可以在Windows环境下运行使用,个人比较习惯使用AB。
2019-05-2113