您好,登錄后才能下訂單哦!
PHP7增加了一些特性
性能提升:PHP7比PHP5.6性能提升了兩倍。 Improved performance: PHP 7 is up to twice as fast as PHP 5.6
全面一致的64位支持。 Consistent 64-bit support
以前的許多致命錯誤,改成拋出異常。Many fatal errors are now Exceptions
移除了一些老的不在支持的SAPI(服務器端應用編程端口)和擴展。Removal of old and unsupported SAPIs and extensions
新增了空接合操作符。The null coalescing operator (??)
新增加了結合比較運算符。Combined comparison Operator (<=>)
新增加了函數的返回類型聲明。Return Type Declarations
新增加了標量類型聲明。Scalar Type Declarations
新增加匿名類。Anonymous Classes
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 更快之 Hugepage 詳解的詳細內容,更多請關注億速云其它相關文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。