1. 程式人生 > >PostgreSQL在啟動時如何分配共享快取

PostgreSQL在啟動時如何分配共享快取

相信很多人知道 shared_buffers 這個引數,它設定共享快取的大小,本篇簡單講一下它是怎樣分配的。

1、引數設定(src/backend/utils/misc/guc.c)

	/*
	 * We sometimes multiply the number of shared buffers by two without
	 * checking for overflow, so we mustn't allow more than INT_MAX / 2.
	 */
	{
		{"shared_buffers", PGC_POSTMASTER, RESOURCES_MEM,
			gettext_noop("Sets the number of shared memory buffers used by the server."),
			NULL,
			GUC_UNIT_BLOCKS
		},
		&NBuffers,
		1024, 16, INT_MAX / 2,
		NULL, NULL, NULL
	},

可以看到,這個引數在核心中並不是實際記憶體的大小,而是塊數GUC_UNIT_BLOCKS(這個有興趣可以讀guc程式碼,看起來也有必要單獨寫一篇。)

假設我們設定512M,編譯時選擇塊尺寸8k,那麼應該分配塊數是 51210241024/8192,總共65536個塊。

2、共享記憶體的分配

實際上,共享快取只是共享記憶體的一部分,這不是我們本篇的重點,所以只是簡單一提。資料庫啟動時計算總共享記憶體的大小,然後從OS申請(src/backend/storage/buffer/buf_init.c):

