搜尋
首頁後端開發PHP7讓 PHP7 更快之 Hugepage 詳解

讓 PHP7 更快之 Hugepage 詳解

Jun 09, 2020 am 09:21 AM
phpphp7

讓 PHP7 更快之 Hugepage 詳解

PHP7剛剛發布了RC4, 包含一些bug修復和一個我們最新的性能提升成果(NEWS), 那就是"HugePageFy PHP TEXT segment", 透過啟用這個特性,PHP7會把自身的TEXT段(執行體)」挪「到Huagepage上,之前的測試,我們能穩定的在Wordpress上看到2%~3%的QPS提升。

關於Hugepage是啥,簡單的說下就是預設的記憶體是以4KB分頁的,而虛擬位址和記憶體位址是需要轉換的, 而這個轉換是要查表的,CPU為了加速這個查表過程都會內建TLB(Translation Lookaside Buffer),顯而易見如果虛擬頁越小,表裡的條目數也就越多,而TLB大小是有限的,條目數越多TLB的Cache Miss也就會越高,所以如果我們能啟用大內存頁就能間接降低這個TLB Cache Miss,至於詳細的介紹,Google一搜一大堆我就不贅述了,這裡主要說明下如何啟用這個新特性, 從而帶來明顯的性能提升。

新的Kernel啟用Hugepage已經變得非常容易了,以我的開發虛擬機為例(Ubuntu Server 14.04,Kernel 3.13.0-45), 如果我們查看記憶體資訊:

$ cat /proc/meminfo | grep Huge
AnonHugePages:    444416 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

可見一個Hugepage的size是2MB, 而目前並沒有啟用HugePages. 現在讓我們先編譯PHP RC4, 記得一定不要加: --disable-huge-code-pages (這個新特性是預設啟用的, 你加了這個就關了)

然後配置opcache, 從PHP5.5開始Opcache已經是預設啟用編譯的,但是是編譯動態函式庫的, 所以我們還是要在php.ini中設定載入下。

zend_extension=opcache.so

這個新特性是做在Opcache裡的,所以也要透過Opcache啟用這個特性(透過設定opcache.huge_code_pages=1), 具體的設定:

opcache.huge_code_pages=1

現在讓我們來設定OS, 分配一些Hugepages:

$ sudo sysctl vm.nr_hugepages=128
vm.nr_hugepages = 128

現在讓我們再次檢查記憶體資訊:

$ cat /proc/meminfo | grep Huge
AnonHugePages:    444416 kB
HugePages_Total:     128
HugePages_Free:      128
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

可以看到我們分配的128個Hugepages已經就緒了, 然後我們來啟動php-fpm:

$ /home/huixinchen/local/php7/sbin/php-fpm
[01-Oct-2015 09:33:27] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root
[01-Oct-2015 09:33:27] NOTICE: [pool www] 'group' directive is ignored when FPM is not running as root

現在, 再次檢查記憶體資訊:

$ cat /proc/meminfo | grep Huge
AnonHugePages:    411648 kB
HugePages_Total:     128
HugePages_Free:      113
HugePages_Rsvd:       27
HugePages_Surp:        0
Hugepagesize:       2048 kB

說到這裡,如果Hugepages可用, 其實Opcache也會用Hugepages來儲存opcodes緩存, 所以為了驗證opcache.huge_code_pages確實生效, 我們不妨關閉opcache.huge_code_pages, 然後再啟動一次後看內存資訊:

$ cat /proc/meminfo | grep Huge
AnonHugePages:    436224 kB
HugePages_Total:     128
HugePages_Free:      117
HugePages_Rsvd:       27
HugePages_Surp:        0
Hugepagesize:       2048 kB

可見開啟了huge_code_pages以後, fpm啟動後多用了4個pages, 現在我們檢查下php-fpm的text大小:

$ size /home/huixinchen/local/php7/sbin/php-fpm
   text        data         bss         dec         hex     filename
10114565      695200      131528     10941293      a6f36d     /home/huixinchen/local/php7/sbin/php-fpm

可見text段有10114565個位元組大小,總共需要佔用4.8個左右的2M的pages, 考慮到對齊以後(尾部不足2M Page部分不挪動), 申請4個pages, 正好和我們看到的相符。

說明配置成功! Enjoy 

但有言在先, 啟用此特性以後, 會造成一個問題就是你如果嘗試通過Perf report/anno 去profiling的時候, 會發現符號丟失(valgrind, gdb不受影響), 這個主要原因是Perf的設計採用監聽了mmap,然後記錄位址範圍, 做IP到符號的轉換, 但是目前HugeTLB只支援MAP_ANON, 所以導致Perf認為這部分位址沒有符號訊息,希望以後版本的Kernel可以修復這個限製吧..

推薦教學:《PHP7

以上是讓 PHP7 更快之 Hugepage 詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:laruence。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用