點擊上方“IT那活兒”,關注后了解更多精彩內容?。?!
最近看著手頭維護的數據庫服務器,發(fā)現物理內存是越來越大,500G起步,TB也不在話下。都知道數據庫是一種吃內存的軟件,但是面對如此巨大的物理內存,如何高效的使用又成了一個話題,于是各家數據庫軟件廠商針對這個問題都引入了參數調優(yōu)。
比如oracle的use_large_pages,mysql的large_pages,postgres的huge_pages等參數,都是用來告訴數據庫是否使用大頁模式的內存策略。
這里有個關鍵詞就是 大頁(huge page),我們以postgres為例來查一下他們的文檔解釋:
其中有2段話比較重要,第一段就是說使用大頁(huge page)能夠縮小page tables,減少cpu在內存管理上的的系統(tǒng)開銷,提高性能,注意依賴于操作系統(tǒng)的大頁配置情況。而第二段意思說在Linux/FreeBSD這類操作系統(tǒng)上還有一種自動的大頁(huge page)管理策略稱之為透明大頁(transparent huge page/ THP), 而THP經常會導致數據庫性能下降,hang之類的,需要禁用這個THP策略。作為oracle老司機一看這個TPH就很懂,不管是MOS上的文檔,還是處理過的案例都是一茬一茬的。如下:
由于THP引起大量的重啟、以及性能問題 Oracle強烈建議客戶關閉THP特性。
經過數據庫的文檔描述我們知道,數據庫廠商都建議啟用大頁來提升性能,并且都強烈建議關閉透明大頁以免引起各類故障。接下來我們就來深入了解一下這2個點:
我們以rhel的文檔為參考,如下:
文檔主要描述linux大多數頁為標準頁4k,當內存較大時建議配置大頁,降低開銷之類的。
Linux內存采用段頁式管理,這里我們不在深入探討。物理內存會按照標準頁(page)4k來進行劃分,所有的4k頁打包在一塊就是page tables,比較簡單。當物理內存為100G時 page tables=(100*1024*1024/4)。
由此可以確認page tables與物理內存成正比關系,隨著物理內存的增長,page tables 則會越來越龐大不利于管理,損耗就會逐步上升。舉個例子:當我們口袋里有1000塊的1元時,錢包都炸裂了,可以想象這是多么恐怖的一件事。此時我們就需要使用50和100的單位了。這個單位就是具體的 huge page size,通常在linux中為2048k,也就是2M。當巨量的數據庫內存使用2M 的大頁時,產生的page tables則相對較小,page table的理開銷則相對較小,從而提升系統(tǒng)性能。如下圖:
實際數據庫一般使用共享內存,大量的用戶連接進程attach到一個巨大的共享內存段(page table)時,也會產生隱性開銷,比如進程fork過慢導致數據庫連接建立緩慢等等。搞清楚了大頁原理,我們在設置數據庫大頁時則相對簡單了,一般計算公式為:
大頁數=共享內存(GB) *1024/2,當我們算出頁量時,設置Linux 參數vm.nr_hugepages就可以了,如下:
圖中我們使用計算器求出3G內存的頁數,然后設置nr_hugepages使之生效,就是HugePages_Total,當然我們這里沒有使用所以大頁都是Free狀態(tài). 注意寫入sysctl.conf中后可以永久生效。
老樣子先查一下rhel的文檔描述,如下:
主要描述由于上文的大頁配置為手動模式,不是很靈活,于是內核又搞出了一個自動分配大頁的技術,用來代替手動分配大頁。以及THP主動性的分配連續(xù)大頁內存以及頻繁的page compact等可能會導致內存分配延遲,引發(fā)性能問題。
關閉也很簡單,如下:
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 或者修改/etc/grub.conf 添加transparent_hugepage=neve
最后我們總結一下,實際在數據庫服務器上,巨大的共享內存段屬于啟動時的一次性分配,且大部分的啟動操作都屬于計劃性的工作,不需要內核給我們動態(tài)分配,而數據庫連接的那些server process往往內存較小也不需要用到大頁,也就是Oracle強烈建議關閉THP的原因,本文就到此為止。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129728.html
摘要:前言我們知道,由于沒有多線程模型,所以更多的使用多進程模型,因此代碼相對來說更加簡潔,減少了各種線程鎖的阻塞與同步,但是也帶來了新的問題數據同步。相比多線程之前可以直接共享進程的內存,進程之間數據的相互同步依賴于共享內存。 前言 我們知道,由于 PHP 沒有多線程模型,所以 swoole 更多的使用多進程模型,因此代碼相對來說更加簡潔,減少了各種線程鎖的阻塞與同步,但是也帶來了新的問題...
摘要:或許,最重要的是和內核調度,兩者都是進行清理工作,以緩解英特爾的和漏洞。說到英特爾,增加了對的平臺的更多支持,該平臺可根據需要優(yōu)先處理工作負載。另外,還將增加戴爾硬件隱私支持。linux之父Linus Torvald:慶祝完Linux 30 歲了吧,一起來看新的 Linux 5.14。linux5.14晉升為穩(wěn)定版,在精彩的2021年秋季linux發(fā)行版大量出現之前提供最新的功能、硬件支持和...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20