查看原文
其他

电脑内存占用满会比占用率很低时更加费电吗?

wolf uefiblog UEFI社区 2023-12-29
点击上方“公众号” 可以订阅哦!

内存要耗电,这大家都知道。但耗电多少人们却知之不多。公众号的小伙伴们的求知欲是无穷的,这不,有朋友 私信我了这个问题。问题很简单,但是回答起来却并不容易。思来想去,如果不在这个问题上加入一定的限定,结果就会非常发散,不利于了解问题的本质。我在这里加上“同一台电脑,相同内存配置时”的约束条件,问题变成“同一台电脑,相同内存配置时,内存占用满会比占用率很低时更加费电吗?”,避免浪费笔墨,来讨论一些不必要的分支条件,缩小问题结果的集合。

知其然,且知其所以然,了解现象的本质,这是本专栏的宗旨。要理解费电吗的答案,我们需要先从内存电力消耗的原因和组成谈起。

内存耗电的原因和构成

一个内存条(以下用DIMM代替)插入主板后,读写内存和无事可干时到底耗电多少呢?要了解这个问题,我们先要理解内存是如何进行读写操作的。这里需要些背景知识,如果对深入这个问题没有兴趣的朋友可以直接跳过本节:

内存系列一:快速读懂内存条标签

内存系列二:深入理解硬件原理

内存系列三:内存初始化浅析

从上面这些文章中我们知道,DIMM是由Rank, Chip和Bank组成。一个简化的DDR3内存结构框图如下:

1Gb DDR3 SDRAM Functional Block Diagram(出自参考资料1)

在clock enable (CKE)使能后,每一次读写操作大致分为三个步骤:

1.发送ACTIVATE(ACT)命令,它会选中一个bank中的一个行row,row的内容会进入Row的buffer中,也就是结构框图的sense amplifier:

2. 发送读写命令(RD/WR),在Row Buffer上的一些列Column会被挑出来,放到数据线上。

3. 结束后发送pre-charge(PRE)命令,清理现场,为下一次ACT命令做准备:

除此之外还有on-die termination (ODT)命令,为了简化起见,我们不再赘述,感兴趣的同学可以参看:

内存系列三:内存初始化浅析

那么不做任何事的时候呢?DIMM上很多器件还是有电的,这时候消耗的电力叫做Background(背景)功耗。这时电流消耗主要是过一段时间刷新Refresh一下各个bank,保证数据不丢失并且因为CKE的开启,各个器件处于待命的状态,随时准备接受ACT等等命令。

原理就介绍到这里,那么各个部分耗电几何呢?内存耗电和电压、频率十分相关,DDR4比DDR3电压低,更加省电。DDR3L比DDR3也省电,但频率上不去。在给定内存的前提下,参考资料1给出了Micron的结果,1G DDR3 DIMM功耗:

资料来源:Micron

资料来源:Micron

料来源:Micron

需要指出的是,这个数据没有利用任何Intel CPU给出的省电状态。Intel CPU会根据内存空闲状态,将一直处于idle状态的Rank放入Active idle或者pre-charge idle的模式下,节省一部分背景功耗。

耗电问题解析

现在回到我们的问题上来:“同一台电脑,相同内存配置时,内存占用满会比占用率很低时更加费电吗?”

答案并不唯一,和当时的workload有关。我们从workload最大到最小逐个分析一下。

1. 假设情况A,电脑内存需求很高,所有内存都被分配完毕,电脑还在不停地从外部缓存换入换出页表。情况B,电脑内存需求量不高,有一半内存空置,但被分配过的内存被频繁访问。

因为外部缓存往往在硬盘等设备,它的延迟和功耗往往远远大于内存。这种情况,毫无疑问,A耗电内存部分远大于B。

2. 情况A,电脑内存全部被占满,但也不需要新内存,内存被频繁读写。情况B,内存一半占满,另一半空置,占满部分被频繁读写。

通过前面介绍的原理,很容易得到结论:A情况的后面一半会耗费最大的功耗,而B的空闲部分只有背景功耗甚至是Active idle或者pre-charge idle状态。所以功耗A大于B。至于具体差多少,大家可以根据上面那个功耗列表计算一下。Active idle和pre-charge idle的功耗大约是5mw左右。

3. 情况A,电脑内存占满,但电脑已经空闲下来,没有什么内存读写操作。情况B,内存占用一半,也没有内存读写操作。

A和B都工作在只消耗背景功耗的模式下,唯一的区别是存储的内容不同,需要指出的是存0和存1,背景功耗没有什么不同。所以这时,A和B的功耗是一样的。

这里有个现实的例子,服务器部署数据库大小不同的功耗情况:

X轴是内存占用率,可以看出大部分功耗曲线是几乎水平的。

最后的废话

我在另外一篇文章中:《为什么现在的电脑都这么吃内存?》介绍了现在Windows和Linux总是倾向于预读取很多内容来提高效能,所以现实情况是一开机内存就被占光了,空空荡荡的内存往往并不会再出现了,所以内存读写与否,是不是工作在只有背景功耗模式下,才是决定内存耗能的关键性因素。

内存功耗,据统计占据笔记本系统5%的能耗,而在服务器产品中则高得多。目前对它的功耗控制做的并不好,很多高级的功能并没有在产品中使用。对它的节能,现在越来越被提上日程,我在参考资料里面列出了一些相关研究,有兴趣的读者可以作为扩展阅读了解一下。

参考资料

[1]: https://www.micron.com/~/media/documents/products/technical-note/dram/tn41_01ddr3_power.pdf

[2]: https://upcommons.upc.edu/bitstream/handle/2117/98303/DReAM+an+Approach+to+Estimate+Per-Task+DRAM+Energy.pdf;jsessionid=9890DEE6C49866A696DE08D7C1E74461?sequence=1

[3]: http://users.ece.cmu.edu/~omutlu/pub/memory-dvfs_icac11.pdf

[4]: https://arxiv.org/pdf/1705.10292.pdf


继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存