溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PostgreSQL如何開啟Huge Page場景

發(fā)布時(shí)間:2021-11-26 09:34:25 來源:億速云 閱讀:136 作者:小新 欄目:云計(jì)算

小編給大家分享一下PostgreSQL如何開啟Huge Page場景,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

1. 大規(guī)格PG實(shí)例內(nèi)存使用率較高分析

為了保證物理內(nèi)存能得到充分的利用,避免內(nèi)存空間浪費(fèi),Linux把進(jìn)程當(dāng)前使用的內(nèi)存部分加載到物理內(nèi)存里,而不使用的部分則暫不加載。PostMaster進(jìn)程注冊(cè)共享內(nèi)存時(shí),系統(tǒng)只是分配一個(gè)虛擬的地址空間,并不直接分配物理內(nèi)存。當(dāng)有實(shí)際的內(nèi)存訪問時(shí),CPU才會(huì)將虛擬地址映射到物理內(nèi)存的一個(gè)地址上。維護(hù)這個(gè)映射關(guān)系的就是PageTable,它負(fù)責(zé)將虛擬內(nèi)存地址轉(zhuǎn)換成物理內(nèi)存地址。

Linux的內(nèi)存管理采取的是分頁存取機(jī)制:把較大的物理內(nèi)存分為了一個(gè)個(gè)固定大小(4kB)的內(nèi)存頁進(jìn)行管理。每塊內(nèi)存頁通過PageTable中的一個(gè)元組來維護(hù)虛擬/物理內(nèi)存之間的映射。CPU為了提高虛擬/物理內(nèi)存之間的轉(zhuǎn)換效率,也會(huì)在TLB中緩存一定量的Page Table元組。

對(duì)于PostgreSQL這種多進(jìn)程架構(gòu)程序來說,當(dāng)服務(wù)端使用的共享內(nèi)存較大,且并發(fā)連接數(shù)較多時(shí),由于操作系統(tǒng)對(duì)于每個(gè)進(jìn)程都要維護(hù)單獨(dú)的內(nèi)存映射,PageTable中的元組數(shù)目將會(huì)變得非常多,所占用的內(nèi)存大小也會(huì)特別大。

2. Huge Page改善措施

Linux為了應(yīng)對(duì)這種場景,降低多進(jìn)程下PageTable的內(nèi)存消耗。自從2.6及以上內(nèi)核版本提供了內(nèi)存頁大小為2MB的管理方式,稱為Huge Page。如果使用Huge Page的話,相同物理內(nèi)存使用量的情況下內(nèi)存頁的數(shù)目變少,減少了PageTable元組的條目個(gè)數(shù),從而降低了系統(tǒng)的內(nèi)存占用。

作為世界上最先進(jìn)的開源數(shù)據(jù)庫,PostgreSQL也適配了Linux的Huge Page特性,服務(wù)端在注冊(cè)共享內(nèi)存時(shí),會(huì)通過配置參數(shù)huge_pages來決定是否申請(qǐng)大頁內(nèi)存。

postgresql.conf:
    huge_pages = on             -- 注冊(cè)共享內(nèi)存時(shí)必須使用大頁
    huge_pages = try            -- 注冊(cè)共享內(nèi)存時(shí)首先考慮大頁,若系統(tǒng)提供的大頁內(nèi)存不足時(shí),則全部使用普通頁
    huge_pages = off            -- 注冊(cè)共享內(nèi)存時(shí)不使用大頁

真實(shí)應(yīng)用場景:某PG用戶將實(shí)例(shared_buffers = 64GB)部署在一臺(tái)內(nèi)存為256GB的ECS上,業(yè)務(wù)繁忙時(shí)ECS內(nèi)存使用率為85%,PageTable占用內(nèi)存120GB。而開啟Huge Page后相同業(yè)務(wù)場景的內(nèi)存使用率降低到50%以下,PageTable大小僅300M!

3. PG實(shí)例開啟Huge Page操作步驟

(1)查看操作系統(tǒng)的Huge Page大小grep Hugepage /proc/meminfo

(2)估算PostgreSQL實(shí)例需要的Huge Page使用量:128GB/2MB * 1.2 = 78643

(3)/etc/sysctl.conf中添加:vm.nr_hugepages = 78643

(4)重新加載系統(tǒng)配置參數(shù):sysctl –p

(5)確認(rèn)是否配置成功??梢钥吹紿uge Page總數(shù)為78643

(6)確認(rèn)PG配置文件打開huge_pages

(7)啟動(dòng)PostgreSQL服務(wù)端,可以看到系統(tǒng)中的空閑Huge Page已經(jīng)減少,部分大頁已經(jīng)被共享內(nèi)存使用。

PostgreSQL如何開啟Huge Page場景

4. Huge Page使用建議

雖然Huge Page在一定場景下可以改善服務(wù)端內(nèi)存使用過高的情況,但不是鼓勵(lì)所有的PG實(shí)例都使用大頁,盲目的開啟Huge Page可能引起服務(wù)端的性能下降。下面我們根據(jù)Huge Page的優(yōu)缺點(diǎn)來分析下使用場景。

Huge Page優(yōu)勢:

(1)CPU的TLB可以緩存的物理地址空間更大,從而提升TLB的命中率,降低CPU負(fù)載;

(2)Huge Page使用的內(nèi)存是不可交換(swap)的,沒有內(nèi)存空間換入/換出的開銷;

(3)極大的減少了系統(tǒng)維護(hù)PageTable的內(nèi)存開銷。

Huge Page劣勢:

(1)Huge Page使用的內(nèi)存需要預(yù)先分配;

(2)Huge Page使用固定大小的內(nèi)存區(qū)域,不會(huì)被釋放;

(3)對(duì)于寫密集型的場景,Huge Page會(huì)加大Cache寫沖突的發(fā)生概率。

所以強(qiáng)烈推薦PG實(shí)例開啟Huge Page的場景:共享內(nèi)存使用較大(>=8GB)且連接數(shù)較多(>= 500),并且熱點(diǎn)數(shù)據(jù)分散。不推薦PG實(shí)例開啟Huge Page的場景:寫業(yè)務(wù)密集,熱點(diǎn)數(shù)據(jù)集中且內(nèi)存使用較小。

5.PG開啟Huge Page時(shí)的注意事項(xiàng)

(1)當(dāng)配置參數(shù)huge_pages設(shè)置為on時(shí),若PG啟動(dòng)時(shí)需要注冊(cè)的共享內(nèi)存大于操作系統(tǒng)提供的Huge Page大小時(shí),數(shù)據(jù)庫將無法啟動(dòng)。推薦將huge_pages參數(shù)設(shè)置為try,在此種場景下,PostMaster將會(huì)改為申請(qǐng)普通內(nèi)存。

(2)修改shared_buffers/wal_buffers等共享內(nèi)存相關(guān)的GUC參數(shù)時(shí),需要重新計(jì)算操作系統(tǒng)所需的Huge Page數(shù),以防服務(wù)端無法啟動(dòng)或者部分大頁內(nèi)存沒有被使用且無法釋放而造成浪費(fèi)。

以上是“PostgreSQL如何開啟Huge Page場景”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI