“稳定性及性价比是云服务的核心竞争力。稳定性是基础,没有它云服务的摩天大楼分分钟就变成危房。虽然云原生架构的应用能更好地容忍单点的故障,但这并不意味着我们可放低标准,因为即使是单点故障也通常会对客户造成影响、破坏口碑,更不要说是系统整体故障。”阿里巴巴研究员余锋曾在2018年杭州云栖大会技术分享时表示。
为了提升系统的稳定, 阿里巴巴基础设施服务器系统创新团队联合阿里云等业务团队,对服务器硬件问题导致非预期的宕机进行治理。
提升系统的整体可靠性,为什么首先从内存入手?
1)内存部件作为冯诺伊曼的计算机体系结构中,发展的最快的部件之一,内存的发展和演进速度已经超过CPU的发展速度,同时内存占据最重要的位置之一,作为直接向中央处理器提供数据缓存的关键部件,内存系统的故障,直接导致处理器停止响应,导致系统宕机;
2)从计算机内存的工程工艺角度,内存作为近几年技术飞速发展的一个部件,单DIMM容量从几百M到今天的最大几百G,内存的存储密度越来越高,内存的电压越来越低,与之相反的,内存的主频反而越来越高,内存作为一个半导体的器件,存储单元的密度上升,电压降低,主频的提升,这些不利因素,抵消掉半导体可靠性技术提升的红利以后,导致内存的故障率升高。
3)随着CPU处理器技术的发展,单CPU支持的内存容量越来越大,当前主流的CPU,从两年前的两个通道,发展到现在的六个通道,DDR通道的带宽和频率相对两年前提升一倍以上,与之对应的服务器配置的内存条数越来越多,总容量越来越大,运行频率越来越高,这些也导致了整个计算机系统中,内存出现问题的比率越来越高。从统计数据上看,内存故障导致的宕机比率占到很大一部分,这符合预期,内存失效问题比例高也在情理之中。
因此对于硬件导致的非预期宕机问题的治理也是先从降低内存故障率入手。
通过对某典型产品业务硬件宕机数据分析, 发现UCE(不可纠正错误)问题占比在内存故障导致的宕机问题中超过大半, 因此内存故障治理也主要聚焦在如何降低内存UCE问题,服务器团队当前主要做了以下方面的工作:
内存故障隔离增强,避免持续恶化
1.内存错误的分级处理
2.服务器故障诊断系统
未来针对服务器可靠性提升,还会陆续开展以下几个方面:
1.资源级/硬件级的故障隔离
2.内存故障预测
3.HDD &SSD 故障预测
为什么要做内存CE的增强隔离?
现在的内存都已经有ECC校验功能,单个bit错误会自动纠正过来,不会对系统造成影响。既然内存最常见的错误已经能够被自动纠正过来,且不会对系统的运行造成影响,那么我们还有必要做增强的故障内存隔离吗,内存故障增强隔离到底增强了些什么,我们这样做的收益到底是什么?
首先,这里直接引用google paper《DRAM Errors in the Wild: A Large-Scale Field Study》中的结论。如下
Correlations between correctable and uncorrectable errors in the same DIMM.The left graph shows the UE probability in a month depending on whether there were CEs in the same month or in the previous month. The numbers on top of the bars give the increase in UE probability compared to a month without Ces (three left-most bars) and the case where there were no Ces in the previous month (three right-most bars). The right graph shows the factor increase in the probability of observing an UE as a function of the number of Ces in the same month.
内存条在一段时间内有可纠正错误产生,这条内存再次出现问题的概率会明显增加,出现CE和UE的概率都会变高。CE需要操作系统来处理,会消耗系统的处理资源,UE在当前的Intel Xeon处理器上,会直接导致宕机。内存增强隔离通过对已经出现错误的内存单元进行处理,来达到消除影响系统正常运行的潜在风险,从而提升系统可靠性。所以,虽然当前的服务器内存,已经支持了单bit自动纠错的功能,但是为了提升系统的可靠性,降低内存问题导致的性能下降,宕机风险,内存的单bit纠错功能是不够的,还需要采取一些额外的方式,来提升系统的可靠性。
了解内核的人可能会问,linux操作系统中有一整套完备的机制,来对内存的故障进行管理。操作系统也支持内存的故障管理了,阿里的增强隔离和Linux中的内存故障管理有什么差异,难道比Linux的内存故障管理还要全面吗?Linux对内存的故障管理定义的比较完整。Linux对内存的错误主要是依照MCE来进行处理的。
当前OS中,对于内存page的隔离是通过系统的mcelog服务实现。mcelog中的MCE隔离动作如下:
通过这些表格可以看到linux操作系统对内存的故障做了一些处理,Linux对内存的故障处理使用了一些故障管理的脚本,留了一些处理接口,依照这些脚本和接口,能够减少一些内存故障对系统的影响,但是这些接口和处理脚本,还存在一些问题解决不了,其中最大的一个障碍就是OS能够感知,能够处理的问题,都不算是太严重的问题,都是可以解决的问题。有相当一部分的问题,OS感知到的时候,OS已经死掉了。对于这一类的问题,是当前引起服务器宕机的主要问题。
为此,基础设施服务器系统创新团队,独创一套机制,通过带内带外的方式,成功的在OS的基础上,设计出一套内存故障隔离增强的解决方案。
——当检测到系统的内存出现一些轻微的故障的时候,我们通过基于出错存储单元物理位置的相关性,统计出错单元的故障频度和故障数变化率,使用基本的漏桶算法加上人工智能的自学习算法,来评估这个故障会不会恶化,从而决策是否需要将这个内存单元从系统中隔离出来。
——通过和阿里内核,阿里固件的配合,来确保隔离操作成功,并且不会对操作系统的运行以及业务软件的运行造成影响,从而将内存故障成功的控制在问题发生的初期。
——通过提前对故障的内存单元进行处理,确保业务运行的稳定性,降低宕机率,提升系统稳定性, 当前阿里的内存故障隔离技术对优化宕机率的贡献,已经做到了25%。
总结
针对当前OS中mcelog 服务的不足,基础设施服务器创新团队做了上述的增强改进。通过对故障内存page 的有效隔离,避免进一步出现不可纠正的内存错误,降低宕机率提升系统稳定性。
对于内存故障隔离,未来将会根据内存故障地址解析所在的 row 、colom 、bank ,rank 等,更加精准的判读出故障单位在内存DIMM上分布情况, 了解内存错误在一个DIMM上的分布情况。同时也会基于预测算法对故障单元周围的颗粒进行提前隔离。
目前关键的技术已经突破,核心idea也已经申请专利。