在「4.1.4.5 buf置換管理演算法」中,我們描述了buf排程演算法。pg首先是從freelist中取出空餘的優先供快取請求使用。如果freelist空,才去真正淘汰快取塊。
所以,乙個思路是:盡可能增加freelist中的成員,使得淘汰減少,是否物理io也可以減少呢?
先看pg對於freelist的操作方式:
1. 從結構上看,首先定義出乙個指標,用來指向空餘的buf,見如下藍色字型
typedef struct bufferaccessstrategydata
bufferaccessstrategydata;
2. 從這個指標的呼叫關係看,共被:增加空餘buf到鍊錶操作(addbuffertoring)和從鍊錶取出空餘buf 操作構成(getbufferfromring)
bufferaccessstrategydata.buffers
bufferaccessstrategydata(就是如上的資料結構)
getbufferfromring
addbuffertoring
strategyrejectbuffer
3. 從函式的呼叫關係看,getbufferfromring和addbuffertoring函式,都是被strategygetbuffer函式呼叫。而當有快取塊被申請使用時,才會呼叫到strategygetbuffer函式(從strategygetbuffer函式的**中可以看出,只有使用指定「淘汰策略」,才會從乙個「ring」上拿出空餘的buf供上層使用)。這樣,freelist上的空餘buf增加的機會並不多。這樣,可能會影響著buf的有效利用。
* if given a strategy object, see whether it can select a buffer. we
* assume strategy objects don't need the buffreelistlock. */
if (strategy != null)
} 所以,我們可以知道,此處也有改進餘地。
改法:增加乙個執行緒,在適當的時機,遍歷緩衝區,當發現空餘的緩衝區存在時,即補充到freelist上,這樣當需要申請緩衝區時,freelist盡可能地多存在空閒快取塊。
什麼時候讓這個執行緒啟動去幹活呢?上一節,增加了非同步io操作(提出了預取功能)。當發出非同步io讀寫請求時,資料還沒有到位,也許是啟動這樣執行緒的最佳時機。
深入理解緩衝區(九)
4.1.4.3 內外存位址是如何對映的 1 快取對應的內外存的對映關係 typedef struct buftag relfilenode rnode physical relation identifier 資料庫物件的位置標識,具體說明見下 forknumber forknum 可以檢視 rel...
深入理解緩衝區(二)
池,停水曰池。廣韻 所以,池,能蓄積物。引申後,池能蓄積執行緒,則稱之為執行緒池 池能蓄積程序則稱之為程序池。另外常見的還有資料庫連線池 iis6.0 中的位址池 記憶體池 1 等等。其中,記憶體池的概念,類似緩衝區。我這裡討論的,著重於 postgresql 資料庫系統的實現例項。cache 偏於...
深入理解緩衝區(三)
3 快取的作用和常見場景 3.1 快取的作用 快取,可以把常用的一些 物件 暫且稱為物件 蓄積起來,供使用,這樣,將減少被快取物件的生成 銷毀等時間,如果物件被反覆使用,且其生成 銷毀需要花費時間,則快取這樣物件對於時間的節省可能很有效。快取元件提供retrieve add remove等功能。過期...