系统性能问题解决的银弹

仔细观察一下我们现有的系统,小到一颗CPU,达到一个在线交易系统。任何性能问题都可以通过一种方式有效的解决,这种方式就是缓存。不错,缓存几乎可以成为解决性能问题的银弹,百发百中。缓存的主要目的是降低数据访问延时,实现手段多种多样,下面对不同种类的缓存进行介绍。

CPU的缓存

能想到的最小粒度的缓存恐怕就是CPU的缓存了。CPU不但有缓存,而且将缓存分成了多种级别,如图1所示,分别是L1、L2和L3 3级缓存。其中L1和L2是一个核心独享的缓存,而L3是同一颗CPU内的多个核心共享的。图1架构是目前CPU中最常见的架构,而CPU关于缓存的架构细节比这个还要复杂。多数CPU是将缓存分为指令缓存和数据缓存2中类型的缓存,有些还有一种称为TLB(translation lookaside buffer)的缓存,用于实现虚拟内存到物理内存的快速转换。


图1 CPU缓存架构

缓存并非一直存在于CPU之中,以Intel的CPU为例,其在1992年才在386 CPU中引入L1 Cache。而L3Cache的引入则到2008年才在Core i3中引入。如图2是不同存储类型访问时延的差异,以寄存器访问1单位,那么内存的访问在100单位左右。也就是说,内存的访问延时是寄存器的100倍。


图2 不同存储访问性能对比

基于上述原因,在新一代的CPU设计当中增加了缓存模块,其目的就是降低访问内存数据的时延。使用Cache提升性能的原理在于数据访问的局部性特点,分别是区域局部性和时间局部性。
  • Spatial Locality:对于刚被访问的数据,其相邻的数据在将来被访问的概率高。
  • Temporal Locality:对于刚被访问的数据,其本身在将来被访问的概率高。

操作系统缓存

在操作系统层面很多地方都用到了缓存。而操作系统缓存的原理与CPU缓存基本一致,也就2个局部特性。在操作系统中最著名的缓存恐怕就是文件系统的页缓存了吧。同样参考一下图2,可以看到访问磁盘的时延是内存时延的10万倍,因此Linux操作系统中所有文件系统都采用缓存来提升其读写性能。
除了上面内存访问性能与磁盘访问性能的差异因素外,另外一个因素是机械磁盘随机访问与顺序访问的性能差异。以企业级SATA磁盘为例,随机写的带宽不到1MB/s,而顺序写可以轻松的达到100MB/s,差异多大100倍。产生如此大差异的原因主要是机械磁盘读写数据需要寻址,寻址所消耗的时间占整个请求时间的比例很大。
鉴于上述2个因素的考量,大多数文件系统都实现了基于内存的缓存。这样,用户对于文件系统的访问性能得到了大幅的提升。缓存的主要从两方面提升访问文件系统的性能,一方面是降低对磁盘的直接访问,另外一个方面是将对磁盘的随机访问尽量转换为顺序访问。
对于第一个方面,文件系统数据写入缓存后即认为数据写入成功,向上层返回结果。由于访问内存的性能是访问磁盘性能的10万倍。因此,性能自然可以得到极大的提升。如图3所示的上半部分逻辑,写请求依次将数据写入缓存中。对于读请求也有类似的处理,文件系统中称为预读,也就是将数据提前读取到缓存,从而降低访问磁盘的频度。

图3 文件系统页缓存

对于第二个方面,由于缓存的存在,当从缓存向磁盘刷写数据的时候以数据的LBA进行排序。这样能够降低机械磁盘寻道的时间消耗比例,进而提升系统整体的性能。

Web前端的缓存

在大系统层面我们以Web应用为例介绍从前端到后端的缓存技术。这主要是因为在Web开发领域缓存的应用最为广泛,非常方便我们了解问题。缓存的技术领域很广泛,技术的难度也很深,本文无法面面俱到,只是抛砖引玉。
熟悉前端开发的同学都清楚,一个网站除了动态的内容外,还有很多图片、JS脚本和CSS样表等内容。而图片、JS脚本和CSS等内容一方面量比较大,另外一方面很少变化,除非网站升级。鉴于上述原因,我们是否可以将这些内容缓存到用户的本地磁盘,这样当用户再次访问网站是就可以直接从本地磁盘加载这些内容,而不需要从经过浩瀚的网络。

