性能优化总结
性能优化关注点
从图中可以看出,性能优化的主要关注:CPU、内存、磁盘IO、网络IO等四个方面。
性能指标
每个关注点都有对应的指标,吞吐率、响应时间、QPS/IOPS、TP99、资源使用率是我们经常关注的指标,通过这些指标来衡量性能
其中时间的量级
性能优化的方向
监控、分析、优化,三部曲,以终为始,循环往复
常用工具:
优化大师格雷格画的图,吊炸天,你应该很熟悉,gregg亲手实现了一些工具。
1. 借助工具定位性能瓶颈。gprof2dot.py可以处理多种采样输出数据。建议使用perf等非侵入式的profiling工具。
linux下的内核测试工具——perf使用简介_谁不小心的的博客-CSDN博客_perf源码下载
定位IO瓶颈问题
定位锁的问题
依据数据而不是凭空猜测
这是性能优化的第一原则,当我们怀疑性能有问题的时候,应该通过测试、日志、profillig来分析出哪里有问题,有的放矢,而不是凭感觉、撞运气。一个系统有了性能问题,瓶颈有可能是CPU,有可能是内存,有可能是IO(磁盘IO,网络IO),大方向的定位可以使用top以及stat系列来定位(vmstat,iostat,netstat...),针对单个进程,可以使用pidstat来分析。
在本文中,主要讨论的是CPU相关的性能问题。按照80/20定律,绝大多数的时间都耗费在少量的代码片段里面,找出这些代码唯一可靠的办法就是profile,我所知的编程语言,都有相关的profile工具,熟练使用这些profile工具是性能优化的第一步。
忌过早优化
The real problem is that programmers have spent far too much time worrying about efficiency in the wrong places and at the wrong times; premature optimization is the root of all evil (or at least most of it) in programming.
我并不十分清楚Donald Knuth说出这句名言的上下文环境,但我自己是十分认同这个观念的。在我的工作环境(以及典型的互联网应用开发)与编程模式下,追求的是快速的迭代与试错,过早的优化往往是无用功。而且,过早的优化很容易拍脑袋,优化的点往往不是真正的性能瓶颈。
忌过度优化
As performance is part of the specification of a program – a program that is unusably slow is not fit for purpose
性能优化的目标是追求合适的性价比。
在不同的阶段,我们对系统的性能会有一定的要求,比如吞吐量要达到多少多少。如果达不到这个指标,就需要去优化。如果能满足预期,那么就无需花费时间精力去优化,比如只有几十个人使用的内部系统,就不用按照十万在线的目标去优化。
而且,后面也会提到,一些优化方法是“有损”的,可能会对代码的可读性、可维护性有副作用。这个时候,就更不能过度优化。
深入理解业务
代码是服务于业务的,也许是服务于最终用户,也许是服务于其他程序员。不了解业务,很难理解系统的流程,很难找出系统设计的不足之处。后面还会提及对业务理解的重要性。
性能优化是持久战
当核心业务方向明确之后,就应该开始关注性能问题,当项目上线之后,更应该持续的进行性能检测与优化。
现在的互联网产品,不再是一锤子买卖,在上线之后还需要持续的开发,用户的涌入也会带来性能问题。因此需要自动化的检测性能问题,保持稳定的测试环境,持续的发现并解决性能问题,而不是被动地等到用户的投诉。
选择合适的衡量指标、测试用例、测试环境
正因为性能优化是一个长期的行为,所以需要固定衡量指标、测试用例、测试环境,这样才能客观反映性能的实际情况,也能展现出优化的效果。
衡量性能有很多指标,比如系统响应时间、系统吞吐量、系统并发量。不同的系统核心指标是不一样的,首先要明确本系统的核心性能诉求,固定测试用例;其次也要兼顾其他指标,不能顾此失彼。
测试环境也很重要,有一次突然发现我们的QPS高了许多,但是程序压根儿没优化,查了半天,才发现是换了一个更牛逼的物理机做测试服务器。
CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)使用更多的站内链接;(2)提升标题与正文的相关性;(3)增加除了各种控件外,文章正文的字数。
小陈classmate: 大佬,能加微信指点一下吗
FengJieHeng: 通俗易懂!!!
又是一个小学生: 谢谢您的回复,祝您一切顺利,工作顺心,身体健康,家庭幸福,生活愉快!如果您需要任何帮助,请随时联系我。
又举杯: Computed properties in Vue.js are a feature that allows developers to calculate values based on reactive data within a component. These properties are automatically updated and cached whenever their dependencies change, ensuring that the data is always accurate. They are particularly useful for complex calculations, as they allow developers to simplify the code and abstract away the complexity. There are several benefits of using computed properties in Vue.js: 1. Improved performance: When using computed properties, Vue.js only updates the data when necessary. This can help improve performance and make your application run more smoothly. 2. Two-way data binding: Computed properties can be used for two-way data binding, allowing changes in the UI to update the underlying data, and vice versa. This can help improve user experience and make your application more responsive. 3. Simplified code: Computed properties allow developers to simplify complex calculations and abstract away the complexity, making the code more readable and easier to maintain. Overall, computed properties are a powerful feature in Vue.js that can help developers create more robust and efficient applications. By leveraging computed properties, you can improve performance, simplify your code, and provide a better user experience.