精华内容
下载资源
问答
  • 数学中的两个重要极限公式

    万次阅读 2015-11-07 10:09:10
  • 泰勒与极限

    千次阅读 2016-12-19 21:44:21
    泰勒与极限@(微积分)在极限的求解中,一旦习惯了用泰勒公式+皮亚诺余项的形式来思考,可能慢慢会觉得这才是好方法的感慨吧。比如思考一个很常见的问题:limx→01−cosxcos2xcos3xx2=? \lim_{x\rightarrow 0}\frac{1-...

    泰勒与极限

    @(微积分)

    在极限的求解中,一旦习惯了用泰勒公式+皮亚诺余项的形式来思考,可能慢慢会有这才是好方法的感慨吧。

    比如思考一个很常见的问题:

    limx01cosxcos2xcos3xx2=? \lim_{x\rightarrow 0}\frac{1-cosxcos2xcos3x}{x^2} = ?

    如果熟练知道等价无穷小:1cosxx221-cosx \sim \frac{x^2}{2}

    但是这个来源还是:cosx=1x22!+x44!+...+(1)nx2n(2n)!+...cosx = 1-\frac{x^2}{2!} + \frac{x^4}{4!} + ... + (-1)^n\frac{x^{2n}}{(2n)!} + ...

    Narrow一下视角,就用1cosxx221-cosx \sim \frac{x^2}{2}来解。

    先看分子:

    1cosxcos2xcos3x=1cosx+cosxcosxcos2x+cosxcos2xcosxcos2xcos3x=(1cosx)+cosx(1cos2x)+cosxcos2x(1cos3x) 1-cosxcos2xcos3x = \\ 1- cosx + cosx\\ -cosxcos2x + cosxcos2x \\ -cosxcos2xcos3x \\ = (1-cosx) + cosx(1-cos2x) + cosxcos2x(1-cos3x)\\

    生生拆出三个可用无穷小的形式。

    limx01cosxcos2xcos3xx2=limx01cosxx2+limx0cosx(1cos2x)x2+limx0cosxcos2x(1cos3x)x2=12+2+92=7. \lim_{x\rightarrow 0}\frac{1-cosxcos2xcos3x}{x^2} = \lim_{x\rightarrow 0}\frac{1-cosx}{x^2} \\ +\lim_{x\rightarrow 0}\frac{cosx(1-cos2x)}{x^2} \\ +\lim_{x\rightarrow 0}\frac{cosxcos2x(1-cos3x)}{x^2} \\ = \frac{1}{2} +2 + \frac{9}{2} = 7.

    似乎很简单就想到了这么做,也好像很简单就解出来了。

    我只能说,能自如用因式分解且一击必中的同学很很厉害。

    如果用泰勒呢?

    问题将会变成纯体力劳动。

    只需要记住一个准则:展开到第一个首项不为0的就停止,剩下的用皮亚诺余项代替。

    比如这里:

    cosx=1x22+O(x2)cos2x=12x2+O(x2)cos3x=19x22+O(x2) cosx = 1-\frac{x^2}{2} + O(x^2) \\ cos2x= 1-2x^2+O(x^2)\\ cos3x = 1-\frac{9x^2}{2}+O(x^2)

    因此,分子为:
    1cosxcos2xcos3x=1(1x22+O(x2))(12x2+O(x2))(19x22+O(x2))=12x2+92x2+2x2+O(x2)=7x2+O(x2) 1-cosxcos2xcos3x = 1-(1-\frac{x^2}{2}+O(x^2))(1-2x^2+O(x^2))(1-\frac{9x^2}{2}+O(x^2)) \\ = \frac{1}{2}x^2+\frac{9}{2}x^2+2x^2 + O(x^2) \\ = 7x^2 + O(x^2)

    如果不出意外,或许很多人会说这种乘起来的分式岂不是更复杂。

    终于提到最想说的分式组合的话题了。

    对于这种n多分式组合,需要找到某些项的系数问题,是非常有趣的问题,如果不去思考过,就会有动手全部求出来的冲动。还记得初一刚学有理多项式时候的感觉么,展开成一堆,然后合并同类项。为了不化错,通常借助各种辅助线,直线,双直线,点画线,曲线等等,就为了标记同类项。这里当然不推荐这么干。减小犯错的几率的最好做法就是能不做就不做。

    如何思考?

    其实就是我们在二项式中学到的那些,并没什么新闻。

    比如这里,我们需要的是常数项和x2x^2项。常数项很简单,三个分式都必须出1,因此,常数就是1。而x2x^2呢?当第一个分式出x22-\frac{x^2}{2}时,剩下的两个都必须+只能出常数项,谁带个x出来,都会把x的系数升高,升高就成了分母的高阶无穷小了,等于0了不是~第二个分式出2x2-2x^2时,剩下的两个也是只能出常数,同理第三个出9x22-\frac{9x^2}{2}时前面两个也是出常数。

    因此,得到的x2x^2的系数就是-7,看到是前面是 11-,所以最终是7.

    这种分开看待问题的思路极其重要,甚至可以用分治法这种计算机算法里常用的视角来定义这种问题。

    基于这个小点很重要,特别抽出一个问题来专门研究这个思路–高阶导数问题。

    f(x)=ex1+xf(x) = e^{\frac{x}{1+x}},求解f(5)(0)f^{(5)}(0).

    分析:相信不少可爱的同学一看才5阶导数而已,撸起袖子就开始一级一级求解。不过好在,求到两阶左右,就会放弃了。当然不排除神一样的存在,明明知道问题有其他方法,非要挑战,直接求到了5阶,我只想说开心就好。

    泰勒来袭。

    ex=1+x+x22!+x33!+x44!+x55!+O(x5)11+x=1x+x2x3+... e^x = 1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\frac{x^4}{4!}+\frac{x^5}{5!}+O(x^5)\\ \frac{1}{1+x} = 1-x+x^2-x^3+...

    所以,
    ex1+x=1+x1+x+x22!(1+x)2+x33!(1+x)3+x44!(1+x)4+x55!(1+x)5+O(x5)11+x=1x+x2x3+... e^{\frac{x}{1+x}} = 1+\frac{x}{1+x}+\frac{x^2}{2!(1+x)^2}+\frac{x^3}{3!(1+x)^3} + \frac{x^4}{4!(1+x)^4}+\frac{x^5}{5!(1+x)^5}+O(x^5) \\ \frac{1}{1+x} = 1-x+x^2-x^3+...

    准备完毕,
    ex1+x=1+x1+x+x22!(1+x)2+x33!(1+x)3+x44!(1+x)4+x55!(1+x)5+O(x5) e^{\frac{x}{1+x}} = 1+\frac{x}{1+x}+\frac{x^2}{2!(1+x)^2}+\frac{x^3}{3!(1+x)^3} + \frac{x^4}{4!(1+x)^4}+\frac{x^5}{5!(1+x)^5}+O(x^5) \\

    分项来看:
    x1+x=x(1x+x2x3+x4x5+O(x5))=xx2+x3x4+x5+O(x5) \frac{x}{1+x} = x(1-x+x^2-x^3+x^4-x^5+O(x^5)) = x - x^2+x^3-x^4+x^5+O(x^5)
    五阶以下的都在求导5次后变为0了,只有5!剩下。

    x22!(1+x)2=x22(1x+x2x3+O(x3))2 \frac{x^2}{2!(1+x)^2} = \frac{x^2}{2}(1-x+x^2-x^3+O(x^3))^2
    因为外面有x2x^2,所以展开到x3x^3即可。所以平方项这里需要的是x3x^3的系数。怎么办?两项,轮流出牌。现在一项出x3-x^3对方只能出1,贡献系数是-1,但这不是完结,一方出x2x^2,对方就出x-x,贡献系数-1,一方出x-x,则对方出x2x^2,贡献系数-1,所以x3x^3的系数就是-3.综合起来就是32-\frac{3}{2},求导五次得到:35!2\frac{-3\cdot 5!}{2}.

    看到还有三个啊,我都不想解了。

    x33!(1+x)3=x36(1x+x2+O(x2))3 \frac{x^3}{3!(1+x)^3} = \frac{x^3}{6}(1-x+x^2+O(x^2))^3
    三次方项只需要贡献x2x^2即可。
    简单推导是:第一项出x2x^2时,剩下两项出常数1,这样轮流搞三次,贡献3.
    任意两项出-x,剩下的一项出1,轮流三次,贡献3.所以x2x^2系数是6.
    因此x5x^5总的系数变为1,所以五次导后为5!5!.

    x44!(1+x)4=x424(1x+O(x))4 \frac{x^4}{4!(1+x)^4} = \frac{x^4}{24}(1-x+O(x))^4

    四次方这里只用求到x的系数即可,可见一个出-x,剩下的出常数,轮流出4轮,得到的是-4.从而x5x^5系数是16-\frac{1}{6}.五次导后为5!6-\frac{5!}{6}.

    最后一个:

    x55!(1+x)5=x5120(1)5 \frac{x^5}{5!(1+x)^5} = \frac{x^5}{120}(1)^5

    系数就是1120\frac{1}{120},所以求导五次后为:5!120=1\frac{5!}{120} = 1

    综上:f(5)(0)=5!325!+5!165!+1=41.f^{(5)}(0) = 5! - \frac{3}{2}\cdot 5! + 5! - \frac{1}{6}\cdot 5! + 1 = 41.

    PS — 免责声明:鉴于纯手算,答案仅供参考。

    END.

    展开全文
  • 高数求函数极限

    万次阅读 多人点赞 2016-11-29 22:13:30
    在做高数题的时候我们会发现很多题都离不开求极限,有人说:如果高数是一颗数的话,那么极限就是他的根,可见其重要性,下面总结一下求极限的方法。  【知识点】  一、定义:  极限是微积分中的基础概念,它指的...

         在做高数题的时候我们会发现很多题都离不开求极限,有人说:如果高数是一颗数的话,那么极限就是他的根,可见其重要性,下面总结一下求极限的方法。

         【知识点】

          一、定义:

           极限是微积分中的基础概念,它指的是变量在一定的变化过程中,从总的来说逐渐稳定的这样一种变化趋势以及所趋向的值(极限值)。极限的概念最终由柯西和魏尔斯特拉斯等人严格阐述。在现代的数学分析教科书中,几乎所有基本概念(连续、微分、积分)都是建立在极限概念的基础之上。

         二、常用求极限方法:                

          1、连续初等函数,在定义域范围内求极限,可以将该点直接代入得极限值,因为连续函数的极限值就等于在该点的函数值 

          2、利用恒等变形消去零因子(针对于0/0型) 

          3、利用无穷大与无穷小的关系求极限 

          4、利用无穷小的性质求极限 

          5、利用等价无穷小替换求极限,可以将原式化简计算 

          6、利用两个极限存在准则,求极限,有的题目也可以考虑用放大缩小,再用夹逼定理的方法求极限 

          7、利用两个重要极限公式求极限 

          8、利用左、右极限求极限,(常是针对求在一个间断点处的极限值) 

          9、洛必达法则求极限

          10、泰勒公式求极限

         三、常用方法

         其中最为常用的是洛必达法则,泰勒公式,还有等价无穷小替换公式也比较好用,这些都需要记住一些替换公式,应该注意的是泰勒公式和等价无穷小替换公式都只适用于x->0的情况想。

         1、洛必达法则:洛必达法则是在一定条件下通过分子分母分别求导再求极限来确定未定式值的方法。

          可以用洛必达法则求极限的函数特点可以归纳为是“0/0、∞/∞”型未定式,极限有七种未定式,这五种:0·∞、∞-∞、1的∞次方、∞的0次方、0的0次方,基本上转换成前面两种,都可以使用洛必达法则求极限。

         2、泰勒公式:在数学中,泰勒公式是一个用函数在某点的信息描述其附近取值的公式。如果函数足够光滑的话,在已知函数在某一点的各阶导数值的情况之下,泰勒公式可以用这些导数值做系数构建一个多项式来近似函数在这一点的邻域中的值。泰勒公式还给出了这个多项式和实际的函数值之间的偏差。

         对于我们来说主要是,记住张宇老师在视频中提出的8个常见泰勒公式,以及泰勒公式的展开原则。

         8个常见泰勒公式:

               

          泰勒公式2个展开原则:

           1)A/B型——上下同阶原则:若分子(分母)是x^k,则将分母(分子)展开至x^k,看最大阶次是多少就展开到哪一阶。

           2)A-B型——幂次最低原则:将A,B分别展开至系数不相等的x的最低次幂为止,如果是A+B型要改成“A-(-B)”。

         3、等价无穷小替换公式:当求函数x->0的极限时,可以利用一下公式进行替换,讲原式化简。

               

         4、两个重要

          这两个很重要,对第一个而言是X趋近0时候的sinx与x比值。第2个就如果x趋近无穷大无穷小都有对有对应的形式(第二个实际上是用于函数是1的无穷的形式)(当底数是1的时候要特别注意可能是用第二个重要极限)

            

         四、 求函数极限注意:要化简先行

          1、提出极限不为0的因式,如图:sinx在x->0时,极限为0,所以整体为2,可以把它提出来。

             

          2、善于使用等价无穷小替换公式

          3、极限七种未定式灵活掌握

         【小结】

          最近学习高数真的是有些头大了,总结一下,可以更好的整理整理思路。求极限的方法很多,找到合适的就是最好的,主要还是需要多做题,才能掌握其中的做题技巧,继续加油吧!↖(^ω^)↗

     

    展开全文
  • HTTP性能极限优化

    千次阅读 多人点赞 2020-01-13 09:38:24
    一个页面上有几百个对象,这些对象的重要性不同,有些之间还互相依赖。比如,有些JS文件会包含jQuery.js,如果同等对待的话,即使先下载完前者,也无法使用。 HTTP2允许浏览器下载对象时,根据解析规则,在stream...

    无论你在做前端、后端还是运维,HTTP都是不得不打交道的网络协议。它是最常用的应用层协议,对它的优化,既能通过降低时延带来更好的体验性,也能通过降低资源消耗带来更高的并发性。

    可是,学习HTTP不久的同学,很难全面说出HTTP的所有优化点。这既有可能是你没好好准备过大厂的面试:-),也有可能你没有加入一个快速发展的项目,当产品的用户量不断翻番时,需求会倒逼着你优化HTTP协议。

    这篇文章是根据我在2019年GOPS全球运维大会上海站的演讲PPT,重新提炼文字后的总结。我希望能从四个全新的维度,带你覆盖绝大部分的HTTP优化技巧。这样,即使还不需要极致方法去解决当前的性能瓶颈,也会知道优化方向在哪,当需求来临时,能够到Google上定向查阅资料。

     

    第一个维度,是从编码效率上,更快速地把消息转换成更短的字符流。这是最直接的性能优化点。

    一、编码效率优化

    如果你对HTTP/1.1协议做过抓包分析,就会发现它是用“whitespace-delimited”方式编码的。用空格、回车来编码,是因为HTTP在诞生之初追求可读性,这样更有利于它的推广。

    然而在当下,这种低效的编码方式已经严重影响性能了,所以2009年Google推出了基于二进制的SPDY协议,大幅提升了编码效率。2015年,稍做改进后它被确定为HTTP/2协议,现在50%以上的站点都在使用它。

    这是编码优化的大方向,包括即将推出的HTTP/3。

    然而这些新技术到底是怎样提升性能的呢?那还得拆开了看,先从数据的压缩谈起。你抓包看到的是数据,它并不等于信息。数据其实是信息和冗余数据之和,而压缩技术,就是尽量地去除冗余数据。

    压缩分为无损压缩和有损压缩。针对图片、音视频,我们每天都在与有损压缩打交道。比如,当浏览器只需要缩略图时,就没有必要浪费带宽传输高清图片。而高清视频做过有损压缩后,在肉眼无法分清时,已经被压缩了上千倍。这是因为,声音、视频都可以做增量压缩。还记得曾经的VCD吗?当光盘有划痕时,整张盘都无法播放,就是因为那时的视频做了增量压缩,而且关键帧太少,导致关键帧损坏时,后面的增量帧全部无法播放了。

    再来看无损压缩,你肯定用过gzip,它让http body实现了无损压缩。肉眼阅读压缩后的报文全是乱码,但接收端解压后,可以看到发送端的原文。然而,gzip的效率其实并不高,以Google推出的brotli做对比,你就知道它的缺陷了:

    评价压缩算法时,我们重点看两个指标:压缩率和压缩速度。上图中可以看到,无论用gzip 9个压缩级别中的哪一个,它的压缩率都低于brotli(相比gzip,压缩级别它还可以配置为10),压缩速度也更慢。所以,如果可以,应该尽快更新你的gzip压缩算法了。

    说完对body的压缩,再来看HTTP header的压缩。对于HTTP/1.x来说,header就是性能杀手。特别是当下cookie泛滥的时代,每次请求都要携带几个KB的头部,很浪费带宽、CPU、内存!HTTP2通过HPACK技术大幅度降低了header编码后的体积,这也是HTTP3的演进方向。 HPACK到底是怎样实现header压缩的呢?

    HPACK通过Huffman算法、静态表、动态表对三种header都做了压缩。比如上图中,method GET存在于静态表,用1个字节表示的整数2表达即可;user-agent Mozilla这行头部非常长,当它第2次出现时,用2个字节的整数62表示即可;即使它第1次出现时,也可以用Huffman算法压缩Mozilla这段很长的浏览器标识符,可以获得最多5/8的压缩率。

    静态表中只存放最常见的header,有的只有name,有的同时包括name和value。静态表的大小很有限,目前只有61个元素。

    动态表应用了增量编码的思想,即,第1次出现时加入动态表,第2次出现的时候,传输它在动态表中的序号即可。

    Huffman编码在winrar等压缩软件中广为使用,但HPACK中的Huffman有所不同,它使用的是静态huffman编码。即,它统计了互联网上几年内的HTTP头部,按照每个字符出现的概率,重建huffman树,这样,根据规则,出现次数最多的a、c、e或者1、2、3这些字符就只用5个bit位表示,而很少出现的字符则用几十个bit位表示。
    说完header,再来看http body的编码。这里只举3个例子:1、只有几十字节的小图标,没有必要用独立的HTTP请求传输,根据RFC2397的规则,可以把它直接嵌入到HTML或者CSS文件中,而浏览器在解析时会识别出它们,就像下图中的头像:

    2、JS源码文件中,可能有许多小文件,这些文件中也有许多空行、注释,通过WebPack工具,先在服务器端打包为一个文件,并去除冗余的字符,编码效果也很好。

    3、在表单中,可以一次传输多个元素,比如既有复选框,也可以有文件。这就减少了HTTP请求的个数。

    可见,http协议从header到 body,都有许多编码手段,可以让传输的报文更短小,既节省了带宽,也降低了时延。

     

    编码效率优化完后,再来看“信道”,这虽然是通讯领域的词汇,但用来概括HTTP的优化点非常合适,这里就借用下了。

    二、信道利用率优化

    信道利用率包括3个优化点,第一个优化点是多路复用!高速的低层信道上,可以跑许多低速的高层信道。比如,主机上只有一块网卡,却能同时让浏览器、微信、钉钉收发消息;一个进程可以同时服务几万个TCP连接;一个TCP连接上可以同时传递多个HTTP2 STREAM消息。


    其次,为了让信道有更高的利用率,还得及时恢复错误。所以,TCP工作的很大一部分,都是在及时的发现丢包、乱序报文,并快速的处理它们。

    最后,就像经济学里说的,资源总是稀缺的。有限的带宽下,如何公平的对待不同的连接、用户和对象呢?比如下载页面时,如果把CSS和图片以同等优先级下载就有问题,图片晚点显示没关系,但CSS没获取到页面就无法显示。另外,传输消息时,报文头报并不承载目标信息,但它又是必不可少的,如何降低这些控制信息的占比呢?

    我们先从多路复用谈起。广义上来说,多线程、协程都属于多路复用,但这里我主要指http2的stream。因为http协议被设计为client先发request,server才能回复response,这样收发消息,是没办法跑满带宽的。最有效率的方式是,发送端源源不断地发请求、接收端源源不断地发响应,这对于长肥网络尤为有效:

    HTTP2的stream就是这样复用连接的。我们知道,chrome对一个站点最多同时建立6个连接,而有了HTTP2后,只需要一个连接就能高效的传输页面上的数百个对象。我特意让我的个人站点www.taohui.pub同时支持HTTP1和HTTP2,下图是连接视角上HTTP2和HTTP1的区别。

    熟悉chrome Network网络面板的同学,肯定很熟悉waterfall,它可以帮助你分析HTTP请求到底慢在哪里,是请求发出的慢,还是响应接收的慢,又或者是解析得太慢了。下图还是我的站点在waterfall视角下的对比。

    从这两张图可以看出,HTTP2全面优于HTTP1。

    再来看网络错误的恢复。在应用层,lingering_time通过延迟关闭连接来避免浏览器因RST错误收不到http response,而timeout则是用定时器及时发现错误并释放资源。

    在传输层,通过timestamp=1可以让TCP更精准的测量出定时器的超时时间RTO。当然,timestamp还有一个用途,就是防止长肥网络中的序列号回绕。

    什么是序列号回绕呢?我们知道,TCP每个报文都有序列号,它不是指报文的次序,而是已经发送的字节数。由于它是32位整数,所以最多可以处理232也就是4.2GB的飞行中报文。像上图中,当1G-2G这些报文在网络中飞行时间过长时,就会与5G-6G报文重叠,引发错误。

    网络错误还有很多种,比如报文的次序也是无法保证的。打开tcp_sack可以减少乱序时的重发报文量,降低带宽消耗。

    用Chrome浏览器直接下载大文件时,网络不好时,一出错就得全部重传,体验很差。改用迅雷下载就快了很多。这是因为迅雷把大文件拆成很多小块,可以多线程下载,而且每个小块出错后,重新下载这一个块即可,效率很高。这个断点续传、多线程下载技术,就是HTTP的Range协议。如果你的服务是缓存,也可以使用Range协议,比如Nginx的Slice模块就做了这件事。

    实际上对于网络错误恢复,最精妙的算法是拥塞控制,它可以全面提升网络性能。有同学会问,TCP不是有流量控制,为什么还会发生网络拥塞呢?这是因为,TCP链路中的各个路由器,处理能力并不互相匹配。

    就像上图,R1的峰值网络是700M/s,R2的峰值网络是600M/s,它们都需要通过R3才能到达R4。然而,R3的最大带宽只有1000M/s!当R1、R2中的TCP全速使用各自带宽时,就会引发R3丢包。拥塞控制就是解决丢包问题的。

    自1982年TCP诞生起,就在使用传统的拥塞控制算法,它是发现丢包后再刹车减速,效果很不好。为什么呢?你可以观察下图,路由器中会有缓冲队列,当队列为空时,ping的时延最短;当队列将满时,ping的时延很大,但还未发生丢包;当队列已满时,丢包才会发生。

    所以,当队列出现积压时,丢包没有发生。虽然此时峰值带宽不会减少,但网络时延变大了,这是要避免的。而测量驱动的拥塞控制算法,就在队列刚出现积压这个点上开始刹车减速。在当今内存越来越便宜,队列越来越大的年代,新算法尤为有效。

    当Linux内核更新到4.9版本时,原先的CUBIC拥塞控制算法就被替换为Google的BBR算法了。从下图中可以看到,当丢包率达到0.01%时,CUBIC就没法用了,而BBR并没有问题,直到丢包率达到5%时BBR的带宽才剧烈下降。

    再来看资源的平衡分配。为了公平的对待连接、用户,服务器会做限速。比如下图中的Leacky Bucket算法,它能够平滑突增的流量,更公平的分配带宽。


    再比如HTTP2中的优先级功能。 一个页面上有几百个对象,这些对象的重要性不同,有些之间还互相依赖。比如,有些JS文件会包含jQuery.js,如果同等对待的话,即使先下载完前者,也无法使用。

    HTTP2允许浏览器下载对象时,根据解析规则,在stream中设置每一个对象的weight优先级(255最大,0最小)。而各代理、资源服务器都会根据优先级,分配内存和带宽,提升网络效率。

    最后看下TCP的报文效率,它也会影响之上的HTTP性能。比如开启Nagle算法后,网络中的小报文数量大幅减少,考虑到40字节的报文头部,信息占比更高。

    Cork算法与Nagle算法相似,但会更激进的控制小报文。Cork与Nagle是从发送端控制小报文,quickack则从接收端控制纯ack小报文的数量,提高信息占比。

     

    说完相对微观一些的信道,我们再来从宏观上看第三个优化点:传输路径的优化。

    三、传输路径优化

    传输路径的第一个优化点是缓存,浏览器、CDN、负载均衡等组件中,缓存无处不在。

    缓存的基本用法你大概很熟悉了,这里我只讲过期缓存的用法。把过期缓存直接丢掉是很浪费的😊,因为“过期”是客户端的定时器决定的,并不代表资源真正失效。所以,可以把它的标识符带给源服务器,服务器会判断缓存是否仍然有效,如果有效,直接返回304和空body就可以了,非常节省带宽。


    对于负载均衡而言,过期缓存还能够保护源服务器,限制回源请求。当源服务器挂掉后,还能以过期缓存给用户带来降级后的服务体验,这比返回503要好得多。

    传输路径的第二个优化点是慢启动。系统自带的TCP协议栈,为了避免瓶颈路由器丢包,会缓缓加大传输速度。它的起始速度就叫做初始拥塞窗口。


    早期的初始拥塞窗口是1个MSS(通常是576字节),后来改到3个MSS(Linux 2.5.32),在Google的建议下又改到10个MSS(Linux 3.0)。 之所以要不断提升起始窗口,是因为随着互联网的发展,网页越来越丰富,体积也越来越大。起始窗口太小,就需要更长的时间下载第一个网页,体验很差。

    当然,修改起始窗口很简单,下图中是Linux下调整窗口的方法。


    修改起始窗口是常见的性能优化手段,比如CDN厂商都改过起始窗口,下图是主流CDN厂商2014和2017年的起始窗口大小。


    可见,有些窗口14年调得太大了,17年又缩回去了。所以,起始窗口并不是越大越好,它会增加瓶颈路由器的压力。

    再来看传输路径上,如何从拉模式升级到推模式。比如index.html文件中包含<LINK href=”some.css”>,在HTTP/1中,必须先下载完index.html,才能去下载some.css,这是两个RTT的时间。但在HTTP/2中,服务器可以通过2个stream,同时并行传送index.html和some.css,节约了一半的时间。


    其实当出现丢包时,HTTP2的stream并行发送会严重退化,因为TCP的队头阻塞问题没有解决。

    上图中的SPDY与HTTP2是等价的。在红绿色这3个stream并发传输时,TCP层仍然会串行化,假设红色的stream在最先发送的,如果红色报文丢失,那么即使接收端已经收到了完整的蓝、绿stream,TCP也不会把它交给HTTP2,因为TCP自身必须保证报文有序。这样并发就没有保证了,这就是队头阻塞问题。

    解决队头阻塞的办法就是绕开TCP,使用UDP协议实现HTTP,比如Google的GQUIC协议就是这么做的,B站在几年前就使用它提供服务了。

    UDP协议自身是不能保证可靠传输的,所以GQUIC需要重新在UDP之上实现TCP曾经做过的事。这是HTTP的发展方向,所以目前HTTP3就基于GQUIC在制定标准。

     

    最后,再从网络信息安全的角度,谈谈如何做优化。它实际上与编码、信道、传输路径都有关联,但其实又是独立的环节,所以放在最后讨论。

    四、信息安全优化

    互联网世界的信息安全,始于1995年的SSL3.0。到现在,许多大型网站都更新到2018年推出的TLS1.3了。


    TLS1.2有什么问题呢?最大问题就是,它支持古老的密钥协商协议,这些协议现在已经不安全了。比如2015年出现的FREAK中间人攻击,就可以用Amazon上的虚拟机,分分钟攻陷支持老算法的服务器。


    TLS1.3针对这一情况,取消了在当前的计算力下,数学上已经不再安全的非对称密钥协商算法。在Openssl的最新实现中,仅支持5种安全套件:

    TLS1.3的另一个优势是握手速度。在TLS1.2中,由于需要2个RTT才能协商完密钥,才诞生了session cache和session ticket这两个工具,它们都把协商密钥的握手降低为1个RTT。但是,这两种方式都无法应对重放攻击。

    而TLS1.2中的安全套件协商、ECDHE公钥交换这两步,在TLS1.3中被合并成一步,这大大提升了握手速度。

    如果你还在使用TLS1.2,尽快升级到1.3吧,除了安全性,还有性能上的收益。

    小结

    HTTP的性能优化手段众多,从这四个维度出发,可以建立起树状的知识体系,囊括绝大部分的HTTP优化点。

    编码效率优化包括http header和body ,它可以使传输的数据更短小紧凑,从而获得更低的时延和更高的并发。同时,好的编码算法也可以减少编解码时的CPU消耗。

    信道利用率的优化,可以从多路复用、错误发现及恢复、资源分配这3个角度出发,让快速的底层信道,有效的承载慢速的应用层信道。

    传输路径的优化,包括各级缓存、慢启动、消息传送模式等,它能够让消息更及时的发给浏览器,提升用户体验。

    当下互联网中的信息安全,主要还是建立在TLS协议之上的。TLS1.3从安全性、性能上都有很大的提升,我们应当及时的升级。

    希望这些知识能够帮助你全面、高效地优化HTTP协议!

    展开全文
  • Java基础常见笔试题总结

    万次阅读 多人点赞 2018-01-30 21:32:31
    以下是自己总结的一些Java常见的基础知识题,答案仅供参考,如有异议请指出。一直保持更新状态。 1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机...
  • 然而,白矮星的运行机制却曾是天文界的一大难题,因为经典物理解释不了白矮星为何会有如此大的密度,然而白矮星在宇宙中却又是如此常见的一种星体。 纵观恒星演化的历史,从诞生到“死亡”,便是抵抗星体自身...
  • 敏捷开发与极限编程

    2014-02-11 23:35:03
    敏捷开发与极限编程作者: 陈沛 (系摘编) 软件设计方法可以区别为重量级的方法和轻量级的方法。重量级的方法中产生大量的正式文档。 著名的重量级开发方法包括ISO9000,CMM,和统一软体开发过程(RUP)。...
  • 常用求极限的方法

    千次阅读 2018-12-19 23:40:01
    1. 两个重要极限 (1).lim⁡x→0sin⁡xx=1\lim\limits_ { x \rightarrow 0} \frac {\sin x }x = 1x→0lim​xsinx​=1 (2).lim⁡x→∞(1+1x)x=lim⁡x→0(1+x)1n=e\lim\limits_ { x \rightarrow \infty } {( 1+...
  • 敏捷建模和极限编程(XP)

    千次阅读 2012-06-28 01:30:51
    Agile Modeling and eXtreme ...敏捷建模和极限编程(XP) Agile Modeling (AM) is a practices-based software process whose scope is to describe how to model and document in an effective and agile
  • 极限编程感悟

    千次阅读 2007-01-08 09:10:00
    极限编程又称xp方法,是敏捷开发的软件过程模型。极限编程的4条准则:沟通,简单,反馈和勇气(修复缺陷,集中攻关和放弃原有的代码)。基本原则:快速反馈,假设简单,递增更改,提倡更改,优质工作。开发软件的4项...
  • Seaborn常见绘图总结

    万次阅读 多人点赞 2019-01-24 15:52:55
    听“他们”说matplotlib中的seaborn绘图很好看而且实用,所以,这里系统的总结一下seaborn常见的图形绘制。其目的也是很简单的啦,方便我自己查看(英文很菜,每次都查单词……)。 差点忘了,这里使用的数据还是...
  • 第 3 章 极限导论 如果没有极限的概念, 那么微积分将不复存在. 这就是说,我们要花大量的时间来研究它们. 恰当的定义一个极限是非常有技巧的,但在没有对细节深入讨论的情况下,你也可以得到一个对极限的直观的理解...
  • 敏捷开发纵横谈(2)——极限编程

    千次阅读 2013-10-01 12:41:21
    极限编程,英文:Extreme Programming,简称:XP编程。这是在SCRUM之前流行的敏捷方法,这是一种轻量、快速、强调适应变化、适合中小型项目的项目管理方法。
  • 极限初学者常遇到的几个坑(一)

    千次阅读 2016-11-03 19:21:08
    极限是高等数学最开始的一个章节,也成为了很多初学高数的人遇到的第一个“天堑”。在初学极限的时候会有一些题目,不仅学渣遇到了会跪,即使是大神也屡跪不止。其实这些极限基本上都是一些坑。笔者两年以来被很多人...
  • 极限求法总结(一)

    2020-05-31 12:51:22
    目录极限的定义极限的相关性质 极限的定义 X1. (数列极限的ξ\xiξ-N定义)设{xnx_nxn​}为一数列,如果存在常数a,对于于任意给定的正数ξ\xiξ(不论它多么小),总存在正整数N,使得n>N时,不等式|xnx_nxn​-...
  • lim⁡x→∞\lim\limits_{x\right...几种常用的极限: 1.lim⁡x→∞qn=0\lim\limits_{x\rightarrow\infty} q^n=0x→∞lim​qn=0        ∣q∣<1|q|<1∣q∣<1 引申:    &n
  • 正态分布在统计学上十分重要,经常用在自然和社会科学来代表一个不明的随机变量。 也就是说,正态分布一种分布形式,它实际上有很多表示形式,最常见的有概率密度函数,累计分布函数等等来表示。 在OI界出过的也...
  • 有理化多项式 重要极限公式 等价无穷小 洛必达法则
  • 第一章-函数与极限

    千次阅读 2018-09-23 13:35:06
    1. 高等数学第六版上册的第一章主要是关于函数与极限的,其中占主要部分的是极限 数列极限标准定义:对数列{xn},若存在常数a,对于任意ε>0,总存在正整数N,使得当n>N时,|xn-a|<ε成立,那么称a是数列{...
  • 抽样分布、大数定律与中心极限定理 抽样分布 抽样分布即为统计量的分布 。 抽样分布与概率分布比较 相同点:都是概率分布 不同点: 分类角度不同,常见的概率分布是从分布形态角度出发进行分类的,而抽样分布则是...
  • 嵌入式系统功耗极限优化

    千次阅读 2013-12-23 23:39:02
    芯片设计除了要满足功能和规格需求外,功耗也是必不可少的一项重要指标。芯片架构设计由一系列设计决策构成,包括软硬件划分,IP选型,核型配置,核数确定,时钟频率确定,内存规划等,每一项设计决策都会对功耗产生...
  • 中心极限定理说明很多独立随机变量的和近似服从正态分布。 二,在具有相同方差的所有可能的概率分布中,正态分布在实数上具有最大的不确定性。 因此,我们可以认为正态分布是对模型加入的先验知识量最少的分布。 ...
  • 大数定律&中心极限定理

    千次阅读 2014-05-08 21:08:21
    来自:百度百科   大数定律:     ----------------------------------------------------------------------------------------------------------------------------------- ...中心极限定理
  • 为什么不要问我DB极限QPS/TPS

    千次阅读 2017-08-10 20:16:22
    背景 相信很多开发都会有这个疑问,DB到底可以支撑多大的业务量,如何去评估?...我们假设两种极限场景: 极限场景一,所有SQL 都是主键等值查询。极限场景二,所有SQL 都是走不上索引的全表扫描。这两种场景
  • 性能测试常见指标

    万次阅读 多人点赞 2017-11-30 10:54:03
    最近在学习性能测试的东西,对于一些常见性能测试指标做些总结,保存在这里方便后期查阅,文中摘抄自某大神的博客,文末放原文链接,有需要的童鞋可以更深入了解!       什么是性能测试?   压力测试:...
  • 概率论几种常见分布

    千次阅读 2020-02-27 21:03:31
    概率论几种常见分布正态分布概要分析泊松分布适用范围伽玛分布对数正态分布 本文也算是一种对大学知识的...正态分布在统计学上十分重要,经常用在自然和社会科学来代表一个不明的随机变量。 概要 正态分布是自然科...
  • mysql常见知识点总结

    万次阅读 2019-10-08 11:51:53
    对于数据库来说,这点很重要,如果设计不当,会直接影响访问速度和用户体验。影响的因素很多,比如慢查询、低效的查询语句、没有适当建立索引、数据库堵塞(死锁)等。当然,有测试工程师的团队,会做压力测试,找...
  • 常见损失函数

    千次阅读 2017-05-08 09:21:36
    损失函数(loss function)是用来估量你模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来...损失函数是经验风险函数的核心部分,也是结构风险函数重要组成部分。模型的结构风险函
  • 规模比例缩放的极限和困局

    千次阅读 2020-03-08 15:08:06
    即便是内骨骼动物,也并非完全放弃了外骨骼被动防御的策略,对于比较重要的器官,还会实施类似外骨骼般的被动防御,比如保护大脑的骷髅,比如保护心脏和肺的排骨等等: 骷髅封闭状,既防冲撞,又防刺。 排骨散列状,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,601
精华内容 11,040
关键字:

常见的重要极限