PostgreSQL開啟Huge Page場景分析

      網友投稿 646 2025-04-01

      PostgreSQL用戶經常發現,服務端在連接數較大的情況下,會出現系統內存消耗過多的情況,嚴重者可能會造成OOM。但是服務端配置的共享內存(shared_buffers,wal_buffers等)是一定的,為什么內存會持續增加呢?這就與PostgreSQL的多進程架構有關了,下面我們來分析下。

      1. 大規格PG實例內存使用率較高分析

      為了保證物理內存能得到充分的利用,避免內存空間浪費,Linux把進程當前使用的內存部分加載到物理內存里,而不使用的部分則暫不加載。PostMaster進程注冊共享內存時,系統只是分配一個虛擬的地址空間,并不直接分配物理內存。當有實際的內存訪問時,CPU才會將虛擬地址映射到物理內存的一個地址上。維護這個映射關系的就是PageTable,它負責將虛擬內存地址轉換成物理內存地址。

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

      對于PostgreSQL這種多進程架構程序來說,當服務端使用的共享內存較大,且并發連接數較多時,由于操作系統對于每個進程都要維護單獨的內存映射,PageTable中的元組數目將會變得非常多,所占用的內存大小也會特別大。

      2. Huge Page改善措施

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

      作為世界上最先進的開源數據庫,PostgreSQL也適配了Linux的Huge Page特性,服務端在注冊共享內存時,會通過配置參數huge_pages來決定是否申請大頁內存。

      postgresql.conf:

      huge_pages = on???????????? --?注冊共享內存時必須使用大頁

      huge_pages = try??????????? --?注冊共享內存時首先考慮大頁,若系統提供的大頁內存不足時,則全部使用普通頁

      huge_pages = off??????????? --?注冊共享內存時不使用大頁

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

      3. PG實例開啟Huge Page操作步驟

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

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

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

      (4)重新加載系統配置參數:sysctl –p

      (5)確認是否配置成功。可以看到Huge Page總數為78643

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

      PostgreSQL開啟Huge Page場景分析

      (7)啟動PostgreSQL服務端,可以看到系統中的空閑Huge Page已經減少,部分大頁已經被共享內存使用。

      4. Huge Page使用建議

      雖然Huge Page在一定場景下可以改善服務端內存使用過高的情況,但不是鼓勵所有的PG實例都使用大頁,盲目的開啟Huge Page可能引起服務端的性能下降。下面我們根據Huge Page的優缺點來分析下使用場景。

      Huge Page優勢:

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

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

      (3)極大的減少了系統維護PageTable的內存開銷。

      Huge Page劣勢:

      (1)Huge Page使用的內存需要預先分配;

      (2)Huge Page使用固定大小的內存區域,不會被釋放;

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

      所以強烈推薦PG實例開啟Huge Page的場景:共享內存使用較大(>=8GB)且連接數較多(>= 500),并且熱點數據分散。不推薦PG實例開啟Huge Page的場景:寫業務密集,熱點數據集中且內存使用較小。

      5.PG開啟Huge Page時的注意事項

      (1)當配置參數huge_pages設置為on時,若PG啟動時需要注冊的共享內存大于操作系統提供的Huge Page大小時,數據庫將無法啟動。推薦將huge_pages參數設置為try,在此種場景下,PostMaster將會改為申請普通內存。

      (2)修改shared_buffers/wal_buffers等共享內存相關的GUC參數時,需要重新計算操作系統所需的Huge Page數,以防服務端無法啟動或者部分大頁內存沒有被使用且無法釋放而造成浪費。

      PostgreSQL

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:VLOOKUP函數怎么多條件查找
      下一篇:wps怎么做表格和美化?(wps表格如何美化表格)
      相關文章
      国产亚洲精品一品区99热| 亚洲日本香蕉视频观看视频| 久久亚洲AV无码精品色午夜麻豆| 亚洲人成影院在线无码按摩店 | mm1313亚洲国产精品无码试看| 最新亚洲精品国偷自产在线| 亚洲码在线中文在线观看| 亚洲黄色高清视频| 亚洲国产精品国自产拍电影| 久久精品亚洲日本佐佐木明希| 亚洲乱码一区二区三区在线观看| 久久影视综合亚洲| 4338×亚洲全国最大色成网站| 亚洲一级片免费看| 亚洲一区无码中文字幕| 亚洲一区无码中文字幕| 亚洲国产AV无码专区亚洲AV| 亚洲成av人片在线观看无码不卡| 亚洲男人的天堂www| 国产∨亚洲V天堂无码久久久| 久久久久久a亚洲欧洲aⅴ| 亚洲成A∨人片在线观看不卡| 亚洲AV无码一区二区乱子伦 | 久久亚洲国产中v天仙www| 国产精品亚洲片在线观看不卡| 国产AV无码专区亚洲AV男同| 亚洲电影一区二区| 亚洲精品一区二区三区四区乱码 | 亚洲精品国产高清嫩草影院 | 亚洲娇小性xxxx色| 亚洲欧洲精品成人久久曰| mm1313亚洲国产精品无码试看| 一区国严二区亚洲三区| 亚洲精品尤物yw在线影院| 亚洲一区二区三区香蕉| 亚洲人成网址在线观看 | 国产精品亚洲精品日韩已方| 亚洲欧洲日产国码av系列天堂 | 亚洲国产精品精华液| 一级毛片直播亚洲| 亚洲精品乱码久久久久久中文字幕|