Size
BufferShmemSize(void)
{
	Size		size = 0;

	/* size of buffer descriptors */
	size = add_size(size, mul_size(NBuffers, sizeof(BufferDescPadded)));
	/* to allow aligning buffer descriptors */
	size = add_size(size, PG_CACHE_LINE_SIZE);

	/* size of data pages */
	size = add_size(size, mul_size(NBuffers, BLCKSZ));
...
	size = add_size(size, mul_size(NBuffers, sizeof(LWLockMinimallyPadded)));
	/* to allow aligning the above */
	size = add_size(size, PG_CACHE_LINE_SIZE);

	/* size of checkpoint sort array in bufmgr.c */
	size = add_size(size, mul_size(NBuffers, sizeof(CkptSortItem)));
...

還有塊描述符、鎖、檢查點排序區的分配,這裡有過大的改動,為了更好的利用cache line,早先版本一個單獨的結構體拆成多個。

諸位有興趣可以找以前的程式碼做對比,不寫這篇文章我都不會看到這變化,對社群補丁關注不夠。

3、共享快取初始化

在申請OS共享記憶體(見PGSharedMemoryCreate,有多個平臺版本)之後,再從中分配(ShmemInitStruct)出上邊看到的幾個部分,這些程式碼見src/backend/storage/buffer/buf_init.c:

	BufferBlocks = (char *)
		ShmemInitStruct("Buffer Blocks",
						NBuffers * (Size) BLCKSZ, &foundBufs);

這是快取部分的申請,可以看到,它又從共享記憶體中分配出512M(65536*8192)。

然後就是初始化,各種鎖、狀態。

4、更多考慮

從上邊程式碼可以看出為什麼PG不能動態增加共享快取,因為它的塊描述是一次性分配,然後就不能再改變。考慮下Oracle引數SGA_MAX_SIZE,允許動態分配但有這個上限,可以推斷它似乎也有快取塊描述符類似的東西,一次性分配留作以後使用。PG想實現動態管理是不是就有了思路,也不是很難,這取決於共享記憶體的分配方式,可以閱讀 PGSharedMemoryCreate 瞭解更多,也可以對比以前的老版本,看看分配方式實現有什麼不同(記得是 9.1、9.2)。

字數寫得不多,點出主要程式碼在何處,把程式碼搬到這裡也沒什麼意思。

 

歡迎關注我的公眾號,文章同步釋出。

相關推薦

PostgreSQL啟動如何分配共享快取

相信很多人知道 shared_buffers 這個引數,它設定共享快取的大小,本篇簡單講一下它是怎樣分配的。 1、引數設定(sr

springboot 整合redis ,在專案啟動載入redis快取

因為在專案中,會有字典表,機構表,使用者表,這些一般情況下,資料發生改變的的概率比較小,而且經常涉及到查詢,轉碼,查詢資料庫的頻率較高,因此在專案啟動時將這些資料表載入到快取中,以便使用。 redis是一種高階的key:value儲存系統,其中value支援五種資料型別:

tomcat啟動快取放入Redis中

package com.tmhc.sms.cache; import java.util.List; import java.util.Map; import java.util.Set; imp

zabbix_agentd啟動IPC和共享記憶體段問題

問題1: zabbix_agentd [16428]: cannot recreate Zabbix semaphores for IPC key 0x7a026869 Semaphore ID 4294967295: [22] Invalid argument 檢視KE

Tomcat啟動載入資料到快取[web.xml中listener載入順序]

最近用到在Tomcat伺服器啟動時自動載入資料到快取,這就需要建立一個自定義的快取監聽器並實現ServletContextListener介面,並且在此自定義監聽器中需要用到Spring的依賴注入功能.在web.xml檔案中監聽器配置如下: <li

PostgreSQL查詢資料庫啟動時間和啟動長的方法

通過sql查詢資料庫啟動時間的方法。 highgo=# select pg_postmaster_start_time(); pg_postmaster_start_time ---

javaweb項目啟動自動啟動rmi服務器實例

java warn 地址 public 配置 -name ace war -o 1.我們先寫一個web項目啟動時需要運行的類RmiRegisterServlet.java package com.mx.Servlet; import javax.servlet.Serv

tomcat部署新的項目啟動出現報錯信息: Invalid byte tag in constant pool: 15

tomcat 啟動報錯 invalid byte tag in constant pool ......org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 15

遇到一個spring啟動類找不到的問題~

eclips singleton jar ebe esc apach star ole bsp 今天將一個老的項目部署到Tomcat7上運行時,spring初始化一直失敗,提示錯誤如下: Java.lang.NoClassDefFoundError:org.springfr

iOS App初次啟動的用戶引導頁制作實例分享

復制代碼 bound gpo 並且 fault launch boa com content iOS App初次啟動時的用戶引導頁制作實例分享 作者:老初 字體:[增加 減小] 類型:轉載 時間:2016-03-09 我要評論 這篇文章主要介紹了iOS App初次啟動

Tomcat啟動載入某個servlet

不為 load color col pos ems 項目 設置 應用 當我們做一個java項目時,有幾個功能都須要載入servlet或者實現某個共同的方法,盡管我們一味地在每個功能中依次載入也不是不能夠,可是當某個servlet 或者方法被頻繁地載入和應用。我

PostgreSQL copy 提示:ERROR: invalid byte sequence for encoding "UTF8": 0xb3

color 方式 clas lena 三種 rep schema error val 測試時使用三種文件格式: ISO-8859 Netpbm PBM image ASCII if [ $(file $filename|grep -c "ISO-8859") -gt 0

[轉]Android Studio啟動出現unable to access android sdk add-on list

上大 ras server tails dea tar ext ida 錯誤信息 轉載請標明出處:http://blog.csdn.net/xx326664162/article/details/50563122 文章出自:薛瑄的博客 你也可以查看我的其他同類文章,也會讓你

CentOS7.2通用二進制格式安裝mariadb-5.5.46-linux-x86_64.tar.gz文檔與啟動失敗排查分析

centos7.2通用二進制格式安裝mariadb-5.5.46-linux-x86_64.tar.gzCentOS7.2通用二進制格式安裝mariadb-5.5.46-linux-x86_64.tar.gz提前準備好mariadb-5.5.46-linux-x86_64.tar.gz[[email 

xampp啟動顯示的錯誤

錯誤 this nbsp 啟動 opp depend ges ould not xampp啟動時顯示的錯誤為: 9:52:41 [Apache] Attempting to start Apache app... 9:52:41 [Apache] Status ch

xampp中的mysql啟動無法產生err文件

xampp errcode 13 permission denied mysqlcentos6.5,安裝完xampp5.6.30,啟動mysql報錯,不能產生.err文件[[email protected]/* */_server ~]# /opt/lampp/lampp startmysqlXA

tomcat 服務不支持 chkconfig 以及其他服務不能添加到開機啟動的操作

支持 bin 服務 啟動 tomcat chmod 報錯 但是 列表 在安裝完tomcat後想添加的開機自啟動的操作,但是報錯tomcat 服務不支持 chkconfig,後來在 /etc/init.d/tomcat中的#!/bin/bash後添加上#chkconfig:

selenium-webdriver啟動開啟firebug

jsp ges cti page style tex index profile http File file = new File("D:/software/firefox/firebug-2.0.16-fx.xpi"); FirefoxProfile profile =

C語言中的編譯分配內存

一個 地址 移植 eap 也會 功能 空間大小 全局區 限定 1.棧區(stack) --編譯器自動分配釋放,主要存放函數的參數值,局部變量值等; 2.堆區(heap) --由程序員分配釋放; 3.全局區或靜態區 --存放全局變量和靜態變量;程序結束時由系統釋放,分為全局初

應用啟動將白屏背景替換成圖片/顏色/動畫等 僅供參考

lns cte star cat 16px 繼承 encoding 默認啟動 drawable 1.創建自己的主題樣式(style) 在vules資源目錄下的style中創建一個樣式 <style name="MyTheme" parent="Theme