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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

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

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

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

SublimeText3漢化版
中文版,非常好用