4DRadar-服务器芯片-分布式存储-刀片电池解析
4DRadar-服务器芯片-分布式存储-刀片电池解析
参考文献链接
https://mp.weixin.qq.com/s/o6NrPzzBXePSvHCwN0TNdA
https://mp.weixin.qq.com/s/57kUvjVvOu8yhR60QhI5FA
https://mp.weixin.qq.com/s/EVaeHAYY8wjvLEfQFdVzxw
https://mp.weixin.qq.com/s/KUF7QobR9g21fSApouGPZg
https://mp.weixin.qq.com/s/AFrJqF1T_hU8fDgy230uTg
4D毫米波雷达处于革命前夜
自动驾驶需要构建全频谱感知能力
在汽车智能化发展道路中,感知系统是至关重要的一环,理想的自动驾驶系统需要全天候、全覆盖、全目标、全工况的感知。当前的自动驾驶技术水平离理想目标还有较大差距,为了实现高阶自驾,需要在全频段上构建感知系统,有效融合各频段传感器的优势,为规划控制提供准确有效的信息。
现阶段自动驾驶技术中,主要用到的传感器有摄像头、激光雷达和毫米波雷达。摄像头的光谱从可见光到红外光谱,是最接近人眼的传感器,有丰富的语义信息,在传感器中具有不可替代的作用,比如红绿灯识别、交通标识识别,都离不开摄像头的信息。激光雷达器件较为成熟,905nm波段广泛应用,能获得丰富的场景立体空间信息。从频谱可以看到,激光在频谱上和可见光较为接近,因此和可见光有着相似的粒子特性,容易受到恶劣天气的影响。而毫米波雷达波长为3.9mm附近,是这几种传感器中波长最长的传感器,全天候性能最好,且具备速度探测优势。
摄像头和激光雷达由于有较为丰富的信息,前期的自动驾驶感知研究主要集中这两类传感器,毫米波由于分辨率不足导致其在使用上存在局限性。近年来,各大毫米波厂商在4D毫米波雷达上加大投入,在超宽带和大天线阵列两个方向上取得了一些进展,这使得4D毫米波的研究成为了自动驾驶研究的热点之一。
4D毫米波雷达突破了传统雷达的局限性
随着毫米波芯片技术的发展,应用于车载的毫米波雷达系统得到了大规模应用,然而传统雷达系统面临着以下缺陷:
- 当有静止车辆,目标信息容易和地杂波等掺杂在一起,识别难度较大,而移动车辆可以靠多普勒识别。
- 当有横穿车辆和行人, 多普勒为零或很低,难以检测。
- 没有高度信息,高处物体如桥粱路牌和地面的车辆一样区分不开,容易造成误刹,影响安全性。
- 角度分辨率低,当两个距离很近的物体,其回波会被混在一起,很难知道有几个目标。
- 用雷达散射截面积区分物体难:可以通过不同物体的雷达散射截面积的不同和不同帧之间的反射点的不同来区分路牌、立交桥和车辆,然而准确率并不高。
- 最远探测距离不超过200 m,探测距离范围有限。
而4D毫米波雷达技术突破了传统车载雷达的局限性,可以以很高的分辨率同时探测目标的距离、速度、水平方位和俯仰方位,使得:
- 最远探测距离大幅可达300多米,比激光雷达和视觉传感器都要远
- 4D毫米波雷达系统水平角度分辨率较高,通常可以达到1 的角度分辨率,可以区分 300m 处的两辆近车
- 4D毫米波雷达系统可以测量俯仰角度,可达到优于2°的角度分辨率,可在 150m 处区分地物和立交桥。
- 当有横穿车辆和行人, 多普勒为零或很低时通过高精度的水平角和高精度的俯仰角可以有效识别目标。
- 目标点云更密集,信息更丰富,更适合与深度学习框架结合。
4D毫米波雷达的先驱者
为对4D成像雷达系统有更系统的认识,这里我们列举了近年来市面上几种常见的成像雷达系统方案,其中包括TI公司、Arbe公司、Uhnder公司。
在TI公司早期推出的毫米波雷达芯片AWR1243中通过发射FMCW信号来探测目标的距离和速度,而使用时分波形的方式将三个发射和四个接收构成的12个虚拟通道来探测角度,然而受限于角度分辨率,其获取的目标信息有效。而TI公司于19年推出了自己的毫米波雷达系统级联方案,其级联效果如图1中所示,通过将四个三发四收的单个MIMO芯片级联方案可以构成12发16收的MIMO雷达阵列,此时雷达系统的虚拟通道数可从12提升到了192,该方法可以极大的提升了雷达系统的角度分辨率。在图1所使用的级联雷达系统中水平角度分辨率可达到1.4°,俯仰角度分辨率可达到18°的效果。
目前国内有不少厂商依托于TI成像雷达系统的级联方案进行系统改进,以达到更好的角度分辨率,级联方案来搭建成像雷达系统已成为当下的主流技术。
图1 TI级联系统实物图
除了TI公司开发的级联雷达系统方案,以色列Arbe公司开发出了目前最大的48发48收级联雷达系统方案,其虚拟通道数可以达到惊人的2304,大大的提升了毫米波雷达系统的角度分辨率,与此同时随着虚拟通道数的增加,传统的处理器无法解决毫米波雷达系统信号处理和数据处理,Arbe公司也推出了自己的专用毫米波雷达处理器芯片,使得毫米波雷达系统的集成度更高,数据处理更加高效。图2中为Arbe公司成像雷达系统实物图,从图中可以看出该成像雷达系统采用口字型阵列来设计MIMO雷达,可同时在水平维度和俯仰维度探测目标。图3中为Arbe公司雷达专用处理器框图,从其展现的框图中可以看出,在该专用处理器中增加了其独有的雷达信号处理硬件加速模块,以更好的解决成像雷达系统中数据高吞吐量的问题。
从Arbe的技术方案中可以看出,超大规模的MIMO阵列将可能是一种技术趋势,而在使用超大规模MIMO阵列后需要考虑产生的海量数据如何有效处理的问题,因此专用的成像雷达系统硬件加速模块是需要的,关于这点国内还比较空白。
图2 Arbe成像雷达系统实物图
图3 Arbe成像雷达系统专用处理器框图hnder公司---PMCW雷达的领跑者
不同于传统FMCW信号波形,Uhnder公司采用的PMCW波形通过多天线同时发射正交相位编码信号的方式来探测目标的距离和速度,该方案不仅可以探测更远距离,同时在有效探测目标的同时可以有效的抗除雷达与雷达之间的相互干扰。在19年的ISSCC论文[1]中Uhnder公司已经发表了其相关研究成果,在单科芯片中集成12发16收的雷达阵列。
图4 Uhnder公司高集成成像雷达系统[1]
4D毫米波成像雷达系统中的难点
总结以上公司的技术演进路线,我们可以发现在4D毫米波成像雷达系统存在以下亟需解决的技术难题:
在4D毫米波雷达系统中,通过MIMO使得系统虚拟通道数得到了极大提升,因此如何设计阵列以达到高精度的角度分辨率成为其中的一个难题。在已有的学术研究[2]中将12个3发4收的MIMO芯片进行级联,构成36发48收MIMO雷达系统,可达到1728个虚拟通道。而文中通过遗传算法来设计稀疏阵列,使得雷达孔径更大,水平角分辨率可达到0.78°,俯仰角分辨率可达到3.6°。可以发现随着天线数的增多,在未来的成像雷达系统中,其阵列排布和角度分辨率将会得到更一步的优化和提升。
(a)
(b)
(c)
图5 文献[2]中的4D成像雷达系统;(a)芯片级联硬件实物;(b)优化后的36发48收稀疏阵列示意图;(c) 优化后的36发48收稀疏阵列实物图成像雷达波形设计问题
与传统相控阵雷达相比,MIMO雷达的最大特点在于采用波形分集技术。波形相关系数是表示波形分集的重要参数,MIMO雷达的各天线发射正交信号,波形间的相关系数为0,在空间形成低增益宽波束,接收端通过DBF合成多个接收波束,实现覆盖大空域的探测。对于MIMO正交波形设计,使用者希望设计的波形尽可能地具备高分辨率、低旁瓣、良好的正交性,目前常用的四种方法为时分复用(TDMA)、频分复用(FDMA)、多普勒分集复用(DDMA)、码分复用(CDMA)等。表1中对各类正交波形做了总结,现有的雷达芯片中已经可以支持交替发射TDMA、CDMA和DDMA波形,因此如何复用波形以提升阵列使用效率成为设计者应该思考的问题。
表1正交波形总结
随着车辆使用毫米波雷达系统的增多,雷达与雷达之间的干扰日益严重,如图6中所示雷达B1和雷达B2在相同的中心频率内使用线性调频信号,很容易产生相互之间的干扰,为此如何消除系统干扰成为待解决的难题。
图6 雷达与雷达之间相互干扰示意图
为此,不同的公司开发出不同的方案来解决该问题。如图7中所示,为Arbe公司的波形设计专利中使用多个频率跳动的窄带信号合成宽带信号来规避雷达之间的相互干扰。当然,该方法的正确与否还有待研究与挖掘。
图7 Arbe专利中的跳频波形设计以消除雷达之间的干扰
随着毫米波雷达系统通道数的增多,传统的处理器无法满足毫米波雷达系统大吞吐量数据的需求,因此迫切需要设计符合大阵列大吞吐量的雷达专用处理器芯片,近年来除了arbe公司提出了自己的专用处理器方案外,也有像NXP这样的老牌玩家在设计相关的雷达专用处理器模块。
4D毫米波雷达的深度学习初探
4D毫米波雷达相较于传统的3D毫米波雷达有更丰富的信息,如何有效的将深度学习框架应用到4D毫米波雷达中是自动驾驶性能提升的关键技术之一。从传统3D毫米波雷达的信号处理流程中我们可以看到,频信号经过ADC后接入毫米波预处理流程,经过距离和速度2个维度的FFT之后,进行CFAR检测在空间维度上剔除大量噪声,然后利用第3个维度的FFT来获取波达角,生成稀疏点云,继而进行聚类和跟踪,最后进行目标分类后输出。
图8 TI IWR6843雷达信号处理框图
4D毫米波雷达增大了天线阵列,除了能增加高度信息外,还能提供更为丰富的点云信息,当点云信息足够丰富时,我们可以借鉴激光雷达的信号处理方式,采用类似于Voxelnet、CenterPoint、PointPillar等3D或2D网络来进行特征提取和识别。
在最新的研究中,也有人提出在进行距离和速度2个维度的FFT之后,不进行CFAR步骤,而直接进行第3个维度的FFT来获取4D张量信息,然后基于这个4D张量进行特征提取和识别。这种方式可以最大程度地保留有效信息,但是由于没有进行CFAR步骤,需要处理的数据量非常大,对于系统的带宽和算力都提出了较高的要求。
图9 文献[3]中基于张量的4D雷达识别方法
毫米波雷达与激光雷达----路在何方?
总体而言目前毫米波雷达系统仍处于百家争鸣的战国时代,尽管每家公司的雷达系统方案并不相同,然而都面临着算法和硬件系统的困境,亟需从算法、芯片和系统层面解决以上问题。
随着毫米波雷达系统的发展,其角度分辨率会逐渐逼近0.1°,而达到一些低端激光雷达的效果。不同于激光雷达系统直接对点云数据处理的固定方式,4D毫米波雷达系统自由的阵列和波形设计提高了系统的使用门槛,但也给了用户更多的发挥空间。而毫米波雷达系统相比于激光雷达,其波长更长,具有较为适宜的大气窗口,在全天候方面更具优势。FMCW在毫米波雷达上的成功经验已经被借鉴到激光雷达领域,1550nm FMCW激光雷达技术增加了速度维信息,抗干扰能力强,但离成熟商用还有一段时间的路要走。
参考文献:
[1] V. Giannini et al., "9.2 A 192-Virtual-Receiver 77/79GHz GMSK Code-Domain MIMO Radar System-on-Chip," 2019 IEEE International Solid- State Circuits Conference - (ISSCC), 2019, pp. 164-166, doi: 10.1109/ISSCC.2019.8662386.
[2] D. Schwarz, N. Riese, I. Dorsch and C. Waldschmidt, "System Performance of a 79 GHz High-Resolution 4D Imaging MIMO Radar With 1728 Virtual Channels," in IEEE Journal of Microwaves, 2022, doi: 10.1109/JMW.2022.3196454.
[3] K-Radar: 4D Radar Object Detection Dataset and Benchmark for Autonomous Driving in Various Weather Conditions.https://doi.org/10.48550/arXiv.2206.08171
服务器逆势增长,或成半导体需求中“最靓的仔”
不久前,中国移动公布了2021-2022年PC服务器集中采购第二批次的结果,本次采购规模为47845台,而此前中国移动第1批集采及补采共采购204696台。
除此之外,电信、联通国产招标亦在推进中,因此,服务器招标的持续推进,给半导体的寒冬带来了丝丝暖意,成为为数不多的仍具备较高需求的领域,也带动了相关产业链的蓬勃发展。
ARM架构服务器已成大趋势
服务器自诞生以来已经经过了多次的更迭,随着近些年半导体技术的高速发展,互联网和云计算的日新月异,以及人工智能的推广和5G通信引发的边缘计算的火热,推动服务器逐步更新迭代形成当前的格局,那就是边缘计算服务器、AI服务器、云服务器和传统服务器,四者瓜分服务器的天下。
根据IDC数据显示,2021年全球服务器总体市场规模达到992亿美元,同比增长9%,出货量达1353.9万台,同比增长11%,仍然保持较快增长。这其中,中国服务器市场销售额为1632亿元,同比增长15.9%,出货量为391.1万台,同比增长11.7%。
从2021年全球市场份额来看,戴尔、惠普稳居前列,浪潮信息位列全球第三。
需要注意的是,在国内互联网、信创市场高速发展的背景下,国产服务器厂商近年来增速迅猛,尤其是浪潮信息,已经逐渐缩小和戴尔、惠普的差距。而且,从国内服务器市场格局来看的话,目前已经属于浪潮一家独大,紧随其后的则是新华三和华为(现为超聚变),三家国内品牌厂商市占率位居国内前三,CR3超过58%,行业集中度较高,竞争格局稳固。
此外,x86服务器目前仍是最主要的服务器种类,2021 年 x86 架构的服务器占据全球服务器 97%以上市场份额,在非 x86 市场中,近年势头迅猛的 ARM 芯片占比达到了 2.07%。而在 x86 领域里, Intel 在全球服务器市场的份额达到了80%以上,AMD自从2019年推出EYPC处理器之后,市场份额便不断增长,目前AMD在服务器的市场份额已经达到25%以上。
不过,ARM 架构的服务器近年来深受互联网大厂的青睐,ARM 以低能耗、高效率、发展时间长的优势占据移动终端市场的主导地位,并且在 PC 桌面端苹果 MacOS 已经采用了 ARM 架构。在服务器方面 ARM 正逐渐被更多企业应用,华为、飞腾、阿里平头哥积极布局 ARM 架构服务器 CPU 赛道,都已经推出了国产 Arm 服务器 CPU。
“预计Arm今年可以拿下全球7.1%服务器CPU市场,明年随着英伟达的CPU发布,将有可能带动ARM架构服务器大爆发。”有研究员对笔者表示,因为英伟达进场后,将直接把AI生态迁移至ARM,而且全球云计算巨头都在往arm迁移,虽然ARM自己预计2025年能达到20%的市场份额,不过我认为2024年应该就可以完成。
9月15日,为了应对需求,Arm宣告推出下一代数据中心芯片技术——Neoverse V2。该平台将为云和HPC工作负载提供市场领先的整型性能,并引入若干Armv9架构安全增强功能。
服务器即将迎来出货量高峰
从各方公布的数据来看,服务器目前并未像其他领域一样受到通胀、战争等因素的影响,仍然保持较为稳定的增速,而且,AMD和Intel此前已经换代了产品,虽然Intel最新产品再次跳票,但是预估AMD年底可以正常推出新产品,而且,新一代产品的性价比也将会有所提升,因此,服务器出货量理应再上一个台阶。
此前,有美资机构指出,第二季全球服务器出货量总计410万台,季增12%、年增13%。由于零组件供应改善,特别是来自美国超大规模(hyperscale)企业的需求,显示出持续强劲的年增长。
笔者从全球四大云计算巨头AWS、Azure、Google Cloud和阿里云二季度的财报中发现,虽然宏观经济下行,但云计算公司Capex仍保持在历史高位,且主要投入方向仍是集中在服务器。
与此同时,出了国内除了互联网上云外,信创也在持续推进,自2020年电信行业率先开展行业信创以来,三大运营商服务器集采全面开花,每年均保持稳定的增长。
日前,中国移动公布2021-2022年PC服务器第二批次集中采购结果,本次采购规模为47845台,而此前中国移动第一批次集中采购204696台;中国电信在今年2月份公布的2022-2023 年服务器集中采购数据显示,总中标金额约 130 亿元,规模大超预期;而中国联通2月份集中采购44818 台云服务器。
可以看到,无论是国外的云巨头资本开支维持历史高位,还是国内信创持续发力加大对服务器的集采,多方面因素都利好对服务器需求的拉动。
此外,作为交叉验证,BMC 芯片龙头信骅科技Q2单季盈利5.63亿元新台币,创历史新高,季增20.37%,年增87.04%。而每台服务器最少需要配备一片 BMC 控制芯片,因此,信骅科技营收数据可作为服务器行业景气度的前瞻指标,能够提前 2-3 个月反映服务器市场景气度变化。
随着信骅科技营收的持续增长,在一定程度上也体现出全球服务器景气度上行,服务器厂商出货量高峰或已临近。
TrendForce集邦咨询则表示,预计第三季全球服务器整机出货量仍有季增6.5%的幅度,主要受疫后企业加速上云的需求动能持续支撑,预计整个全年服务器整机出货量将成长5.1%。
芯片战争:国运背后的终极竞赛
壹 “硅对钢的胜利”
1991年1月17日凌晨,当美军第一枚导弹砸向巴格达时,睡梦中被惊醒的萨达姆并不怎么惊惶。
此前几个月,美国一直忙着调兵遣将,海湾地区已经集结起美军三个航母战斗群,但萨达姆充分展示了楞的不怕横的二愣子本色,在他看来,自己手下拥兵百万,要人有人,要装备有装备,跟谁打也不怵。
意气风发的萨达姆,如今坟头草都两米高了。
单从纸面上看,当时伊拉克军队常规武器装备,比当时的中国军队还要强些。萨达姆的如意算盘很简单:美国人接受不了多少牺牲,只要把美军拖入战争泥潭,迟早能把美国人的耐心耗没,然后退兵。越南战争不就是如此么?
但这一次,剧本变了。
严阵以待的伊拉克军队,并没有看到预想中的敌人,朝他们飞袭而来的,是100多枚来自美军军舰的“战斧”式巡航导弹,代号“沙漠风暴”的军事行动正式开始。
此后一个多月时间里,伊拉克军队始终没有看见一个敌人,只有数千枚导弹从天而降,将伊拉克的防御系统摧毁殆尽。与以往司空见惯的地毯式轰炸不同,这一次取而代之的,是外科手术般的精确打击:
对伊拉克参谋部的空袭,炸弹直接准确地从烟囱里钻了进去;对飞机库的轰炸,美军先炸开大门,再把导弹送到机库里;装备先进传感器的预警机,使伊拉克飞机刚起飞便被发现击落,根本没有机会升空。
整个世界都看得目瞪口呆——原来,打仗还可以这样打?
后来的地面战争大同小异,看似强大的伊拉克百万雄兵,在多国部队的各种高精尖武器打击下,如摧枯拉朽一般灰飞烟灭。这场仗打下来,美军因战事死亡的士兵还不到200人,给全世界上演了一课什么叫高科技战争。
海湾战争中大显神威的“战斧”导弹
当时冷战已接近尾声,包括中国在内的很多国家作战思维还停留在二战时期,以为只要凭借钢铁洪流和人海战术就能取得胜利。直到海湾战争才发现,时代变了。
当时伊拉克军队装备的是一水儿的苏制武器,其中T-72坦克与美军M1A1坦克的性能对比,成为举世关注的焦点。
发生在巴士拉南部的坦克大战中,美军以近乎0的代价将200多辆伊军坦克全歼,取得压倒性的胜利。
T-72和M1A1同属第三代坦克, 为何差距如此之大?
原因在于,两者在信息化程度上存在巨大差距。M1A1普遍装备热成像仪、先进传感器和计算机火控系统,使美军能够先敌发现,先敌开火。
这场战争,后来被媒体称为“硅对钢的胜利”。
这是因为,美军使用的诸多高科技武器,从导弹、预警机、电子干扰机、隐形战机,到幕后功臣GPS系统——所有这些高科技装备,背后所倚赖的核心技术,都是半导体芯片技术。
而这一切优势的背后,是美国发达的半导体工业。
苏联半导体技术的止步不前,使得第三代苏式装备与美军有了明显的性能差距:苏-27装备的火控雷达,计算速度只有17万次/秒,而美军同代的F-15,已经达到了惊人的4000万次/秒。苏联导弹命中率有60米的误差,而美军导弹只有15米。
这种差距,追根溯源,来自过去半个世纪里,两国在半导体技术路线上的不同选择。草蛇灰线,伏脉千里,历史的每一次轰然巨变,源头往往都隐藏在并不起眼的细节里。
贰 “20世纪最重要的发明”
1947年,在当时世界上最强大的企业实验室贝尔实验室,威廉·肖克利和另外两位物理学家共同发明了晶体管,用于取代过去的真空管作为信号放大元件。顺便说一句,因为发明晶体管,这位老兄后来获得了诺贝尔物理学奖。
不过一开始谁也没想到,这个小小发明后来被称为“20世纪最重要的发明”,由此引发的半导体技术革命,更是彻底改变了未来世界的面貌,围绕它的争夺、竞赛、阴谋,影响了未来世界的整个地缘政治格局。
世界上第一个晶体管
今天的半导体工业,国与国之间的竞争激烈异常,但晶体管诞生的最初三十年里,整个半导体产业可以说完全是美国独领风骚的时代。
贝尔实验室诞生了第一只晶体管,德州仪器制造了世界第一台晶体管收音机,仙童半导体发明了集成电路,IBM推出了第一台跨越代际的集成电路计算机……野蛮生长,而又生机勃勃。
1965年,英特尔创始人之一戈登·摩尔在《电子学》杂志上发表文章,预测集成到芯片上的晶体管数量,每年将增加一倍。当时恐怕没有人想到,这个36岁的年轻人,精准地预测了20世纪下半叶人类信息革命的进程。
回望半导体发展史,这个行业所有最重要的理念、技术和产品,都诞生于那个时代的美国,尤其是硅谷。
二战结束后,一份名为《科学,无尽的前沿》的报告被摆上美国总统杜鲁门的案头,这份报告希望美国能够通过巨量资金支持,激励科学家探索最前沿的科技,鼓励企业将科技成果向应用层面转化。
1957年,苏联率先发射了第一颗人造卫星,美国上下举国震惊,称之为“斯普特尼克时刻”。为了追上对手,美国加大太空竞赛投入,在太空电子设备中尽可能使用硅晶体管。
美国半导体技术的产业化之路,一开始最重要的推动力量,是美国的军工需求。五六十年代,美国军方的采购订单,为硅谷初生的半导体企业提供了70%的研发经费。集成电路刚发明的那几年,70%的政府资助来自空军。
1969年7月16日,阿波罗11号飞船登上月球,人类文明向太空迈出了一大步。在这一史无前例的宏大计划中,共使用了100万块芯片。
六十年代初,苏联与美国在尖端科技领域几乎看不出差别。当时的苏联,发射了人类第一颗人造卫星,下水试航了核潜艇,掌握了一亿吨级核武器和洲际导弹技术。赫鲁晓夫在演讲中狂妄地对西方外交官说:
“我们将埋葬你们。”
电子和计算机在当时还算新兴产业,苏联人的脚步也跟的很紧。在苏联科学家努力下,苏联晶体管的问世,只比美国晚了几个星期,1957年苏联便生产出了自己的晶体管收音机。
但后来的历史轨迹证明,在20世纪最重要的技术赛道,苏联人却做出了错误的判断。
叁 苏联如何错失半导体
1976年9月6日,苏联第11航空军的几架米格-25战机正在远东地区参加演习。当飞机接近日本海岸时,编队中由别连科上尉驾驶的米格-25突然转向,拉低高度避开苏联雷达,直接闯入日本领空。
如临大敌的美军飞机立即升空拦截,却意外发现,这架米格-25降落在日本北部一处民用机场——这架飞机居然是叛逃而来的。驻日美军立刻迫不及待的控制了飞机,然后用最快的速度将其大卸八块。米格-25的秘密,已经整整困扰了他们9年。
米格-25由苏联米高扬-古列维奇设计局研制,1967年首次亮相,专门用来拦截美军轰炸机。甫一问世,米格-25便刷新了各项世界纪录,成为当时飞的最高、速度最快的截击机,第四次中东战争期间,甚至做出过以高速甩开来袭导弹的壮举。
美国人如坐针毡,但一直搞不清楚,这架飞机的性能是怎么做到的。
一代传奇米格-25
别连科的叛逃让美军如获至宝,但美军工程师的拆解结果,却让整个五角大楼大跌眼镜。苏联人的技术在很多方面都出人意料的过时,其中最让他们惊讶的是,米格-25的电子设备使用的不是晶体管与集成电路,而是像葡萄串一样臃肿的真空管。
苏联人开始在半导体领域并不落后多少,但问题是,苏联领导人把预备第三次世界大战视为头等大事,他们发现,在核爆试验中,晶体管很容易被烧毁,而电子管抗干扰能力强的多,决策层于是脑袋一拍,决定走真空管小型化之路。
就这样,当美国的半导体产业在“摩尔定律”指引下狂奔时,苏联在20世纪最重要的技术革命中选错了方向。
当时苏联重视基础教育,培养的科学家和工程师数量是美国的两倍,在集中力量搞科研攻关上优势明显。但苏联的计划经济土壤,与半导体产业的进化规律,却是天然的不相容。
1967年,白俄罗斯一家半导体工厂坏了一台中压断路器,需要重装一台,副厂长在党委会上提出要求,经讨论后报给明斯克市电子工业管理局。由于是计划外,需求被层层上报到市计委和白俄罗斯计委,再层层审批拨款给一家断路器厂家。等工厂最终拿到需要的断路器时,已经是三个月过去了。
因此,当苏联人在如此僵化的体制下埋头追赶时,美国硅谷的工程师们,正在以每18个月将晶体管密度增加一倍的速度,将对手甩得连自己车尾灯都看不到。
60年代后期,苏联科学家开始觉察到,美苏在计算机领域的差距在拉大,但他们很难在自己的层面改变大局。计划经济的思维和模式,已经根植在这个国家的血液中。
苏联错过了半导体,也就错过了后来的计算机革命,错过了互联网革命。
这种差别在六七十年代尚不明显,1970年代,巅峰时期的苏联GDP一度接近美国的70%,但之后被对手越甩越远。三十年后,当美国进入信息社会,苏联整体上还停留在工业社会,与对手产生了代际的差距。
吴军博士在《浪潮之巅》中认为:“苏联落后的根本原因,就是错过了半个世纪以来围绕半导体集成电路的信息革命。”
这种影响,也一直延续到今天。苏联解体时,没什么像样的半导体产业,俄罗斯电子工业所需的芯片,也几乎全靠进口。俄乌战争中,俄军坠毁的导弹被发现,里面安装的竟然是来自中国温州产的电路板。
肆 “日本可以说不?”
海湾战争震惊了整个世界,作为美国的小弟,日本似乎也感觉“与有荣焉”,自信心爆棚。当时日本右翼代表石原慎太郎和盛田昭夫合作出了本书《日本可以说“不”》,书中说“没有日本的芯片,美国就打不赢这场战争。”
美军在战争中使用的高科技武器,确实大量使用了从日本进口的半导体芯片,美国人正开始担心,对日本芯片的依赖会带来国家安全。偏偏这时候,日本人不知趣地站出来打大哥的脸:“假如日本把芯片卖给苏联而不是美国,美苏军事力量会很快失去平衡。”
就差没冲大哥喊上一声:“走两步,没病走两步!”
不过,说起来美国人也怨不得别人,因为日本半导体工业的崛起,一开始全是美国人扶持起来的。
日本投降后,美国本打算对日本进行彻底的去工业化,消除其战争潜力,不料朝鲜战争爆发,军需订单源源不断地涌入日本,带动了日本经济的恢复。
德州仪器发明了晶体管收音机,但将收音机卖到全世界的,却是日本的索尼。
盛田昭夫在二战后的废墟中,创建了索尼公司的前身东京通信。他决意发展半导体技术,专门跑到美国取经,希望从美国的西部电气购买晶体管生产的专利授权。在美国,他看着纽约的帝国大厦不禁感叹:
“日本和这样的国家交战,真是鲁莽啊!”
当时冷战伊始,日本地处前线,所以美国人对日本发展自己的半导体技术相当宽容,甚至还慷慨地向日本转移了电视机、录音机、计算器等数百项技术。当时,几乎所有日本企业都在如饥似渴地从美国引进技术、学习消化。美国人在演讲中取笑,台上每翻动一页PPT,都会引起台下日本人争先恐后地记笔记。
不过,美国人很快就要笑不出来了。
作为追赶者,日本人在半导体技术攻关上,采取了后来被屡次证明有效、今天也正在被我们使用的策略,那就是:
整合资源,集中力量办大事。
1974年,日本政府制定“超大规模集成电路计划”,砸下720亿日元,整合全国产、学、研界资源集中攻关,结果只花了6年时间就攻下了美国30%的内存市场。
更让美国人窒息的是,日本产品不仅成本低,质量还超过美国同类产品。惠普电脑在内存采购招标中发现,日电、东芝的产品远超英特尔、德州仪器。
1983年,靠存储芯片起家的英特尔被日本企业逼到墙角,总裁安迪·格鲁夫破釜沉舟,不得不放弃已经毫无优势的存储芯片业务,全面转向集成芯片,方才起死回生。
到1986年时,全球前10大半导体企业中,有6家来自日本,前三名更是被日电、东芝、日立垄断。
更让美国人难以容忍的是,日本富士通公司提出要收购美国仙童半导体(Fairchild
Semiconductor)公司。在硅谷,仙童半导体是神一般的存在,英特尔、AMD创始人都曾在仙童工作。
80年代以前,美国半导体企业基本处于放任自主的状态。当时美国主流思想是自由竞争,很少干预企业经营。但现在,面对以举国体制发起进攻的日本半导体企业,美国人终于坐不住了。
英特尔创始人诺伊斯挺身而出,牵头成立了美国半导体工业协会(SIA),领导这场与日本人的芯片战争。
不过,硅谷的企业家们,以往很少与华盛顿的政客打交道,诺伊斯是产业界领袖,在政界却几乎毫无人脉。半导体协会的游说开始效果不大,直到后来他们第一次祭出了一个后来屡试不爽的大招:国家安全。
这一下,火终于被扇起来了。
今天的美国从总统到媒体,无不在大肆渲染中国威胁,但如果穿越回80年代,你会发现,报纸上连篇累牍都是日本威胁论。时任美联储主席格林斯潘在回忆录中回忆:
20世纪80年代末的日本,是“斯普特尼克危机”以来,让美国第一次如此强烈地感到外国威胁。
“日本威胁论”愈演愈烈,偏偏这时候,不知好歹的日本右翼宣称日本可以对美国说“不”。大洋彼岸的美国政客,很快用行动告诉日本人:不,你不能。
美帝的铁锤,很快就锤到了日本人头上。
1987年6月30日这天,美国三名共和党议员来到国会大厦前,他们每人手里都拎着一把大铁锤,身后还跟着大群新闻记者,很明显是要来搞事情的。
这些西装革履的政客们,将一台日本东芝公司生产的收音机放在国会大厦台阶上摆好,然后你一锤我一锤地将收音机砸了个稀烂,随行记者举起相机记录下这一刻。
第二天,议员抡大锤的照片登上了各大报纸的头版。
砸收音机事件的直接导火索,是不久前发生的“东芝事件”,也就是东芝公司违反“巴统”禁令,向前苏联出口了几台先进数控加工机床。但更大的背景是,当时美日之间不断升温的贸易摩擦,尤其是半导体领域的激烈竞争。
美国当年对付日本的套路,今天听来一如既往的熟悉:制裁日本头部公司,征收反倾销税,发起贸易战。
比如,1982年6月,美国通过钓鱼执法查出“IBM商业间谍事件”,逮捕了涉嫌窃取IBM技术的日立和三菱员工,对两家公司进行制裁。
里根政府派出了一个名叫莱特希泽的人,作为对日贸易谈判主将。请记住这个名字,30年后,这个素以性格强硬著称的鹰派人物将再次坐上谈判桌,只不过对手换成了中国。
美日之间虽说是谈判,但日本根本没有底气说不,最后不得不与美国签订《美日半导体协议》。根据协议,日本必须停止芯片倾销,而且要根据美方的核算成本,以“公平”的价格出售芯片,同时保证美国半导体在日本市场的份额达20%以上。
日本《选择》月刊回忆了这段不堪回首的历史,悻悻写到:
东芝事件发生后,日本领教了触怒美国的后果,日本半导体产业开始自主限制对美出口,放缓研发和投资,步入衰退之路。
曾经霸占世界半导体十大公司大半榜单的日本公司,到2005年下滑到了3家,而到了2016年,只剩下东芝一家在苦苦挣扎。
不过,过去三十年的积淀,毕竟还是给日本半导体产业留下了丰厚的遗产,日企在上游材料和设备环节仍然具有绝对优势——这种优势,必要时也能够转化为武器。
2019年日韩政治冲突中,日本限制对韩出口光刻胶、高纯度氟化氢等原材料,导致韩国半导体生产线差点停工,急得三星高层赶紧跑到日本疏通关系。
这也难怪,日本半导体产业陨落之路,虽说主要来自美国的打压,但韩国人的挖坑设陷,也实在是起到了“功不可没”的作用,韩国半导体产业崛起的过程中,对日本半导体产业的落井下石,很难不引起日本人的种种怨念。
伍 韩国人的进击
今天的韩国,人均GDP突破3万美元,妥妥的发达国家。但如果把时间往前推到上世纪60年代,韩国还穷的叮当响,北边邻居的生活水平要比韩国高得多。
70年代,韩国政府眼馋日本通过出口半导体产品赚取大量利润,决定向日本学习,发展半导体产业。
1983年,三星公司建立了第一座半导体工厂。此时的美国,半导体领域正被日本打的溃不成军,节节败退,他们正需要扶持一个小弟帮助狙击日本,一眼便看中了浓眉大眼的三星。
美国人很大方,马力全开地给三星输血。他们支持三星在硅谷成立研发团队,300多名美国工程师加入其中,使三星仅仅用了3年就掌握了256K内存的关键技术。
但当时半导体领域的龙头企业基本都在日本,三星只能在低端芯片上混口饭吃,中高端市场还是牢牢被日本人把持。
1986年,三星邀请日本事业部部长川西刚访问三星,川西刚开始并不想去,后来推脱不开才去了一趟。迎接他的,是令人眼花缭乱的贵宾接待,美女表演传统节目,甚至专门竖起了一座三星与东芝友好纪念碑。
在一连串的迷魂阵下,韩国人提出请川西刚看看他们的半导体工厂,然后在川西刚勉强参观后,顺势提出参观东芝大分工厂的要求——这可是当时世界上最先进的芯片厂。作为回礼,川西刚答应了。
日本人很快就会体会到这件事的苦果。
参观后不久,三星就把大分厂的生产部长给挖走了,然后建了一个与大分厂几乎一模一样的工厂。
比建厂更要紧的,是挖人。
80年代末,日本经济泡沫破灭,一大帮在东芝工作过的员工被韩国人挖走,光是资深的顾问,就有57人。日本NHK电视台后来还找到当事人问待遇,得知:
报酬是在日本拿到的3倍左右。
除此之外,每名日本顾问还给一套四室一厅公寓,配备秘书、高级轿车和司机。——没办法,人给的实在是太多了。
就这样,90年代初,在日本半导体企业内外交困之下,三星踩着日本企业的尸体大踏步前进。1992年,三星第一次超过日本企业,成为世界最大的内存厂商,此后保持领先至今。
问题是,为什么日本半导体企业被美国整垮,三星却安然无恙?
一方面,有日本企业作为前车之鉴,三星未雨绸缪,对美国白宫、议会、贸易部门展开了强大的游说攻势,强调如果自己倒下,日本企业将再次垄断市场,对美国不利。
另一方面,1998年亚洲金融危机,韩国迫于压力对外开放金融市场,结果美国资本如饿狼般涌入,大肆低价买入韩国企业股权,而三星,正是它们的首要目标。今天的三星,其实早已成为韩国人经营的美资企业。
交了“投名状”的三星,背后有华尔街的资本站台,不必再担心引起美国制裁,从此开始在半导体领域高歌猛进。伴随着电子工业的崛起,韩国人完成产业升级,步入发达国家之列。
2021年全球半导体企业排行榜,前三名韩国占了两个(三星和海力士),放眼全球,芯片先进制程领域,三星唯一的对手,只剩下台湾的台积电。
陆 决定台湾命运的“早餐会议”
台湾半导体的故事,要从一次不起眼的早餐说起。
1974年2月的一天,台北市南阳街一家不起眼的豆浆店内,七个人坐在一起边吃边聊。
这几个人个个大有来头,其中有台湾地区“经济部长”孙运睿,电信总局局长方贤齐,美国无线电公司微波研究室主任潘文渊等。这样几个人坐在一起,显然不是专程来吃早餐的,他们一边喝豆浆,一边讨论台湾经济未来的发展方向。
1913年出生的山东人孙运璿,毕业于哈工大电机工程系,后来随国民党败退至台湾,一直做到台湾省“经济部”部长,一度被视为小蒋的接班人。六七十年代, 他曾主持台湾“十大建设计划”,完成了台湾的基础设施建设。
50年代以来,台湾经济先是从劳动密集型的出口替代,逐渐发展到资本密集型的出口扩张,70年代已经达到了一定高度,但接下来怎么走?谁都没有了主意。
在美国工作多年的潘文渊对美国高科技产业的发展比较了解,他提出,半导体是电子工业最核心的部分,应该作为台湾产业升级的发展方向。这一建议得到了其他人的认同,兴奋之下几个人又讨论了从美国引进技术的可行性。
这次只花了300台币的“早餐会议”,无意中决定了台湾经济的未来。
不久后,台湾工研院成立电子工业研究所,思路上大致是:台湾当局出资,公司体制运营,高薪聘请专业人才。从美国无线电公司购买的专利技术,成为台湾芯片技术的最初来源。
1976年,大陆地区尚未脱离“文革”的混乱,台湾第一座3英寸晶圆厂拔地而起。他们进步神速,生产用于电子钟表的芯片,不到一年的时间良率便超过了美国无线电公司,以至于对方提出要买下这家工厂。
这种收购或合资的套路并不少见,对于后发经济体来说,自家产业很容易被外资通过这种方式控制。所幸,工研院深知这家工厂肩负带动台湾产业升级的使命,拒绝了美国人的提议,这才保住了台湾芯片产业的火种。
1982年,慧眼识英的孙运璿从美国德州仪器又挖来一名资深专家,后来成为台湾半导体产业发展的关键人物。此人回到台湾后创建了一家名为“台湾积体电路”的半导体公司,今天,人们通常称它为——台积电。那位专家,就是被称为“台湾半导体教父”的张忠谋。
今天回头看的话,台湾当局是颇具前瞻目光的,1991年发布的《十大新兴工业发展策略及措施》,把半导体、消费电子、精密机械等十大新兴工业列为发展目标,电子产业逐渐成为台湾经济的最大支柱,延续至今。
90年代经济巅峰时,台湾一个省GDP竟然能占到大陆的43.8%!当时高雄的纺织女工月薪都能超过1万元人民币,而上海的职工月工资只有几百元,两岸差距十倍不止。
对台湾来说,其财富的最大来源不是金融、地产,而是实打实的工业。这里面最重要的,又是以半导体为核心的电子信息工业,包括了台积电、联电、联发科、日月光、鸿海、和硕等一批世界级厂家。
2018年华为被制裁,“卡脖子”中最关键的一环,便是无法获得台积电生产的先进制程芯片。实际上,台积电不仅卡着华为的脖子,也卡着全球半导体工业的脖子,2021年,台湾半导体产业占据了全世界64%的产能,很多消费电子、汽车品牌巨头,都依赖于台湾的芯片供应。
两岸一旦爆发冲突,不只中国大陆,全球的电子产业供应链都将被严重扰乱,给我们带来更多的外部压力。也正因此,台积电被一些人视为台湾的“护岛神山”。
大陆目前最先进的的中芯国际,刚刚完成14nm制程的量产,而台积电已经在进军3nm制程,差距至少在五年以上。2021年,台积电的营收超出中芯的10倍,短时间内,我们还无法看到大陆半导体企业对台积电实现赶超。
回顾半导体产业发展史,前三十年是美帝独领风骚,七十年代后,日本、韩国和台湾地区承接来自硅谷的技术外溢和转移,吸引本国在美国的人才回流,抓住了千载难逢的机遇。
但很遗憾,由于种种原因,我们错失了半导体产业发展早期的黄金时期,当我们终于开始抬头看世界时,发现半导体产业的山头,已经插满红旗。
柒 蹉跎岁月
1973年,当日本半导体工业完成起步,即将对美国半导体巨头发起冲击的前夜,一支来自中国的考察团悄然而至。考察团13人都是半导体领域的技术专家,带队的是中科院半导体研究所副所长王守武。
王守武是中国半导体技术的奠基人之一,1950年他放弃美国普渡大学教职回国,1958年领导建立了中国最早的晶体管工厂,中科院109厂。这样看的话,中国半导体产业距离世界潮流,似乎并不遥远。
但很可惜,没有输在科研起跑线上的中国半导体,却在产业化竞赛中被越甩越远。
王守武带团访日时,中日正值蜜月期,当时出国不易,大家都很珍惜这次机会,一趟下来,把东芝、日立、NEC、富士通等看了个遍。这一看,发现差距不小,日本已经开始采用3英寸晶圆生产线,而国内还在为小规模集成电路的质量问题头疼。
但让考察团意外的是,NEC表示愿意将全套先进的3英寸芯片生产线转让给中国——如果引进,这条产线将比台湾地区领先3年,比韩国领先5年。NEC开出的报价是5000万美元。
回国后,王守武向时任国防科工委副主任的钱学森汇报情况,钱学森无奈地表示有心无力。除了缺钱,更麻烦的是当时的政治大环境,引进国外技术,当时被批判为“洋奴主义”,是“事关国格”的路线问题。
从NEC引进技术一事,只好不了了之,而这,只是那个特殊年代的一个极小缩影。
当大洋彼岸的仙童、英特尔开始在硅谷崭露头角、新技术层出不穷时,中国正经历一轮又一轮的“运动”:王守武被停职批斗,备受诬蔑和诽谤;麻省理工博士毕业的谢希德,被整成走资派后,每天工作是扫厕所;半导体物理学奖黄昆,被隔离审查,发配到北京郊区劳动改造……
风雨如晦,鸡鸣不已。
50-70年代,国内动乱不安,国外封锁压制,中国半导体产业彷徨前行,举步维艰,错失了产业早期的黄金三十年。1977年,全国有600多家半导体工厂,但它们一年的生产总量加起来,只有日本一家工厂月产量的十分之一。
钱学森晚年曾感慨:“60年代我们全力投入两弹一星,我们得到很多;70年代我们没有搞半导体,我们为此失去很多。”
从更深层次来看,传统制造业遵循的是物理定律,而半导体产业背后,是可怕的摩尔定律,是指数型增长——这意味着,在沿袭自苏联的计划经济体制下,没有优胜劣汰的市场竞争,根本不可能跟得上前沿技术的飞速发展。
改革开放后,打开国门后我们才猛然发现,中国半导体产业已被远远抛在后面。更严重的是,除了少数业内专家,绝大部分人尚未意识到差距之大,追赶难度之高。1977年,人民大会堂召开科技界座谈会,*问王守武:
“你们一定要把大规模集成电路搞上去,一年行吗?”
80年代后,国家部委先后组织三大“战役”,对半导体技术发起攻关。比如1995年启动的“909”工程,投资100亿人民币,电子工业部部长胡启立亲自挂帅,万众瞩目,不可谓不重视。
但很遗憾,投建的上海华虹厂遇到了行业低潮期,而国内当时又没有人了解三星越亏越要投的“反周期”理论,因此华虹备受争议,最终还是没能赶上摩尔定律狂飙突进的脚步。
这场当时几乎让人绝望的追赶,直到新世纪到来之际,才终于再次迎来转机。
今天我们在媒体上所熟知的芯片公司,几乎都成立于21世纪的第一个十年:2000年中芯国际,2001年展讯通信,2003年中星微,2004年华为海思……这些明星企业,汇聚了大批80年代出国、在美国芯片公司工作多年的科技人才。
新的血液,新的机制,终于开始给中国半导体产业注入足够的活力。
事实证明,在任何高科技领域,只要给予合适的大环境,中国人做的绝不会比别人差。在芯片设计和封装领域,华为海思、长电科技等飞速崛起,仅仅用了十余年时间,就进入了领域内第一梯队。
但在最复杂也最艰难的芯片制造领域,中国半导体产业经历了血雨腥风,至今仍面临着卡脖子危机。回首过去风雨之路的崎岖坎坷,如今仍泰山压顶般的压力,总让我想起鲍勃迪伦那首成名作《blow‘ in the wind》:
How many roads must a
man walk downBefore you call him a man.
捌 造芯片比造原子弹还难吗?
2020年4月,华为手机业务达到顶峰,历史上首次超越三星,登上全球第一的宝座。从崛起到登顶,华为用了十多年才走到这一步。
然而,令人唏嘘的是,仅仅一年后,被美国制裁的华为迅速跌落,荣耀被迫卖掉,高端的P系列由于缺少芯片,无法继续延续。十年奋战,就这样一夜间付诸流水。
华为在全球攻城略地的背后,隐藏着一条门槛极高的高科技食物链。
在这条食物链上,华为处在台积电下方,没有台积电生产的芯片,华为的手机业务只好停摆;而台积电又处在荷兰ASML(阿斯麦尔)的下方,没有ASML提供的光刻机,台积电就无法制造最先进的芯片。制造7nm以下芯片所需的EUV光刻机,1亿欧元一台,排队买还不一定买到。
那么阿斯麦尔呢,它是否已处在这条高科技产业链的顶点?仍然不是,阿斯麦尔是系统集成厂商,它的上方,还有一群隐形冠军,比如其中有一家,叫蔡司。
这又是一家百年老店。
1945年,二战接近尾声之际,从诺曼底登陆的美军势如破竹,纳粹德国败局已定。这时候,巴顿将军率领第三集团军,不顾破坏《雅尔塔协定》的风险,闯入划给苏联的东德区域,但他们的目标不是军事要地,而是位于耶拿的蔡司公司。
蔡司公司创建于1846年,在二战期间为德军生产望远镜、测距仪、航空摄像机等。当战争快结束时,美国和苏联都已未雨绸缪,开始考虑抢夺德国的科技资源,而蔡司公司,被美国列为接收的首要目标。
美军占领耶拿后,本来打算用600辆卡车把整个蔡司公司整个搬走,没想到苏军推进太过迅速,美国人措手不及之下,只能将蔡司最核心的100多名员工运到西德,在那里建了个新蔡司。
如今,制造7nm以下芯片所需的EUV光刻机,需要用到极度精密的光学透镜,目前全世界只有蔡司能够做到,别无二家。这种独门绝技背后,是蔡司在光学领域长达百年的技术积淀。
除了蔡司提供的光学镜头,ASML还要用到来自美国Cymer公司提供的光源系统,整合来自世界各国的顶尖工艺,完全可以说,光刻机是西方现代工业体系的集大成,是人类工业革命以来制造业皇冠上的明珠。
任正非曾感叹:我们国家修桥、修路、修房子,已经习惯了只要砸钱就行,但芯片只砸钱不行,还要砸数学家、物理学家、化学家……
玖
尾声
1993年,俄罗斯总理切尔诺梅尔金来到位于乌克兰的黑海造船厂,讨论将“瓦良格”号航母继续建造完成并移交给俄罗斯的可行性,旁边的造船厂厂长马卡洛夫忍不住插嘴说“瓦良格号已经不可能完成了”,然后他继续说出了那段著名的话:
“如果想要瓦良格号完工,我需要苏联、党中央、国家计划委员会和工业军事委员会,以及6000多个相关专业和8000多家配套厂家,总之,需要一个伟大的国家才能完成,可是这个国家已经不存在了。”
如果放在芯片上,这段话或许可以这样说:
要发展世界一流的半导体产业,需要目光长远、有战略性规划的政府支持,需要鼓励创新、容许失败的土壤,需要不断拓展前沿的一流高校、研究所,需要能够耐住寂寞沉下心搞研发的企业家,还需要年薪百万的顶级工程师。
一言以蔽之,这是真正的国家综合实力的较量,是一场国家层面的隐形战争,而它的输赢,直接关系着一个国家子民的福祉。
“因为你的投票,你的孙辈都会做着高薪工作。” 这是前几天,美国民主党参议员查克舒默在鼓动国会通过“芯片与科学法案”时喊出的口号。这项法案,美国计划投入2800亿美元,可以说是美国有史以来最重大的法案之一。
推出芯片法案也好,封禁EDA、禁售光刻机也好,美国人这套组合拳目的很简单:牢牢把控产业的顶端,保证自己的国民能够继续喝着咖啡拿高薪,顺便将中国钉死在产业链的低端。化用刘慈欣《三体》中的一句话就是:
发展自己,锁死对手。
回望整个半导体产业发展史,小小芯片,奠定了人类信息时代的基石,也改写了一些国家地区的命运,有的搭上时代列车,步入发达经济体之列,也有超级大国因而落寞衰颓。
对我们这个国家、这个民族来说,虽然道阻且长,弯路走了不少,但突破重重封锁,实现产业自主,其意义比之当年两弹一星,也不遑多让。我们的未来,也将由这场事关国运的终极竞赛来给出答案。
解析分布式系统的缓存设计
一、缓存简介
1.1 什么是缓存
缓存就是数据交换的缓冲区。缓存的本质是一个内存 Hash。缓存是一种利用空间换时间的设计,其目标就是更快、更近:极大的提高。
- 将数据写入/读取速度更快的存储(设备);
- 将数据缓存到离应用最近的位置;
- 将数据缓存到离用户最近的位置。
缓存是用于存储数据的硬件或软件的组成部分,以使得后续更快访问相应的数据。缓存中的数据可能是提前计算好的结果、数据的副本等。典型的应用场景:有 cpu cache, 磁盘 cache 等。本文中提及到缓存主要是指互联网应用中所使用的缓存组件。
缓存命中率是缓存的重要度量指标,命中率越高越好。
缓存命中率 = 从缓存中读取次数 / 总读取次数
1.2 何时需要缓存
引入缓存,会增加系统的复杂度。所以,引入缓存前,需要先权衡是否值得,考量点如下:
- CPU 开销 - 如果应用某个计算需要消耗大量 CPU,可以考虑缓存其计算结果。典型场景:复杂的、频繁调用的正则计算;分布式计算中间状态等。
- IO 开销 - 如果数据库连接池比较繁忙,可以考虑缓存其查询结果。
在数据层引入缓存,有以下几个好处:
- 提升数据读取速度。
- 提升系统扩展能力,通过扩展缓存,提升系统承载能力。
- 降低存储成本,Cache+DB 的方式可以承担原有需要多台 DB 才能承担的请求量,节省机器成本。
1.3 缓存的基本原理
根据业务场景,通常缓存有以下几种使用方式:
- 懒汉式(读时触发):先查询 DB 里的数据, 然后把相关的数据写入 Cache。
- 饥饿式(写时触发):写入 DB 后, 然后把相关的数据也写入 Cache。
- 定期刷新:适合周期性的跑数据的任务,或者列表型的数据,而且不要求绝对实时性。
1.4 缓存淘汰策略
缓存淘汰的类型:
1)基于空间:设置缓存空间大小。
2)基于容量:设置缓存存储记录数。
3)基于时间
- TTL(Time To Live,即存活期)缓存数据从创建到过期的时间。
- TTI(Time To Idle,即空闲期)缓存数据多久没被访问的时间。
缓存淘汰算法:
1)FIFO:先进先出。在这种淘汰算法中,先进入缓存的会先被淘汰。这种可谓是最简单的了,但是会导致我们命中率很低。试想一下我们如果有个访问频率很高的数据是所有数据第一个访问的,而那些不是很高的是后面再访问的,那这样就会把我们的首个数据但是他的访问频率很高给挤出。
2)LRU:最近最少使用算法。在这种算法中避免了上面的问题,每次访问数据都会将其放在我们的队尾,如果需要淘汰数据,就只需要淘汰队首即可。但是这个依然有个问题,如果有个数据在 1 个小时的前 59 分钟访问了 1 万次(可见这是个热点数据),再后一分钟没有访问这个数据,但是有其他的数据访问,就导致了我们这个热点数据被淘汰。
3)LFU:最近最少频率使用。在这种算法中又对上面进行了优化,利用额外的空间记录每个数据的使用频率,然后选出频率最低进行淘汰。这样就避免了 LRU 不能处理时间段的问题。
这三种缓存淘汰算法,实现复杂度一个比一个高,同样的命中率也是一个比一个好。而我们一般来说选择的方案居中即可,即实现成本不是太高,而命中率也还行的 LRU。
二、缓存的分类
缓存从部署角度,可以分为客户端缓存和服务端缓存。
客户端缓存
- HTTP 缓存
- 浏览器缓存
- APP 缓存(1、Android 2、IOS)
服务端缓存
- CDN 缓存:存放 HTML、CSS、JS 等静态资源。
- 反向代理缓存:动静分离,只缓存用户请求的静态资源。
- 数据库缓存:数据库(如 MySQL)自身一般也有缓存,但因为命中率和更新频率问题,不推荐使用。
- 进程内缓存:缓存应用字典等常用数据。
- 分布式缓存:缓存数据库中的热点数据。
其中,CDN 缓存、反向代理缓存、数据库缓存一般由专职人员维护(运维、DBA)。后端开发一般聚焦于进程内缓存、分布式缓存。
2.1 HTTP 缓存
2.2 CDN 缓存
CDN 将数据缓存到离用户物理距离最近的服务器,使得用户可以就近获取请求内容。CDN 一般缓存静态资源文件(页面,脚本,图片,视频,文件等)。
国内网络异常复杂,跨运营商的网络访问会很慢。为了解决跨运营商或各地用户访问问题,可以在重要的城市,部署 CDN 应用。使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
图片引用自:Why use a CDN
2.1.1 CDN 原理
CDN 的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。
1)未部署 CDN 应用前的网络路径:
- 请求:本机网络(局域网)=> 运营商网络 => 应用服务器机房
- 响应:应用服务器机房 => 运营商网络 => 本机网络(局域网)
在不考虑复杂网络的情况下,从请求到响应需要经过 3 个节点,6 个步骤完成一次用户访问操作。
2)部署 CDN 应用后网络路径:
- 请求:本机网络(局域网) => 运营商网络
- 响应:运营商网络 => 本机网络(
在不考虑复杂网络的情况下,从请求到响应需要经过 2 个节点,2 个步骤完成一次用户访问操作。与不部署 CDN 服务相比,减少了 1 个节点,4 个步骤的访问。极大的提高了系统的响应速度。
2.1.2 CDN 特点
优点
- 本地 Cache 加速:提升访问速度,尤其含有大量图片和静态页面站点;
- 实现跨运营商的网络加速:消除了不同运营商之间互联的瓶颈造成的影响,实现了跨运营商的网络加速,保证不同网络中的用户都能得到良好的访问质量;
- 远程加速:远程访问用户根据 DNS 负载均衡技术智能自动选择 Cache 服务器,选择最快的 Cache 服务器,加快远程访问的速度;
- 带宽优化:自动生成服务器的远程 Mirror(镜像)cache 服务器,远程用户访问时从 cache 服务器上读取数据,减少远程访问的带宽、分担网络流量、减轻原站点 WEB 服务器负载等功能。
- 集群抗攻击:广泛分布的 CDN 节点加上节点之间的智能冗余机制,可以有效地预防黑客入侵以及降低各种 D.D.o.S 攻击对网站的影响,同时保证较好的服务质量。
缺点
- 不适宜缓存动态资源
解决方案:主要缓存静态资源,动态资源建立多级缓存或准实时同步;
- 存在数据的一致性问题
1.解决方案(主要是在性能和数据一致性二者间寻找一个平衡)。
2.设置缓存失效时间(1 个小时,过期后同步数据)。
3.针对资源设置版本号。
2.2 反向代理缓存
反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
2.2.1 反向代理缓存原理
反向代理位于应用服务器同一网络,处理所有对 WEB 服务器的请求。反向代理缓存的原理:
- 如果用户请求的页面在代理服务器上有缓存的话,代理服务器直接将缓存内容发送给用户。
- 如果没有缓存则先向 WEB 服务器发出请求,取回数据,本地缓存后再发送给用户。
这种方式通过降低向 WEB 服务器的请求数,从而降低了 WEB 服务器的负载。
反向代理缓存一般针对的是静态资源,而将动态资源请求转发到应用服务器处理。常用的缓存应用服务器有 Varnish,Ngnix,Squid。
2.2.2 反向代理缓存比较
常用的代理缓存有 Varnish,Squid,Ngnix,简单比较如下:
- Varnish 和 Squid 是专业的 cache 服务,Ngnix 需要第三方模块支持;
- Varnish 采用内存型缓存,避免了频繁在内存、磁盘中交换文件,性能比 Squid 高;
- Varnish 由于是内存 cache,所以对小文件如 css、js、小图片的支持很棒,后端的持久化缓存可以采用的是 Squid 或 ATS;
- Squid 功能全而大,适合于各种静态的文件缓存,一般会在前端挂一个 HAProxy 或 Ngnix 做负载均衡跑多个实例;
- Nginx 采用第三方模块 ncache 做的缓冲,性能基本达到 Varnish,一般作为反向代理使用,可以实现简单的缓存。
三、进程内缓存
进程内缓存是指应用内部的缓存,标准的分布式系统,一般有多级缓存构成。本地缓存是离应用最近的缓存,一般可以将数据缓存到硬盘或内存。
- 硬盘缓存:将数据缓存到硬盘中,读取时从硬盘读取。原理是直接读取本机文件,减少了网络传输消耗,比通过网络读取数据库速度更快。可以应用在对速度要求不是很高,但需要大量缓存存储的场景。
- 内存缓存:直接将数据存储到本机内存中,通过程序直接维护缓存对象,是访问速度最快的方式。
常见的本地缓存实现方案:HashMap、Guava Cache、Caffeine、Ehcache。
3.1 ConcurrentHashMap
最简单的进程内缓存可以通过 JDK 自带的 HashMap 或 ConcurrentHashMap 实现。
- 适用场景:不需要淘汰的缓存数据。
- 缺点:无法进行缓存淘汰,内存会无限制的增长。
3.2 LRUHashMap
可以通过继承 LinkedHashMap 来实现一个简单的 LRUHashMap。重写 removeEldestEntry 方法,即可完成一个简单的最近最少使用算法。
缺点:
- 锁竞争严重,性能比较低。
- 不支持过期时间。
- 不支持自动刷新。
3.3 Guava Cache
解决了LRUHashMap 中的几个缺点。Guava Cache 采用了类似 ConcurrentHashMap 的思想,分段加锁,减少锁竞争。
Guava Cache 对于过期的 Entry 并没有马上过期(也就是并没有后台线程一直在扫),而是通过进行读写操作的时候进行过期处理,这样做的好处是避免后台线程扫描的时候进行全局加锁。直接通过查询,判断其是否满足刷新条件,进行刷新。
3.4 Caffeine
Caffeine 实现了 W-TinyLFU(LFU + LRU 算法的变种),其命中率和读写吞吐量大大优于 Guava Cache。其实现原理较复杂,可以参考你应该知道的缓存进化史。
3.5 Ehcache
EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheProvider。
优点
- 快速、简单;
- 支持多种缓存策略:LRU、LFU、FIFO 淘汰算法;
- 缓存数据有两级:内存和磁盘,因此无需担心容量问题;
- 缓存数据会在虚拟机重启的过程中写入磁盘;
- 可以通过 RMI、可插入 API 等方式进行分布式缓存;
- 具有缓存和缓存管理器的侦听接口;
- 支持多缓存管理器实例,以及一个实例的多个缓存区域;
- 提供 Hibernate 的缓存实现。
缺点
- 使用磁盘 Cache 的时候非常占用磁盘空间;
- 不保证数据的安全;
- 虽然支持分布式缓存,但效率不高(通过组播方式,在不同节点之间同步数据)。
3.6 进程内缓存对比
常用进程内缓存技术对比:
- ConcurrentHashMap:比较适合缓存比较固定不变的元素,且缓存的数量较小的。虽然从上面表格中比起来有点逊色,但是其由于是 JDK 自带的类,在各种框架中依然有大量的使用,比如我们可以用来缓存我们反射的 Method,Field 等等;也可以缓存一些链接,防止其重复建立。在 Caffeine 中也是使用的 ConcurrentHashMap 来存储元素。
- LRUMap:如果不想引入第三方包,又想使用淘汰算法淘汰数据,可以使用这个。
- Ehcache:由于其 jar 包很大,较重量级。对于需要持久化和集群的一些功能的,可以选择 Ehcache。需要注意的是,虽然 Ehcache 也支持分布式缓存,但是由于其节点间通信方式为 rmi,表现不如 Redis,所以一般不建议用它来作为分布式缓存。
- Guava Cache:Guava 这个 jar 包在很多 Java 应用程序中都有大量的引入,所以很多时候其实是直接用就好了,并且其本身是轻量级的而且功能较为丰富,在不了解 Caffeine 的情况下可以选择 Guava Cache。
- Caffeine:其在命中率,读写性能上都比 Guava Cache 好很多,并且其 API 和 Guava cache 基本一致,甚至会多一点。在真实环境中使用 Caffeine,取得过不错的效果。
总结一下:如果不需要淘汰算法则选择 ConcurrentHashMap,如果需要淘汰算法和一些丰富的 API,推荐选择。
四、分布式缓存
分布式缓存解决了进程内缓存最大的问题:如果应用是分布式系统,节点之间无法共享彼此的进程内缓存。分布式缓存的应用场景:
- 缓存经过复杂计算得到的数据。
- 缓存系统中频繁访问的热点数据,减轻数据库压力。
不同分布式缓存的实现原理往往有比较大的差异。本文主要针对 Memcached 和 Redis 进行说明。
4.1 Memcached
Memcached 是一个高性能,分布式内存对象缓存系统,通过在内存里维护一个统一的巨大的 Hash 表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。
简单的说就是:将数据缓存到内存中,然后从内存中读取,从而大大提高读取速度。
4.1.1 Memcached 特性
- 使用物理内存作为缓存区,可独立运行在服务器上。每个进程最大 2G,如果想缓存更多的数据,可以开辟更多的 Memcached 进程(不同端口)或者使用分布式 Memcached 进行缓存,将数据缓存到不同的物理机或者虚拟机上。
- 使用 key-value 的方式来存储数据。这是一种单索引的结构化数据组织形式,可使数据项查询时间复杂度为 O(1)。
- 协议简单,基于文本行的协议。直接通过 telnet 在 Memcached 服务器上可进行存取数据操作,简单,方便多种缓存参考此协议;
- 基于 libevent 高性能通信。Libevent 是一套利用 C 开发的程序库,它将 BSD 系统的 kqueue,Linux 系统的 epoll 等事件处理功能封装成一个接口,与传统的 select 相比,提高了性能。
- 分布式能力取决于 Memcached 客户端,服务器之间互不通信。各个 Memcached 服务器之间互不通信,各自独立存取数据,不共享任何信息。服务器并不具有分布式功能,分布式部署取决于 Memcached 客户端。
- 采用 LRU 缓存淘汰策略。在 Memcached 内存储数据项时,可以指定它在缓存的失效时间,默认为永久。当 Memcached 服务器用完分配的内时,失效的数据被首先替换,然后也是最近未使用的数据。在 LRU 中,Memcached 使用的是一种 Lazy Expiration 策略,自己不会监控存入的 key/vlue 对是否过期,而是在获取 key 值时查看记录的时间戳,检查 key/value 对空间是否过期,这样可减轻服务器的负载。
- 内置了一套高效的内存管理算法。这套内存管理效率很高,而且不会造成内存碎片,但是它最大的缺点就是会导致空间浪费。当内存满后,通过 LRU 算法自动删除不使用的缓存。
- 不支持持久化。Memcached 没有考虑数据的容灾问题,重启服务,所有数据会丢失。
4.1.2 Memcached 工作原理
1)内存管理
Memcached 利用 slab allocation 机制来分配和管理内存,它按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,数据在存放时,根据键值 大小去匹配 slab 大小,找就近的 slab 存放,所以存在空间浪费现象。
这套内存管理效率很高,而且不会造成内存碎片,但是它最大的缺点就是会导致空间浪费。
2)缓存淘汰策略
Memcached 的缓存淘汰策略是 LRU + 到期失效策略。
当你在 Memcached 内存储数据项时,你有可能会指定它在缓存的失效时间,默认为永久。当 Memcached 服务器用完分配的内时,失效的数据被首先替换,然后是最近未使用的数据。
在 LRU 中,Memcached 使用的是一种 Lazy Expiration 策略:Memcached 不会监控存入的 key/vlue 对是否过期,而是在获取 key 值时查看记录的时间戳,检查 key/value 对空间是否过期,这样可减轻服务器的负载。
3)分区
Memcached 服务器之间彼此不通信,它的分布式能力是依赖客户端来实现。具体来说,就是在客户端实现一种算法,根据 key 来计算出数据应该向哪个服务器节点读/写。
而这种选取集群节点的算法常见的有三种:
- 哈希取余算法:使用公式:Hash(key)% N 计算出 哈希值 来决定数据映射到哪一个节点。
- 一致性哈希算法:可以很好的解决 稳定性问题,可以将所有的 存储节点 排列在 首尾相接 的 Hash 环上,每个 key 在计算 Hash 后会 顺时针 找到 临接 的 存储节点 存放。而当有节点 加入 或 退出 时,仅影响该节点在 Hash 环上 顺时针相邻 的 后续节点。
- 虚拟 Hash 槽算法:使用 分散度良好 的 哈希函数 把所有数据 映射 到一个 固定范围 的 整数集合 中,整数定义为 槽(slot),这个范围一般 远远大于 节点数。槽 是集群内 数据管理 和 迁移 的 基本单位。采用 大范围槽 的主要目的是为了方便 数据拆分 和 集群扩展。每个节点会负责 一定数量的槽。
4.2 Redis
Redis 是一个开源(BSD 许可)的,基于内存的,多数据结构存储系统。可以用作数据库、缓存和消息中间件。
Redis 还可以使用客户端分片来扩展写性能。内置了 复制(replication),LUA 脚本(Lua scripting),LRU 驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis 哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。
4.2.1 Redis 特性
- 支持多种数据类型 - string、Hash、list、set、sorted set。
- 支持多种数据淘汰策略;
volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰;
volatile-ttl :从已设置过期时间的数据集中挑选将要过期的数据淘汰;
volatile-random:从已设置过期时间的数据集中任意选择数据淘汰;
allkeys-lru:从所有数据集中挑选最近最少使用的数据淘汰;
allkeys-random:从所有数据集中任意选择数据进行淘汰;
noeviction :禁止驱逐数据。
- 提供两种持久化方式 - RDB 和 AOF。
- 通过 Redis cluster 提供集群模式。
4.2.2 Redis 原理
1)缓存淘汰
Redis 有两种数据淘汰实现;
- 消极方式:访问 Redis key 时,如果发现它已经失效,则删除它
- 积极方式:周期性从设置了失效时间的 key 中,根据淘汰策略,选择一部分失效的 key 进行删除。
2)分区
- Redis Cluster 集群包含 16384 个虚拟 Hash 槽,它通过一个高效的算法来计算 key 属于哪个 Hash 槽。
- Redis Cluster 支持请求分发 - 节点在接到一个命令请求时,会先检测这个命令请求要处理的键所在的槽是否由自己负责,如果不是的话,节点将向客户端返回一个 MOVED 错误,MOVED 错误携带的信息可以指引客户端将请求重定向至正在负责相关槽的节点。
3)主从复制
- Redis 2.8 后支持异步复制。它有两种模式:
完整重同步(full resychronization) - 用于初次复制。执行步骤与 SYNC 命令基本一致。
部分重同步(partial resychronization) - 用于断线后重复制。如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器只需接收并执行这些写命令,即可将主从服务器的数据库状态保持一致。
- 集群中每个节点都会定期向集群中的其他节点发送 PING 消息,以此来检测对方是否在线。
- 如果一个主节点被认为下线,则在其从节点中,根据 Raft 算法,选举出一个节点,升级为主节点。
4)数据一致性
- Redis 不保证强一致性,因为这会使得集群性能大大降低。
- Redis 是通过异步复制来实现最终一致性。
4.3 分布式缓存对比
不同的分布式缓存功能特性和实现原理方面有很大的差异,因此他们所适应的场景也有所不同。
这里选取三个比较出名的分布式缓存(MemCache,Redis,Tair)来作为比较:
- MemCache:只适合基于内存的缓存框架;且不支持数据持久化和容灾。
- Redis:支持丰富的数据结构,读写性能很高,但是数据全内存,必须要考虑资源成本,支持持久化。
- Tair:支持丰富的数据结构,读写性能较高,部分类型比较慢,理论上容量可以无限扩充。
总结:如果服务对延迟比较敏感,Map/Set 数据也比较多的话,比较适合 Redis。如果服务需要放入缓存量的数据很大,对延迟又不是特别敏感的话,那就可以选择 Memcached。
五、多级缓存
5.1 整体缓存框架
通常,一个大型软件系统的缓存采用多级缓存方案:
请求过程:
- 浏览器向客户端发起请求,如果 CDN 有缓存则直接返回;
- 如果 CDN 无缓存,则访问反向代理服务器;
- 如果反向代理服务器有缓存则直接返回;
- 如果反向代理服务器无缓存或动态请求,则访问应用服务器;
- 应用服务器访问进程内缓存;如果有缓存,则返回代理服务器,并缓存数据(动态请求不缓存);
- 如果进程内缓存无数据,则读取分布式缓存;并返回应用服务器;应用服务器将数据缓存到本地缓存(部分);
- 如果分布式缓存无数据,则应用程序读取数据库数据,并放入分布式缓存;
5.2 使用进程内缓存
如果应用服务是单点应用,那么进程内缓存当然是缓存的首选方案。对于进程内缓存,其本来受限于内存的大小的限制,以及进程缓存更新后其他缓存无法得知,所以一般来说进程缓存适用于:
- 数据量不是很大且更新频率较低的数据。
- 如果更新频繁的数据,也想使用进程内缓存,那么可以将其过期时间设置为较短的时间,或者设置较短的自动刷新时间。
这种方案存在以下问题:
- 如果应用服务是分布式系统,应用节点之间无法共享缓存,存在数据不一致问题。
- 由于进程内缓存受限于内存大小的限制,所以缓存不能无限扩展。
5.3 使用分布式缓存
如果应用服务是分布式系统,那么最简单的缓存方案就是直接使用分布式缓存。其应用场景如图所示:
Redis 用来存储热点数据,如果缓存不命中,则去查询数据库,并更新缓存。这种方案存在以下问题:
- 缓存服务如果挂了,这时应用只能访问数据库,容易造成缓存雪崩。
- 访问分布式缓存服务会有一定的 I/O 以及序列化反序列化的开销,虽然性能很高,但是其终究没有在内存中查询快。
5.4 使用多级缓存
单纯使用进程内缓存和分布式缓存都存在各自的不足。如果需要更高的性能以及更好的可用性,我们可以将缓存设计为多级结构。将最热的数据使用进程内缓存存储在内存中,进一步提升访问速度。
这个设计思路在计算机系统中也存在,比如 CPU 使用 L1、L2、L3 多级缓存,用来减少对内存的直接访问,从而加快访问速度。一般来说,多级缓存架构使用二级缓存已可以满足大部分业务需求,过多的分级会增加系统的复杂度以及维护的成本。因此,多级缓存不是分级越多越好,需要根据实际情况进行权衡。
一个典型的二级缓存架构,可以使用进程内缓存(如:Caffeine/Google Guava/Ehcache/HashMap)作为一级缓存;使用分布式缓存(如:Redis/Memcached)作为二级缓存。
5.4.1 多级缓存查询
多级缓存查询流程如下:
- 首先,查询 L1 缓存,如果缓存命中,直接返回结果;如果没有命中,执行下一步。
- 接下来,查询 L2 缓存,如果缓存命中,直接返回结果并回填 L1 缓存;如果没有命中,执行下一步。
- 最后,查询数据库,返回结果并依次回填 L2 缓存、L1 缓存。
5.4.2 多级缓存更新
对于 L1 缓存,如果有数据更新,只能删除并更新所在机器上的缓存,其他机器只能通过超时机制来刷新缓存。超时设定可以有两种策略:
- 设置成写入后多少时间后过期;
- 设置成写入后多少时间刷新。
对于 L2 缓存,如果有数据更新,其他机器立马可见。但是,也必须要设置超时时间,其时间应该比 L1 缓存的有效时间长。为了解决进程内缓存不一致的问题,设计可以进一步优化;
通过消息队列的发布、订阅机制,可以通知其他应用节点对进程内缓存进行更新。使用这种方案,即使消息队列服务挂了或不可靠,由于先执行了数据库更新,但进程内缓存过期,刷新缓存时,也能保证数据的最终一致性。
六、缓存问题
6.1 缓存雪崩
缓存雪崩是指缓存不可用或者大量缓存由于超时时间相同在同一时间段失效,大量请求直接访问数据库,数据库压力过大导致系统雪崩。
举例来说,对于系统 A,假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意外发生了全盘宕机。缓存挂了,此时 1 秒 5000 个请求全部落数据库,数据库必然扛不住,它会报一下警,然后就挂了。此时,如果没有采用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。
解决缓存雪崩的主要手段如下:
- 增加缓存系统可用性(事前)。例如:部署 Redis Cluster(主从+哨兵),以实现 Redis 的高可用,避免全盘崩溃。
- 采用多级缓存方案(事中)。例如:本地缓存(Ehcache/Caffine/Guava Cache) + 分布式缓存(Redis/ Memcached)。
- 限流、降级、熔断方案(事中),避免被流量打死。如:使用 Hystrix 进行熔断、降级。
- 缓存如果支持持久化,可以在恢复工作后恢复数据(事后)。如:Redis 支持持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。
上面的解决方案简单来说,就是多级缓存方案。系统收到一个查询请求,先查本地缓存,再查分布式缓存,最后查数据库,只要命中,立即返回。
解决缓存雪崩的辅助手段如下:
- 监控缓存,弹性扩容。
- 缓存的过期时间可以取个随机值。这么做是为避免缓存同时失效,使得数据库 IO 骤升。比如:以前是设置 10 分钟的超时时间,那每个 Key 都可以随机 8-13 分钟过期,尽量让不同 Key 的过期时间不同。
6.2 缓存穿透
缓存穿透是指:查询的数据在数据库中不存在,那么缓存中自然也不存在。所以,应用在缓存中查不到,则会去查询数据库。当这样的请求多了后,数据库的压力就会增大。
解决缓存穿透,一般有两种方法:
1)缓存空值
对于返回为 NULL 的依然缓存,对于抛出异常的返回不进行缓存。
采用这种手段的会增加我们缓存的维护成本,需要在插入缓存的时候删除这个空缓存,当然我们可以通过设置较短的超时时间来解决这个问题。
2)过滤不可能存在的数据
制定一些规则过滤一些不可能存在的数据。可以使用布隆过滤器(针对二进制操作的数据结构,所以性能高),比如你的订单 ID 明显是在一个范围 1-1000,如果不是 1-1000 之内的数据那其实可以直接给过滤掉。
针对于一些恶意攻击,攻击带过来的大量 key 是不存在的,那么我们采用第一种方案就会缓存大量不存在 key 的数据。此时我们采用第一种方案就不合适了,我们完全可以先对使用第二种方案进行过滤掉这些 key。针对这种 key 异常多、请求重复率比较低的数据,我们就没有必要进行缓存,使用第二种方案直接过滤掉。而对于空数据的 key 有限的,重复率比较高的,我们则可以采用第一种方式进行缓存。
6.3 缓存击穿
缓存击穿是指,热点数据失效瞬间,大量请求直接访问数据库。例如,某些 key 是热点数据,访问非常频繁。如果某个 key 失效的瞬间,大量的请求过来,缓存未命中,然后去数据库访问,此时数据库访问量会急剧增加。
为了避免这个问题,我们可以采取下面的两个手段:
- 分布式锁:锁住热点数据的 key,避免大量线程同时访问同一个 key。
- 定时异步刷新:可以对部分数据采取失效前自动刷新的策略,而不是到期自动淘汰。淘汰其实也是为了数据的时效性,所以采用自动刷新也可以。
6.4 小结
上面逐一介绍了缓存使用中常见的问题。这里,从发生时间段的角度整体归纳一下缓存问题解决方案。
- 事前:Redis 高可用方案(Redis Cluster + 主从 + 哨兵),避免缓存全面崩溃。
- 事中:(一)采用多级缓存方案,本地缓存(Ehcache/Caffine/Guava Cache) + 分布式缓存(Redis/ Memcached)。(二)限流 + 熔断 + 降级(Hystrix),避免极端情况下,数据库被打死。
- 事后:Redis 持久化(RDB+AOF),一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。
分布式缓存 Memcached ,由于数据类型不如 Redis 丰富,并且不支持持久化、容灾。所以,一般会选择 Redis 做分布式缓存。
七、缓存策略
7.1 缓存预热
缓存预热是指系统启动后,直接查询热点数据并缓存。这样就可以避免用户请求的时候,先查询数据库,然后再更新缓存的问题。
解决方案:
- 手动刷新缓存:直接写个缓存刷新页面,上线时手工操作下。
- 应用启动时刷新缓存:数据量不大,可以在项目启动的时候自动进行加载。
- 定时异步刷新缓存。
7.2 如何缓存
7.2.1 不过期缓存
- 缓存更新模式:
- 开启事务;
- 写 SQL;
- 提交事务;
- 写缓存;
不要把写缓存操作放在事务中,尤其是写分布式缓存。因为网络抖动可能导致写缓存响应时间很慢,引起数据库事务阻塞。如果对缓存数据一致性要求不是那么高,数据量也不是很大,可以考虑定期全量同步缓存。
这种模式存在这样的情况:存在事务成功,但缓存写失败的可能。但这种情况相对于上面的问题,影响较小。
7.2.2 过期缓存
采用懒加载。对于热点数据,可以设置较短的缓存时间,并定期异步加载。
7.3 缓存更新
一般来说,系统如果不是严格要求缓存和数据库保持一致性的话,尽量不要将读请求和写请求串行化。串行化可以保证一定不会出现数据不一致的情况,但是它会导致系统的吞吐量大幅度下降。
一般来说缓存的更新有两种情况:
- 先删除缓存,再更新数据库;
- 先更新数据库,再删除缓存;
为什么是删除缓存,而不是更新缓存呢?
你可以想想当有多个并发的请求更新数据,你并不能保证更新数据库的顺序和更新缓存的顺序一致,那就会出现数据库中和缓存中数据不一致的情况。所以一般来说考虑删除缓存。
- 先删除缓存,再更新数据库;
对于一个更新操作简单来说,就是先去各级缓存进行删除,然后更新数据库。这个操作有一个比较大的问题,在对缓存删除完之后,有一个读请求,这个时候由于缓存被删除所以直接会读库,读操作的数据是老的并且会被加载进入缓存当中,后续读请求全部访问的老数据。
对缓存的操作不论成功失败都不能阻塞我们对数据库的操作,那么很多时候删除缓存可以用异步的操作,但是先删除缓存不能很好的适用于这个场景。先删除缓存也有一个好处是,如果对数据库操作失败了,那么由于先删除的缓存,最多只是造成 Cache Miss。
1)先更新数据库,再删除缓存(注:更推荐使用这种策略)。
如果我们使用更新数据库,再删除缓存就能避免上面的问题。
但是同样的引入了新的问题:假设执行更新操作时,又接收到查询请求,此时就会返回缓存中的老数据。更麻烦的是,如果数据库更新操作执行失败,则缓存中可能永远是脏数据。
2)应该选择哪种更新策略
通过上面的内容,我们知道,两种更新策略都存在并发问题。
但是建议选择先更新数据库,再删除缓存,因为其并发问题出现的概率可能非常低,因为这个条件需要发生在读缓存时缓存失效,而且同时有一个并发写操作。而实际上数据库的写操作会比读操作慢得多,而且还要锁表,而读操作必需在写操作前进入数据库操作,而又要晚于写操作更新缓存,所有的这些条件都具备的概率基本并不大。
如果需要数据库和缓存保证强一致性,则可以通过 2PC 或 Paxos 协议来实现。但是 2PC 太慢,而 Paxos 太复杂,所以如果不是非常重要的数据,不建议使用强一致性方案。更详细的分析可以参考:分布式之数据库和缓存双写一致性方案解析。
八、总结
最后,通过一张思维导图来总结一下本文所述的知识点,帮助大家对缓存有一个系统性的认识。
九、参考资料
1、《大型网站技术架构:核心原理与案例分析》
2、你应该知道的缓存进化史
3、如何优雅的设计和使用缓存?
4、理解分布式系统中的缓存架构(上)
5、缓存那些事
6、分布式之数据库和缓存双写一致性方案解析
比亚迪刀片电池内部拆解照片
比亚迪生产刀片电池是一种磷酸铁锂电池的结构创新,电池设计成了长薄形似刀片的单体电池,所以取作刀片电池。其采用CTP无模组方案,由于电芯结构的变化,电池包的设计也改变了,取消传统电池的壳体结构,由刀片电池来充当电池的梁,也充当电芯。再采用蜂窝铝板的设计,上下两面粘贴两个高强度铝板,刀片电池排列其中。这样就跳过了传统的模组环节,提高了空间利用率,在同样空间中能够装下更多的电芯。
刀片电池组装电池包时
- 利用刀片电池自身的强度,电池包成组减小横梁等,在随机振动载荷下,模组形式变形量大,刀片电芯变形量小;
- 无模组电池包:通过改变电池包结构,长方形电池竖直排列插入电池包,电池组结构简化,提升包内空间利用率。
刀片电池其实本质还是一种方形硬壳电池,只是采用长薄型结构设计。外形尺寸为960.0±10 mm × 90.0±1.0 mm × 13.5+2.5/-1.5 mm。不同的型号尺寸略有不同,比如138Ah规格的刀片电池厚度约为12mm,而202Ah的刀片电池厚度约为13.5mm。
刀片电池的极柱端子有螺纹型和焊接平台型,组装电池包时电池间的正负极端子可以根据实际需求采用这两种连接方式。负极侧端子还设置有泄压阀(Explosive-Proof Valve)。
拆开电池的端盖,极柱端子内部结构如下图所示。极片留白箔与连接片焊接在一起,箔材折弯减少占据的电池壳体内部空间,连接片再引出极柱。在端盖一侧设计了泄压阀、短路保护等安全装置。
电池壳体采用铝材质,拆开电池壳,电芯如下图所示,长条形极片采用叠片方式组装成电芯。极片尺寸大概为:正极944 mm ×83mm,负极946mm ×85mm。电芯外部包裹一层绝缘保护膜,电芯侧面也放置了一个保护条(下图右侧)。电芯由26片正极和27片负极组成。
根据以上拆解信息,总结电池大概设计参数如下:
标称电压:3.2V标称容量:138A尺寸:960*90*12.0 mm正极尺寸:944*83 mm负极尺寸:946*85 mm正极片数:26片负极片数:27片正极面容量:3.39 mAh/cm2 刀片电池规格参数:
参考文献链接
https://mp.weixin.qq.com/s/o6NrPzzBXePSvHCwN0TNdA
https://mp.weixin.qq.com/s/57kUvjVvOu8yhR60QhI5FA
https://mp.weixin.qq.com/s/EVaeHAYY8wjvLEfQFdVzxw
https://mp.weixin.qq.com/s/KUF7QobR9g21fSApouGPZg
https://mp.weixin.qq.com/s/AFrJqF1T_hU8fDgy230uTg
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
2021-10-06 Conda安装Glossary词汇表