電腦記憶體佔用滿會比佔用率很低時更加費電嗎?
記憶體要耗電,這大家都知道。但耗電多少人們卻知之不多。知乎的小夥伴們的求知慾是無窮的,這不,知友@KuRRe8 私信我了這個問題。問題很簡單,但是回答起來卻並不容易。思來想去,如果不在這個問題上加入一定的限定,結果就會非常發散,不利於瞭解問題的本質。我在這裡加上“同一臺電腦,相同記憶體配置時”的約束條件,問題變成“同一臺電腦,相同記憶體配置時,記憶體佔用滿會比佔用率很低時更加費電嗎?”,避免浪費筆墨,來討論一些不必要的分支條件,縮小問題結果的集合。
知其然,且知其所以然,瞭解現象的本質,這是本專欄的宗旨。要理解費電嗎的答案,我們需要先從記憶體電力消耗的原因和組成談起。
記憶體耗電的原因和構成
一個記憶體條(以下用DIMM代替)插入主機板後,讀寫記憶體和無事可幹時到底耗電多少呢?要了解這個問題,我們先要理解記憶體是如何進行讀寫操作的。這裡需要些背景知識,如果對深入這個問題沒有興趣的朋友可以直接跳過本節:
ofollow,noindex" target="_blank">老狼:記憶體系列一:快速讀懂記憶體條標籤 老狼:記憶體系列二:深入理解硬體原理 老狼:記憶體系列三:記憶體初始化淺析從上面這些文章中我們知道,DIMM是由Rank, Chip和Bank組成。一個簡化的DDR3記憶體結構框圖如下:

在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功耗:



需要指出的是,這個資料沒有利用任何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%的能耗,而在伺服器產品中則高得多。目前對它的功耗控制做的並不好,很多高階的功能並沒有在產品中使用。對它的節能,現在越來越被提上日程,我在參考資料裡面列出了一些相關研究,有興趣的讀者可以作為擴充套件閱讀了解一下。
另一個類似的文章:
老狼:存滿資料的硬碟是不是比空硬碟重?其他記憶體相關文章:
老狼:神祕消失的記憶體去哪了? 老狼:記憶體系列一:快速讀懂記憶體條標籤 老狼:記憶體系列二:深入理解硬體原理 老狼:記憶體系列三:記憶體初始化淺析 老狼:Win10工作管理員中的"專用GPU記憶體"是怎麼回事?“共享GPU記憶體”又是什麼? 老狼:為什麼現在的電腦都這麼吃記憶體?歡迎大家關注本專欄和用微信掃描下方二維碼加入微信公眾號"UEFIBlog",在那裡有最新的文章。同時歡迎大家給本專欄和公眾號投稿!

參考資料:
[1]: https://www. micron.com/~/media/docu ments/products/technical-note/dram/tn41_01ddr3_power.pdf
[3]: http:// users.ece.cmu.edu/~omut lu/pub/memory-dvfs_icac11.pdf