歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 讓你的 PHP 7 更快之 Hugepage

讓你的 PHP 7 更快之 Hugepage

日期:2017/2/28 13:57:26   编辑:Linux教程

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), 如果我們查看內存信息:

  1. $ cat /proc/meminfo | grep Huge
  2. AnonHugePages: 444416 kB
  3. HugePages_Total: 0
  4. HugePages_Free: 0
  5. HugePages_Rsvd: 0
  6. HugePages_Surp: 0
  7. Hugepagesize: 2048 kB

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

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

  1. zend_extension=opcache.so

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

  1. opcache.huge_code_pages=1

現在讓我們配置OS, 分配一些Hugepages:

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

現在讓我們再次檢查內存信息:

  1. $ cat /proc/meminfo | grep Huge
  2. AnonHugePages: 444416 kB
  3. HugePages_Total: 128
  4. HugePages_Free: 128
  5. HugePages_Rsvd: 0
  6. HugePages_Surp: 0
  7. Hugepagesize: 2048 kB

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

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

現在, 再次檢查內存信息:

  1. $ cat /proc/meminfo | grep Huge
  2. AnonHugePages: 444416 kB
  3. HugePages_Total: 128
  4. HugePages_Free: 117
  5. HugePages_Rsvd: 27
  6. HugePages_Surp: 0
  7. Hugepagesize: 2048 kB

Bingo, 配置成功! Enjoy

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

最後: 咦? 你怎麼不發性能對比測試啊? 嘿嘿, 這個就留給你們自己來試試咯, 歡迎評論你們看到的變化

PHP 7革新與性能優化 http://www.linuxidc.com/Linux/2015-09/123136.htm

PHP 7 ,你值得擁有 http://www.linuxidc.com/Linux/2015-06/118847.htm

在 CentOS 7.x / Fedora 21 上面體驗 PHP 7.0 http://www.linuxidc.com/Linux/2015-05/117960.htm

CentOS 6.3 安裝LNMP (PHP 5.4,MyySQL5.6) http://www.linuxidc.com/Linux/2013-04/82069.htm

在部署LNMP的時候遇到Nginx啟動失敗的2個問題 http://www.linuxidc.com/Linux/2013-03/81120.htm

Ubuntu安裝Nginx php5-fpm MySQL(LNMP環境搭建) http://www.linuxidc.com/Linux/2012-10/72458.htm

《細說PHP》高清掃描PDF+光盤源碼+全套教學視頻 http://www.linuxidc.com/Linux/2014-03/97536.htm

CentOS 6中配置PHP的LNMP的開發環境 http://www.linuxidc.com/Linux/2013-12/93869.htm

PHP 的詳細介紹:請點這裡
PHP 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved