記憶體大小與效能的理解
背景
上週末同事負責的一個專案出現了卡頓.
應用層專家給出的結論是:
因為開啟了profiler, 導致效能下降. 引起卡頓.
資料庫dba給出的結論是:
因為記憶體不足, 導致無法將data buffer填充到記憶體區域
引起大量的物理讀的操作, 進而引起卡頓.
雲服務商給的結論是:
資料庫伺服器的資料磁碟使用的是分散式儲存
不適合SQLServer這類資料庫的應用, 需要升級.
緊接著本週又出現了一個Oracle的異常問題
檢視AWR發現, 有一個大表一小時產生了3.4TBytes的物理讀.
然後awr的最後的 建議裡面提高,增加SGA區域可以降低物理讀.
突然想到, 其實兩者的問題原因是類似的.
記憶體作為一個緩衝.具有非常大的提速增效的功能.
關於算力和記憶體的關係
算力是最近一個非常火的話題
因為英偉達的AI算力卡佔據了非常多的公眾號的內容.
算力是下一代科技革命的基礎設施已經深入人心.
其實不僅僅GPU有算力的說法, CPU也是有算力的說法.
CPU的能力能夠決定很大一部分計算的速度.
但是需要說明的是 除了一小部分科學計算.
大部分計算都需要有大量的記憶體和磁碟的互動
獲取資料, 加工資料, 儲存資料.
不管是SMP架構的伺服器還是NUMA架構的伺服器.
CPU都需要跟記憶體互動獲取需要計算的資料.
所以CPU可以決定上限, 但是記憶體和磁碟會決定計算能力的下線.
涉及到算力的記憶體和儲存的引數主要有三個:
頻寬 時延 頻率
三者缺一不可.
關於記憶體對算力的影響
記憶體的頻率決定,記憶體能否跟的上CPU的算力.
如果記憶體頻率很低, CPU可能處於空跑狀態.
CPU可能利率用很高, 但是實際上不出力. 現象可能為:
CPU很高, 但是風扇轉速和功耗都不高.
因為記憶體喂不飽CPU,導致CPU等待空跑而不是努力幹活.
記憶體的頻寬決定單位時間內記憶體能夠給出的資料量.
現階段都是多核心的CPU. 工作頻率可能決定給單個CPU幹活的效率
記憶體頻寬才可能決定給所有CPU幹活的上限.
一個簡單的計算. 64核心的伺服器. 3Ghz的工作頻率, 64為的處理器的情況下
64*4*8 GB/S 可能是一個很簡單的總體的能夠資料的頻寬.
如果加上SIMD 類似於AVX512 NENO等指令集, 他能夠需要的頻寬會更高.
這也是為什麼英偉達採用自己的 GPU連結方式,而不是採用DDR或者是PCI-E
自有協議的頻寬更高.
延遲決定一個事務響應的時間.
延遲越低 CPU越能夠在更快的時間內完成對資料的讀取和寫入.
對資料的操作由CPU的能力和業務演算法來決定, 但是讀取和寫入純粹靠記憶體的效能.
延遲的核心其實是CL 值 .
需要說明 記憶體不一定是越大越好, 需要更高的工作頻率和更低的CL值.
減少記憶體讀寫的延遲, 減少磁碟讀寫的延遲, 減少網路互動的延遲能夠最大程度的提高效能.
對最近當機問題的理解
1. 資料庫需要大量的記憶體作為buffer.
資料庫需要有一個大記憶體進行存放data buffer
需要有一個大記憶體進行 sort buffer 需要有一個大記憶體用於儲存 parse 後的執行計劃.
如果記憶體比較小, 可以執行 但是遇到大表的讀寫. 大併發下PGA的使用.
大量SQL執行下的執行計劃的儲存和編譯需求時
記憶體不夠, 會極大降低系統的響應效率.
影響客戶體驗.
2.關於應用伺服器
Java應用需要大量記憶體做堆區. 堆區不夠用救護易產生大量的GC 引起卡頓和CPU利用率上升.
優秀的功能開發可能會使用較少的記憶體能夠實現大量的工作
但是比較差的開發,可能會浪費很多記憶體, 浪費很多資源進行計算, 會導致記憶體使用劇增
比如一些記憶體排序, 一些大表的無關列的查詢與使用.
除了堆區之後還需要有很多記憶體用於後設資料區, 方法區, GC也會使用. 執行緒堆疊也會使用.
如果記憶體不足了,不僅會oom 還會 out of stack.
高併發時 java new 記憶體的需求暴增, 會導致大量的記憶體使用
如果記憶體不足, 可能會導致機器卡頓 然後到當機
3. 關於作業系統.
作業系統會快取大量的最近讀寫的檔案.
如果是web伺服器, 會快取最近讀取的檔案
如果是應用伺服器, 載入的jar包也會記錄到記憶體cache中去
如果寫入日誌,也會將日誌佔用快取
如果還有檔案上傳下載的需求也會佔用大量記憶體.
如果此時有一個突發的記憶體需求. linux 會先將記憶體中的區域排空 drain
然後才能夠進行使用.
此時記憶體的清空, 初始化, 以及寫入可能會導致很大的卡頓.
這個時候他的效率基本上就是 受到記憶體工作頻率的影響.
因為此時一般是單執行緒進行回收和申請
可以理解為 是兩倍的記憶體用量 處於 記憶體的工作頻率
比如一個 3.2GB記憶體的申請, 需要至少排幹3.2GB記憶體,然後再往裡面寫入資料
記憶體如果是 3200MT/S的話. 等效工作頻率下至少需要 兩秒鐘才可以完成這個工作.
如果加上CPU的計算, 磁碟的緩慢處理. 還有業務程式碼的一些延遲
可能超過3秒也不是不可能.
所以有時候一些動作的效能跟記憶體的申請是有很大的關係的
總結
CPU 就像是一個學生.
老師則是一個欲求無窮的人.
他做題的速度決定他的排名.
速度越快, 他能夠做的題目越多
此時記憶體就像是他讀和寫字的速度.
大腦快, 讀的快寫的快才可以更快的做題.
CPU內的快取和取指執行等.則是決定他的思路的快慢.
IPC決定他的真實速度,而不是虛張聲勢的速度