天天看點

瀚高資料庫記憶體結構

目錄

文檔用途

詳細資訊

了解瀚高資料庫的記憶體結構,調整相關記憶體參數的大小以适應目前的運作環境。

瀚高資料庫的記憶體結構如下:

瀚高資料庫記憶體結構

下面将詳細介紹這些記憶體結構。

在瀚高資料庫中,記憶體大概被分為兩大類:

(1)本地記憶體(Local memory area): 為每一個後端程序(backend process)配置設定的記憶體

(2)共享記憶體(Shared memory area):資料庫服務端所有的背景程序(backgroud process)使用的記憶體

(一)本地記憶體:

每一個後端程序都會配置設定一塊本地記憶體,每一塊區域又分為三個子區域。

配置檔案中的參數名是“work_mem”,預設是4MB

設定在寫入臨時磁盤檔案之前,查詢操作(如排序或哈希表)所使用的最大記憶體量。如果指定的值沒有機關,則使用千位元組(kilobytes)。預設值是 4兆位元組(4MB)。注意,對于一個複雜的查詢,可能會并行運作幾個排序(sort)或散列(hash)操作;在開始将資料寫入臨時檔案之前,允許每個操作使用此值指定的所有記憶體(PS.就是說一個查詢,可能分成幾個操作,每個操作單獨配有一塊 work_mem指定大小的記憶體)。另外,幾個正在運作的會話可能同時執行這些操作。是以,使用的總記憶體可能是 work_mem值的許多倍;在選擇值時,有必要記住這一點。排序操作用于 ORDER BY、DISTINCT和合并連接配接(merge joins)。哈希表(hash tables)用于哈希連接配接(hash joins)、基于哈希的聚合(hash-based aggregation)和基于哈希(hash-based)的 IN子查詢處理。

配置檔案中的參數名是“maintenance_work_mem”,預設是64MB

指定維護操作(如:VACUUM、CREATE INDEX和 ALTER TABLE ADD FOREIGN KEY)所使用的最大記憶體量。如果指定的值沒有機關,則使用千位元組(kilobytes)。它的預設值是 64兆位元組(64MB)。由于資料庫會話一次隻能執行其中的一個操作,而且一個安裝通常不會同時運作許多操作,是以可以将這個值設定為比 work_mem大得多的值。較大的設定(值)可能提高清理(vacuuming)和恢複資料庫轉儲(restoring database dumps)的性能。

注意,在運作 autovacuum(自動清理)時,可能會配置設定相當于 autovacuum_max_workers乘以該記憶體(maintenance_work_mem),是以要注意不要将該預設值設定得太高。通過單獨設定 autovacuum_work_mem來進行控制可能會很有用。

配置檔案中的參數名是“temp_buffers”,預設是8MB

設定每個資料庫會話中臨時緩沖區使用的最大記憶體量。這些是僅用于通路臨時表的會話本地緩沖區。如果指定的值沒有機關,則将其作為塊,即 BLCKSZ位元組,通常為8kB。預設值是8MB。(如果 BLCKSZ不是 8kB,則預設值會與之成比例伸縮。)此設定可以在單個會話内更改,但僅限于在會話内第一次使用臨時表之前;後續更改該值的嘗試将不會對該會話産生影響。

會話将根據需要配置設定臨時緩沖區,上限由 temp_buffers指定。在實際上不需要很多臨時緩沖區的會話中設定較大值的代價隻是一個緩沖區描述符,或者在 temp_buffers中每增加一個緩沖區大約 64位元組。但是,如果實際上真使用了緩沖區,則會為它消耗額外的 8192位元組(通常是一個 BLCKSZ位元組)。

(二)共享記憶體:

這塊區域在服務端啟動的時候配置設定,這塊區域也是分為好幾個子區域。

資料庫啟動後,會生成一塊共享記憶體,共享記憶體主要用做資料塊的緩沖區,以便提高讀寫性能。WAL日志緩沖區和CLOG緩沖區也存在共享記憶體中。除此以外還有一些全局資訊也儲存在共享記憶體中,如程序資訊、鎖的資訊、全據統計資訊,等等。

将表或者索引的page從磁盤加載到shared buffer,然後在shared buffer操作。

配置檔案中的參數名是“shared_buffers”,預設是8MB。

設定資料庫服務端用于共享記憶體緩沖區的記憶體量。預設值通常為 128兆位元組(128MB),但如果核心設定不支援它,則可能會更小(核心設定在 initdb期間确定)。此參數設定必須至少為 128KB。但是,為了獲得良好的性能,通常需要設定為比最小值高得多的值。如果指定的值沒有機關,則将它視為塊(blocks),即 BLCKSZ位元組(塊位元組),通常為 8kB。(BLCKSZ的非預設值更改了最小值的大小。PS:最小值與塊大小有關系)此參數隻能在服務端啟動時設定。

如果你有一個具有 1GB或更多 RAM的專用資料庫伺服器(PS.是否指該伺服器隻用來一個資料庫集簇使用),合理的 shared_buffers起始值是系統中記憶體的 25%。在某些工作負載中,shared_buffers的更大設定是高效的,但由于 PostgreSQL也依賴于作業系統緩存,是以将超過 40%的 RAM配置設定給 shared_buffers不太可能比配置設定較小的記憶體更優。對于 shared_buffers,較大的設定通常需要相應地增加 max_wal_size,以便在較長一段時間内分散寫入大量新資料或更改資料的過程。

在RAM小于1GB的系統上,較小的 RAM百分比是合适的,以便為作業系統留下足夠的空間。

在服務端出現問題的時候,確定資料不會丢失,在寫到磁盤之前,wal buffer是wal log的緩存區域

配置檔案中的參數名是“wal_buffers”,預設是16MB。

用于尚未寫入磁盤的WAL資料的共享記憶體量。預設設定-1時,選擇的大小等于shared_buffers的1/32(大約3%),但不小于64kB,也不大于一個WAL段的大小,通常為16MB。如果自動選取的值太大或太小,可以手動設定該值,但是任何小于32kB的正數值将被視為32kB。如果指定的值沒有機關,則将“WAL塊”作為機關,即“XLOG_BLCKSZ”位元組,通常為 8kB。此參數隻能在服務端啟動時設定。

在每次事務送出時,WAL緩沖區的内容都被寫到磁盤上,是以非常大的值不太可能提供顯著的性能益處。但是,将這個值設定為至少幾兆位元組可以提高在許多客戶機同時送出的繁忙服務端上的寫性能。在大多數情況下,通過預設設定-1選擇的自動調優應該會給出合理的結果。

為了并發控制所有事物的狀态的保持而配置設定的區域

通過clog(commit log)存儲每個事務的狀态,在資料庫啟動時,clog檔案會加載到共享記憶體中,checkpoint時會把共享記憶體中的事務狀态資訊重新整理到磁盤上。

另外,瀚高資料庫還配置設定一些其他的記憶體區域:

為通路控制配置設定的子區域,比如輕量級鎖,共享或者專有鎖。

為其他backgroud process提供的子區域,比如檢查點,vacuum。

為事物處理提供的子區域,比如事物中的儲存點,和二階段事物送出。