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