Linux 標準大頁和透明大頁
Huge pages ( 標準大頁 ) 和 Transparent Huge pages( 透明大頁 )
在 Linux 中大頁分為兩種:Huge pages ( 標準大頁 ) 和 Transparent Huge pages( 透明大頁 ) 。
記憶體是以塊即頁的方式進行管理的,當前大部分系統預設的頁大小為 4096 bytes 即 4K。1MB 記憶體等於 256 頁;1GB 記憶體等於 256000 頁。
CPU 擁有內建的記憶體管理單元,包含這些頁面的列表,每個頁面通過頁表條目引用。當記憶體越來越大的時候, CPU 需要管理這些記憶體頁的成本也就越高,這樣會對作業系統的效能產生影響。
Huge Pages
Huge pages 是從 Linux Kernel 2.6 後被引入的,目的是通過使用大頁記憶體來取代傳統的 4kb 記憶體頁面, 以適應越來越大的系統記憶體,讓作業系統可以支援現代硬體架構的大頁面容量功能。
Huge pages 有兩種格式大小:2MB 和1GB ,2MB 頁塊大小適合用於 GB 大小的記憶體, 1GB 頁塊大小適合用於 TB 級別的記憶體;2MB 是預設的頁大小。
Transparent Huge Pages
Transparent Huge Pages 縮寫 THP ,這個是 RHEL 6 開始引入的一個功能,在 Linux6 上透明大頁是預設啟用的。
由於 Huge pages 很難手動管理,而且通常需要對程式碼進行重大的更改才能有效的使用,因此 RHEL 6 開始引入了 Transparent Huge Pages ,THP 是一個抽象層,能夠自動建立、管理和使用傳統大頁。
THP 為系統管理員和開發人員減少了很多使用傳統大頁的複雜性 , 因為 THP 的目標是改進效能,因此其它開發人員 ( 來自社群和紅帽 ) 已在各種系統、配置、應用程式和負載中對 THP 進行了測試和優化。這樣可讓 THP 的預設設定改進大多數系統配置效能。但是,不建議對資料庫工作負載使用 THP 。
這兩者最大的區別在於: 標準大頁管理是預分配的方式,而透明大頁管理則是動態分配的方式。
標準大頁的頁面大小
[[email protected] ~]# grep Hugepagesize /proc/meminfo Hugepagesize: 2048 kB
注:THP 目前只能對映非同步記憶體區域,比如堆和棧空間
使用Huge pages優點
Oracle 官方是推薦我們使用 Huge pages 的,它擁有以下的好處:
Larger Page Size and Less # ofPages: Default page size is 4K whereas the HugeTLB size is 2048K. That meansthe system would need to handle 512 times less pages.
Reduced Page Table Walking:Since a HugePage covers greater contiguous virtual address range than a regularsized page, a probability of getting a TLB hit per TLB entry with HugePages arehigher than with regular pages. This reduces the number of times page tablesare walked to obtain physical address from a virtual address.
Less Overhead for MemoryOperations: On virtual memory systems (any modern OS) each memory operation isactually two abstract memory operations. With HugePages, since there are lessnumber of pages to work on, the possible bottleneck on page table access isclearly avoided.
Less Memory Usage: From theOracle Database perspective, with HugePages, the Linux kernel will use lessmemory to create pagetables to maintain virtual to physical mappings for SGAaddress range, in comparison to regular size pages. This makes more memory tobe available for process-private computations or PGA usage.
No Swapping: We must avoidswapping to happen on Linux OS at all Document 1295478.1. HugePages are notswappable (whereas regular pages are). Therefore there is no page replacementmechanism overhead. HugePages are universally regarded as pinned.
No 'kswapd' Operations: kswapdwill get very busy if there is a very large area to be paged (i.e. 13 millionpage table entries for 50GB memory) and will use an incredible amount of CPUresource. When HugePages are used, kswapd is not involved in managing them. Seealso Document 361670.1
使用 Huge pages缺點
當然使用 Huge pages 也會存在某些缺點:
首先,開啟該功能需要進行額外設定,
第二, Huge pages 和 Oracle 11g新 特性 AMM ( Automatic Memory Management )是相互衝突的,但是 ASMM ( Automatic Shared Memory Management )仍然可以繼續使用。
Transparent Huge pages存在的問題
Oracle 官方雖然推薦我們使用 Huge pages ,但是卻建議我們關閉 Transparent Huge pages ,因為透明大頁存在一些問題:
在 RAC 環境下 透明大頁( TransparentHugePages )會導致異常節點重啟,和效能問題;
在單機環境中,透明大頁( TransparentHugePages ) 也會導致一些異常的效能問題;
注:Transparent Huge Pages在32位的RHEL 6中是不支援的。
如何關閉 Transparent Huge pages ?#
環境:CentOS Linux release 7.8.2003 (Core)
[[email protected] ~]# grep Huge /proc/meminfo AnonHugePages: 7956480 kB ----->>返回值不為0,表示開啟了THP HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
檢查當前的transparent_hugepage狀態(以下為開啟狀態)
# cat /sys/kernel/mm/transparent_hugepage/enabled [always] madvise never # cat /sys/kernel/mm/transparent_hugepage/defrag [always] madvise never
透明大頁關閉方法有兩種,一種是通過命令關閉,一種通過修改grub開機引導檔案關閉:
方法一
手動臨時關閉
echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag
引數說明
never 關閉,不使用透明記憶體 alway 儘量使用透明記憶體,掃描記憶體,有512個 4k頁面可以整合,就整合成一個2M的頁面 madvise 避免改變記憶體佔用
開機自動關閉
vim /etc/rc.d/rc.local if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi
授予執行許可權
chmod +x /etc/rc.d/rc.local
方法二
備份配置檔案
cp /etc/default/grub /etc/default/grub.date +%F.bak
備份grub配置檔案
cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.date +%F.bak
編輯/etc/default/grub 檔案,在GRUB_CMDLINE_LINUX 後面加上
transparent_hugepage=never
或者編輯/etc/sysconfig/grub,其實/etc/sysconfig/grub是/etc/default/grub的軟連結。但我遇到過不是軟連結的關係情況,這樣編輯/etc/sysconfig/grub是沒有使用者的;執行grub2-mkconfig不會把關閉THP的選項寫入到gurb.cfg。
#cat /etc/sysconfig/grub GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rd.lvm.lv=centos/usr rhgb quiet transparent_hugepage=never" GRUB_DISABLE_RECOVERY="true"
再使用 grub2-mkconfig 生成grub.cfg配置檔案。
# grub2-mkconfig -o /boot/grub2/grub.cfg
# init 6 -------->>>>重啟生效
重啟後效果
# cat /proc/cmdline BOOT_IMAGE=/vmlinuz-3.10.0-1127.el7.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rd.lvm.lv=rhel/usr rhgb quiet transparent_hugepage=never # cat /sys/kernel/mm/transparent_hugepage/enabled always madvise [never] ---->>>[never]表示成功禁用THP #cat /sys/kernel/mm/transparent_hugepage/defrag ------>>> 這個應該是記憶體碎片整理 [always] madvise never # grep Hug /proc/meminfo AnonHugePages: 0 kB ---------->>>返回值若是零,代表成功禁用THP HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
擴充套件內容
使用情況監控 可以檢視/sys/kernel/mm/transparent_hugepage/khugepaged下資訊
一個掃描週期被掃描的記憶體頁數 pages_to_scan (預設 4096 = 16MB)
多長時間掃描一次 scan_sleep_millisecs (預設 10000 = 10sec)
多長時間整理一次碎片
alloc_sleep_millisecs (預設 60000 = 60sec)
- 你會使用 Linux 編輯器 Vim 嗎?
- php實現圖書管理系統詳細介紹
- 面試官問:Redis 快取都有哪些異常,各自有哪些解決方案
- 面試被問到:關於php檔案包含你瞭解多少?
- 一張小圖看盡 Nginx
- php快速搭建swoole玩轉協程
- Laravel 使用Guzzle執行HTTP請求
- PHP中的異常處理機制
- 基於redis的分散式鎖詳解
- 如何通過查原始碼的方式解決程式設計中遇到的問題?
- PHP高併發商品秒殺問題的解決方案
- Thinkphp6專案基本操作(中介軟體處理登入流程)
- PHP實現非同步延遲訊息佇列(庫存歸還)
- php捕捉Warning、Notice錯誤
- 利用PHP的POST臨時檔案機制實現任意檔案上傳
- php Carbon 時間處理類 超詳細講解(一)
- 如何用 10 行 bash shell 指令碼監控 Linux?
- PDO方式連線資料庫、PHP連線資料庫
- php雪花演算法SnowFlake生成唯一ID
- 淺述 Docker 的容器編排