This commit is contained in:
by931
2022-09-06 22:30:37 +08:00
parent 66970f3e38
commit 3d6528675a
796 changed files with 3382 additions and 3382 deletions

View File

@@ -167,13 +167,13 @@ function hide_canvas() {
<p><strong>加载缓慢的网站,会受到搜索排名算法的惩罚,从而导致网站排名下降。</strong> 因此加载的快慢是性能优化是否合理的一个非常直观的判断因素,但性能指标不仅仅包括单次请求的速度,它还包含更多因素。</p>
<p>接下来看一下,都有哪些衡量指标能够帮我们进行决策。</p>
<h1>衡量指标有哪些?</h1>
<p><img src="assets/CgqCHl8L01eAWBW8AADH_LPiVzY445.png" alt="image" /></p>
<p><img src="assets/CgqCHl8L01eAWBW8AADH_LPiVzY445.png" alt="png" /></p>
<h2>1. 吞吐量和响应速度</h2>
<p>分布式的高并发应用并不能把单次请求作为判断依据,它往往是一个统计结果。其中最常用的衡量指标就是吞吐量和响应速度,而这两者也是考虑性能时非常重要的概念。要理解这两个指标的意义,我们可以类比为交通环境中的十字路口。</p>
<p>在交通非常繁忙的情况下,十字路口是典型的瓶颈点,当红绿灯放行时间非常长时,后面往往会排起长队。</p>
<p>从我们开车开始排队,到车经过红绿灯,这个过程所花费的时间,就是<strong>响应时间。</strong></p>
<p>当然,我们可以适当地调低红绿灯的间隔时间,这样对于某些车辆来说,通过时间可能会短一些。但是,如果信号灯频繁切换,反而会导致单位时间内通过的车辆减少,换一个角度,我们也可以认为这个十字路口的车辆吞吐量减少了。</p>
<p><img src="assets/CgqCHl8L02KAdjZ_AAB-AStGwkw402.png" alt="image" /></p>
<p><img src="assets/CgqCHl8L02KAdjZ_AAB-AStGwkw402.png" alt="png" /></p>
<p>像我们平常开发中经常提到的QPS 代表每秒查询的数量TPS 代表每秒事务的数量HPS 代表每秒的 HTTP 请求数量等,这都是常用的与吞吐量相关的量化指标。</p>
<p><strong>在性能优化的时候,我们要搞清楚优化的目标,到底是吞吐量还是响应速度。</strong> 有些时候,虽然响应速度比较慢,但整个吞吐量却非常高,比如一些数据库的批量操作、一些缓冲区的合并等。虽然信息的延迟增加了,但如果我们的目标就是吞吐量,那么这显然也可以算是比较大的性能提升。</p>
<p>一般情况下,我们认为:</p>
@@ -190,7 +190,7 @@ function hide_canvas() {
<p>除非服务在一段时间内出现了严重的问题,否则平均响应时间都会比较平缓。因为高并发应用请求量都特别大,所以长尾请求的影响会被很快平均,导致很多用户的请求变慢,但这不能体现在平均耗时指标中。</p>
<p>为了解决这个问题,另外一个比较常用的指标,就是<strong>百分位数(Percentile)</strong></p>
<p><strong>2百分位数</strong></p>
<p><img src="assets/Ciqc1F8L032AC_6sAABe7N44eqs490.png" alt="image" /></p>
<p><img src="assets/Ciqc1F8L032AC_6sAABe7N44eqs490.png" alt="png" /></p>
<p>这个也比较好理解。我们圈定一个时间范围,把每次请求的耗时加入一个列表中,然后按照从小到大的顺序将这些时间进行排序。这样,我们取出特定百分位的耗时,这个数字就是 TP 值。可以看到TP 值(Top Percentile)和中位数、平均数等是类似的,都是一个统计学里的术语。</p>
<p>它的意义是,超过 N% 的请求都在 X 时间内返回。比如 TP90 = 50ms意思是超过 90th 的请求,都在 50ms 内返回。</p>
<p><strong>这个指标也是非常重要的,它能够反映出应用接口的整体响应情况</strong>。比如,某段时间若发生了长时间的 GC那它的某个时间段之上的指标就会产生严重的抖动但一些低百分位的数值却很少有变化。</p>
@@ -219,7 +219,7 @@ function hide_canvas() {
<p>基准测试(Benchmark)并不是简单的性能测试,是用来测试某个程序的最佳性能。</p>
<p>应用接口往往在刚启动后都有短暂的超时。在测试之前,我们需要对应用进行预热,消除 JIT 编译器等因素的影响。而在 Java 里就有一个组件,即 JMH就可以消除这些差异。</p>
<h1>注意点</h1>
<p><img src="assets/Ciqc1F8NLD2APjhfAAFDL-uVLMw32.jpeg" alt="1.jpeg" /></p>
<p><img src="assets/Ciqc1F8NLD2APjhfAAFDL-uVLMw32.jpeg" alt="png" /></p>
<h2>1. 依据数字而不是猜想</h2>
<p>有些同学对编程有很好的感觉,能够靠猜测列出系统的瓶颈点,这种情况固然存在,但却非常不可取。复杂的系统往往有多个影响因素,我们应将性能分析放在第一位,把性能优化放在次要位置,直觉只是我们的辅助,但不能作为下结论的工具。</p>
<p>进行性能优化时,我们一般会把分析后的结果排一个优先级(根据难度和影响程度),从大处着手,首先击破影响最大的点,然后将其他影响因素逐一击破。</p>