1. 程式人生 > >讓你的PHP7更快之Hugepage

讓你的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