昨天提到了服务器为什么这么贵,其实我们是生活在一个标准化的环境内,很多产品之所以可以卖上价钱,和它们所遵循的标准息息相关。但为了提供某些特定功能和遵循特定的标准所要付出的产品成本相当巨大。并不是大家想当然地知道某些名词(甚至还不知道其中 意义)就能解决的问题。

至于DIY是有DIY的乐趣存在的,iN也会DIY一些东西,但DIY有两个基本原因,一种是真没什么钱,需要寻找某些产品的平替,另一种就是市面上找不到满足自己需求的产品,也就只好自己动手做一个。

但标准是一个相当重要的要点,这里不仅仅是检测标准,还有生产标准,按照标准等等一系列的因素,很多的东西其实是真的难以DIY的。当然了有的人头铁,觉得DIY的事情就是可以在朋友面前吹牛的事情,就不顾自己的健康和生命安全去做一些匪夷所思的事情。

例如iN就见到过自己DIY净水器的

打开网易新闻 查看精彩图片

哥们甚至还号称地表最强,进嘴的东西,嗯……相当为哥们儿的身体健康担心,祝哥们肾好吧。

并现在流行的观点是:

你要跟认知低下的人解释清楚一件事,你需要把这件事的所有知识,所有细节都跟他掰开揉碎了讲清楚。而一个人之所以认知低下,就是因为,他并不能搞清楚这些细节和知识。

也就没必要多费唇舌了。

好了,说今天的主题ECC内存。这也是一个朋友的问题,哥们儿抱怨自己的电脑慢,不知道从哪里听到了ECC内存的只言片语,就让iN给他弄点。从观点上并不是拒绝别人在自己这边白嫖,家里抽屉里还有至少十几根不同容量的ECC内存条,不过最终也没给这个哥们。

打开网易新闻 查看精彩图片

虽然这ECC内存会在服务器或者工作站上大量使用,看似是比家用电脑上的内存更高档,但这东西实际上并不能让计算机的速度提高,而恰恰相反,会更加的拖慢你的计算机速度。

这种“ECC内存速度快”的谬误其实本来就来自于很多硬件小白的不明就里。很多硬件发烧友提到内存就会朗朗上口的说频率、时序、延迟等等一大堆的数据,但真正的内存机制却真的不是特别了解。对ECC内存也就是听说是在服务器上用的,想当然的认为ECC内存速度快。

ECC之所以广泛的应用在商用市场,并不是因为速度,而是因为本身带有纠错电路,可以让服务器保持相对的稳定,但由于ECC 内存控制器执行错误检查需要额外的时间,ECC 可能会在某些系统上将内存性能降低约 2-3%,具体的性能降低则取决于应用程序和具体电路的实现方式。

说到这里,咱们先说一下ECC的原理:

通常我们在存储数据的时候,数据会以0101的格式存储在计算机内部。这里的0或者1有可能是电位的高低,也有可能是磁性的南北,或者是光碟的坑洼。在数据存储和传输的过程中往往会因为各种原因出现错误,例如电压的波动、静电的影响甚至是光盘上的一颗灰尘都会让计算机获取到错误的信号。因此在各种数据存储和使用形式中都有相应的数据校验机制。

打开网易新闻 查看精彩图片

例如我在处理数据的时候,去数一下7位数据中1的个数,当1的数量是奇数的时候,我们在末尾一位计一个1,如果是偶数的话计0,当数据传输到使环节的时候,再去数一下前面7个字节的数据的1的个数,得到的结果和第8位去对比,相同的时候就接受应用数据,否则的话就回弹数据。这就是简单的奇偶校验机制。

这是一张内存的结构图:

打开网易新闻 查看精彩图片

在内存上有行编码器和列编码器,他们决定了我们访问数据的时候的内存单元地址。

打开网易新闻 查看精彩图片

这是2个内存单元,左边的电容器内有电荷被标记为1,右边的电容器内的电荷被放空,被记做0。

内存单元是一个很小的结构在显微镜下看是这样的:

打开网易新闻 查看精彩图片

里面的电容器的电荷在不断的消散,内存上的的震荡电路会不断的将内存单元中的电荷在完全消散前再次充满,这其实就是内存的频率。在给内存充电的过程中同时带有一个读出检测信号,这就是读取内存了。

我们可以相信这么频繁的操作如此微小的内存单元,内存中一定会有出错的概率,原来的1有可能变成0,原来的0也有可能变成1。对至关重要的数据就会产生致命的影响。

于是增加了一套校验电路

打开网易新闻 查看精彩图片

通常以64位:8位的比例在内存上对数据进行校验。以确保内存中的数据是相对正确的。

打开网易新闻 查看精彩图片

这是一个完整的ECC流程,在读取数据的时候,内存上的电路做出校验,当所有校验都通过的时候会提供数据(Get the Data),当数据出现错误的时候会先从缓冲镜像内再做一次提取,如果缓冲镜像内的数据再有错误,就会上报UCE或者CE错误到操作系统,请求操作系统重写数据。

这个过程不仅仅需要一个额外的内存芯片,还需要一个ECC控制器才可以在内存上完成。

要知道任何操作都是有时间代价的,这也是为什么ECC内存比普通内存慢的原因。但这个过程保证了稳定性,所以在7X24小时不停工作的服务器上ECC是有意义的。

对于家用电脑,基本上每天就开那么一会,会不会有内存错误呢?的确会有,根据比GOOGLE公司较新的研究,错误产生的概率在每GB每1.8小时1位错误到每GB几千年会出现1位错误之间。几乎对家庭用户没什么影响,大部分时间这种错误都不会赶到关键数据上,而且关键数据和操作都有更严格的校验机制,未必需要ECC再加进来校验一道。这和7X24小时一直开的服务器不断的积累错误是有本质上的不同的。

如果有错怎么办?——凉拌。换个角度,其实我们每天都会经历大量的计算机错误。只不过我们绝不到而已。

iN现在在做一个图片相似性查重的项目,在不断的提取图片中的特征码。原始的图片:

打开网易新闻 查看精彩图片

经过运算找出图片的各种特征:

打开网易新闻 查看精彩图片

然后根据特征来确定图片的相似度,在这种项目中如果做100%的相似度是不可能的。其中就会有大量错误和干扰因素存在。忽略掉就可以了。我们完全没有必要精确到小数点后十几位,大概“像”就已经完全满足设计需求了。

同样你在浏览网页的时候你会关注每一像素都和原始文件的像素丝毫不差吗?所以与其拖慢2-3%的系统速度,还不如无视这些故障的发生。

所以ECC内存这种人云亦云的事情,大家也必要再深究了。