图4 浏览器页面请求

实质上浏览器已经具备该功能,准确的说不是浏览器,而是HTTP协议。如图我们打开调试工具,可以看到请求网页的很多内容并不会从服务器请求,而是从本地磁盘或者内存获取。如图是请求某个网站页面时部分内容的情况。可以看到很大一部分并非从服务器获取。
图5 Web浏览器缓存处理流程

从本地获取有2个非常明显的好处,一个是页面的响应时间很快,另外一个是Web服务器的压力得到有很大的降低。
在HTTP中是通过其响应消息头来确定是否使用缓存中的内容的,这个消息头就是Cache-control,当然还要其它一些字段的配合。整个缓存处理的流程还是比较复杂的,需要根据不同的字段作出判断,以便确定从哪里获取内容。如图是整个浏览器的处理流程。
图3是通过浏览器的调试工具截获的某东主页的一个图片的响应头内容,从图中可以看出里面包含了缓存控制相关的内容。
图6 Web缓存的HTTP协议

浏览器缓存的内容博大精深,很难在本篇文章中解释完全。如果大家想深入的了解这方面的内容,本号推荐大家看看《HTTP权威指南》,理解解释的非常详细。

访问链路层面

在Web领域一个请求的链路可能会非常长,比如我们访问一个美国的网站,整个通信链路会跨越整个太平洋,距离近2万公里。即使是阳光也要跑几十毫秒才能完成这段里程,而网络需要经过各种中继设备,耗时将近200ms。试想,一个网页通常有上百个元素组成(例如图片,js脚本等),这样在中国打开一个美国的网站将消耗多少时间?
解决上述问题最为有效的技术就是CDN(Content Delivery Network,内容分发网络)技术,该技术通过分部在离最终用户比较近的边缘服务器提供更快的服务。以上文网站为例,当用户从中国访问美国的网站时,会先从国内的CDN节点获取内容,如果没有才会从美国的源服务器获取内容。因为大部分内容都可以从国内获取,免去了跨越大洋造成的网络延时。

图7 CDN示意图

图7是一个CDN的示意图,其中ORIGINAL SERVER就是源服务器,而EDGE SERVER就是边缘服务器。从图中可以看出,终端用户的访问路径。

Web后端的缓存

对于Web服务来说,通常通过关系型数据来存储数据,而数据库的数据通常存储在磁盘中。在高负载场景下数据库往往会成为性能瓶颈。因此,为了提高整个服务的承载能力,往往在业务服务器和数据库之间添加一个缓存服务。这个缓存服务的原理其实与上述的CPU缓存或者文件系统缓存有异曲同工之妙。
由于对于一个Web服务来说,80%以上的请求都是读请求,Web缓存的设计也正是基于这样一个事实。这些数据完全可以缓存到内存中,从而减少数据库访问的负载。由于缓存承载了绝大多数的读请求,因此整个数据库的负载也得到很大的降低。


图8 Web服务缓存

如图8是使用Redis缓存的Web服务架构,本文只是一个简化的架构,实际架构要复杂的多(需要考虑可靠性和承载能力等)。在本架构中业务服务器会根据请求类型优先访问缓存,并根据策略更新缓存内容。目前使用最多的缓存应该是Redis缓存,大家可以深入了解一下。
本文从微观到宏观,从不同的层面介绍了缓存在提升系统性能方面的应用。当然,缓存的应用领域比本文涉及的还要多得多。这里只是一个引子,希望大家能够得到一些启发,为自己系统的性能优化提供一些思路。

参考文献

  1. 理解 CPU Cache
  2. 维基百科 CPU Cache
  3. How The Cache Memory Works
  4. 前端优化:浏览器缓存技术介绍
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容