亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

使用Huagepage和PGO來提升PHP7的執行性能

2024-09-04 11:43:31
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了使用Huagepage和PGO來提升PHP7的執行性能的相關方案,來自于注明的PHP開發組成員Laruence的相關研究,需要的朋友可以參考下

Hugepage

PHP7剛剛發布了RC4, 包含一些bug修復和一個我們最新的性能提升成果, 那就是”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

  1. AnonHugePages:  444416 kB 
  2. HugePages_Total:   128 
  3. HugePages_Free:   128 
  4. HugePages_Rsvd:    0 
  5. HugePages_Surp:    0 
  6. Hugepagesize:    2048 kB 

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

$ /home/huixinchen/local/php7/sbin/php-fpm

  1. [01-Oct-2015 09:33:27] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root 
  2. [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

  1. AnonHugePages:  411648 kB 
  2. HugePages_Total:   128 
  3. HugePages_Free:   113 
  4. HugePages_Rsvd:    27 
  5. HugePages_Surp:    0 
  6. Hugepagesize:    2048 kB 

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

$ cat /proc/meminfo | grep Huge

  1. AnonHugePages:  436224 kB 
  2. HugePages_Total:   128 
  3. HugePages_Free:   117 
  4. HugePages_Rsvd:    27 
  5. HugePages_Surp:    0 
  6. 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可以修復這個限制吧..

GCC PGO

PGO正如名字所說(Profile Guided Optimization 有興趣的可以Google), 他需要用一些用例來獲得反饋, 也就是說這個優化是需要和一個特定的場景綁定的.

你對一個場景的優化, 也許在另外一個場景就事與愿違了. 它不是一個通用的優化. 所以我們不能簡單的就包含這些優化, 也無法直接發布PGO編譯后的PHP7.

當然, 我們正在嘗試從PGO找出一些共性的優化, 然后手工Apply到PHP7上去, 但這個很明顯不能做到針對一個場景的特別優化所能達到的效果, 所以我決定寫這篇文章簡單介紹下怎么使用PGO來編譯PHP7, 讓你編譯的PHP7能特別的讓你自己的獨立的應用變得更快.

首先, 要決定的就是拿什么場景去Feedback GCC, 我們一般都會選擇: 在你要優化的場景中: 訪問量最大的, 耗時最多的, 資源消耗最重的一個頁面.

拿Wordpress為例, 我們選擇Wordpress的首頁(因為首頁往往是訪問量最大的).

我們以我的機器為例:

Intel(R) Xeon(R) CPU           X5687  @ 3.60GHz X 16(超線程),

48G Memory

php-fpm 采用固定32個worker, opcache采用默認的配置(一定要記得加載opcache)

以wordpress 4.1為優化場景..

首先我們來測試下目前WP在PHP7的性能(ab -n 10000 -c 100):

$ ab -n 10000 -c 100 http://inf-dev-maybach.weibo.com:8000/wordpress/

  1. This is ApacheBench, Version 2.3 <$Revision: 655654 $> 
  2. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 
  3. Licensed to The Apache Software Foundation, http://www.apache.org/ 
  4.    
  5. Benchmarking inf-dev-maybach.weibo.com (be patient) 
  6. Completed 1000 requests 
  7. Completed 2000 requests 
  8. Completed 3000 requests 
  9. Completed 4000 requests 
  10. Completed 5000 requests 
  11. Completed 6000 requests 
  12. Completed 7000 requests 
  13. Completed 8000 requests 
  14. Completed 9000 requests 
  15. Completed 10000 requests 
  16. Finished 10000 requests 
  17.    
  18. Server Software:    nginx/1.7.12 
  19. Server Hostname:    inf-dev-maybach.weibo.com 
  20. Server Port:      8000 
  21.    
  22. Document Path:     /wordpress/ 
  23. Document Length:    9048 bytes 
  24.    
  25. Concurrency Level:   100 
  26. Time taken for tests:  8.957 seconds 
  27. Complete requests:   10000 
  28. Failed requests:    0 
  29. Write errors:      0 
  30. Total transferred:   92860000 bytes 
  31. HTML transferred:    90480000 bytes 
  32. Requests per second:  1116.48 [#/sec] (mean) 
  33. Time per request:    89.567 [ms] (mean) 
  34. Time per request:    0.896 [ms] (mean, across all concurrent requests) 
  35. Transfer rate:     10124.65 [Kbytes/sec] received 

可見Wordpress 4.1 目前在這個機器上, 首頁的QPS可以到1116.48. 也就是每秒鐘可以處理這么多個對首頁的請求,現在, 讓我們開始教GCC, 讓他編譯出跑Wordpress4.1更快的PHP7來, 首先要求GCC 4.0以上的版本, 不過我建議大家使用GCC-4.8以上的版本(現在都GCC-5.1了).

第一步, 自然是下載PHP7的源代碼了, 然后做./configure. 這些都沒什么區別

接下來就是有區別的地方了, 我們要首先第一遍編譯PHP7, 讓它生成會產生profile數據的可執行文件:

$ make prof-gen

注意, 我們用到了prof-gen參數(這個是PHP7的Makefile特有的, 不要嘗試在其他項目上也這么搞哈 :) )

然后, 讓我們開始訓練GCC:

$ sapi/cgi/php-cgi -T 100 /home/huixinchen/local/www/htdocs/wordpress/index.php >/dev/null

也就是讓php-cgi跑100遍wordpress的首頁, 從而生成一些在這個過程中的profile信息.

然后, 我們開始第二次編譯PHP7.

$ make prof-clean

$ make prof-use && make install

好的, 就這么簡單, PGO編譯完成了, 現在我們看看PGO編譯以后的PHP7的性能:

$ ab -n10000 -c 100 http://inf-dev-maybach.weibo.com:8000/wordpress/

  1. This is ApacheBench, Version 2.3 <$Revision: 655654 $> 
  2. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 
  3. Licensed to The Apache Software Foundation, http://www.apache.org/ 
  4.    
  5. Benchmarking inf-dev-maybach.weibo.com (be patient) 
  6. Completed 1000 requests 
  7. Completed 2000 requests 
  8. Completed 3000 requests 
  9. Completed 4000 requests 
  10. Completed 5000 requests 
  11. Completed 6000 requests 
  12. Completed 7000 requests 
  13. Completed 8000 requests 
  14. Completed 9000 requests 
  15. Completed 10000 requests 
  16. Finished 10000 requests 
  17.    
  18. Server Software:    nginx/1.7.12 
  19. Server Hostname:    inf-dev-maybach.weibo.com 
  20. Server Port:      8000 
  21.    
  22. Document Path:     /wordpress/ 
  23. Document Length:    9048 bytes 
  24.    
  25. Concurrency Level:   100 
  26. Time taken for tests:  8.391 seconds 
  27. Complete requests:   10000 
  28. Failed requests:    0 
  29. Write errors:      0 
  30. Total transferred:   92860000 bytes 
  31. HTML transferred:    90480000 bytes 
  32. Requests per second:  1191.78 [#/sec] (mean) 
  33. Time per request:    83.908 [ms] (mean) 
  34. Time per request:    0.839 [ms] (mean, across all concurrent requests) 
  35. Transfer rate:     10807.45 [Kbytes/sec] received 

現在每秒鐘可以處理1191.78個QPS了, 提升是~7%. 還不賴哈(咦, 你不是說10%么? 怎么成7%了? 呵呵, 正如我之前說過, 我們嘗試分析PGO都做了些什么優化, 然后把一些通用的優化手工Apply到PHP7中. 所以也就是說, 那~3%的比較通用的優化已經包含到了PHP7里面了, 當然這個工作還在繼續).

于是就這么簡單, 大家可以用自己的產品的經典場景來訓練GCC, 簡單幾步, 獲得提升, 何樂而不為呢

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品一区中文| 亚洲精品www久久久久久广东| 日韩精品免费综合视频在线播放| 成人激情视频小说免费下载| 日韩免费视频在线观看| 久久视频免费在线播放| 欧美日韩国产一区二区| 国产欧美欧洲在线观看| 91国产美女在线观看| 亚洲天堂av在线免费观看| 日韩成人在线视频观看| 成人黄色激情网| 精品网站999www| 国产亚洲福利一区| 国产精品入口日韩视频大尺度| 欧美巨猛xxxx猛交黑人97人| 九九热r在线视频精品| 国内精品久久久久久久久| 欧美性猛交xxxx黑人| 亚洲精品国偷自产在线99热| 久热在线中文字幕色999舞| 亚洲精品99久久久久中文字幕| 日韩欧美高清在线视频| 亚洲国产精品一区二区久| 亚洲欧美国产日韩天堂区| 亚洲免费视频观看| 亚洲欧美一区二区三区久久| 欧美极品少妇xxxxⅹ免费视频| 成人久久久久久| 国产91在线高潮白浆在线观看| 538国产精品一区二区免费视频| 亚洲精品国产精品国自产观看浪潮| 91久久久久久久| 国产精品91免费在线| 亚洲激情电影中文字幕| 啪一啪鲁一鲁2019在线视频| 高清日韩电视剧大全免费播放在线观看| 欧美激情videoshd| 97精品伊人久久久大香线蕉| 国产精品福利在线观看| 国产精品美女www| 日韩欧美中文免费| 久久中国妇女中文字幕| 欧美高清理论片| 欧美夫妻性生活视频| 午夜欧美大片免费观看| 91日本在线视频| 国产精品mp4| 久久久久久久久久亚洲| 麻豆成人在线看| 九九精品在线观看| 久久久久久久久久国产精品| 92版电视剧仙鹤神针在线观看| 色av中文字幕一区| 欧美日韩精品在线视频| 亚洲国产精品99| 国产精品一区二区女厕厕| 国产精品人成电影在线观看| 亚洲国产欧美一区| 欧美一级淫片丝袜脚交| 欧美激情免费视频| 国产成人欧美在线观看| 亚洲free性xxxx护士hd| 色樱桃影院亚洲精品影院| 91精品国产综合久久香蕉922| 日韩美女在线看| 久久成人亚洲精品| 欧美一区二区三区精品电影| 亚洲性夜色噜噜噜7777| 国产精品a久久久久久| 亚洲第一黄色网| 日韩电影中文字幕一区| 国产精品视频不卡| 欧美日韩国产限制| 亚洲a中文字幕| 97不卡在线视频| 琪琪亚洲精品午夜在线| 国产在线精品自拍| 欧美最近摘花xxxx摘花| 欧美极品美女视频网站在线观看免费| 亚洲国产欧美一区二区三区同亚洲| 国产69精品久久久久9| 国产亚洲成精品久久| 亚洲精品99久久久久中文字幕| 国产亚洲视频在线观看| 精品国产福利视频| 91黑丝在线观看| 国产日韩欧美综合| 国产欧美精品在线播放| 成人黄色av免费在线观看| 日韩在线不卡视频| 亚洲精品在线观看www| 国产欧美一区二区| 性欧美xxxx视频在线观看| 色噜噜久久综合伊人一本| 欧美大片在线免费观看| 2018国产精品视频| 最近2019年日本中文免费字幕| 久久久久久亚洲精品中文字幕| 亚洲3p在线观看| 久久免费观看视频| 深夜精品寂寞黄网站在线观看| 日韩在线播放一区| 国产91色在线|免| 日韩亚洲精品电影| 97香蕉超级碰碰久久免费软件| 夜夜嗨av一区二区三区四区| 亚洲自拍偷拍第一页| 久久的精品视频| 日韩成人激情在线| 久久精品国亚洲| 亚洲日本中文字幕免费在线不卡| 亚洲97在线观看| 久久久国产精品x99av| 国产人妖伪娘一区91| 亚洲人线精品午夜| 亚洲国产天堂网精品网站| 精品国产91久久久| 欧美中文在线视频| 国产精品伦子伦免费视频| 日韩av影视综合网| 国产成人鲁鲁免费视频a| 国产欧美一区二区三区视频| 日韩中文字幕欧美| 韩日欧美一区二区| 日av在线播放中文不卡| 国产精品久久久久久av福利软件| 欧美色xxxx| 亚洲福利在线视频| 国产精品jvid在线观看蜜臀| 国产亚洲aⅴaaaaaa毛片| 爽爽爽爽爽爽爽成人免费观看| 午夜精品久久久99热福利| 在线观看视频亚洲| 18一19gay欧美视频网站| 欧美日本亚洲视频| 成人伊人精品色xxxx视频| 日韩av在线网站| 91香蕉电影院| 国产一区二区三区网站| 国产又爽又黄的激情精品视频| 久久精品电影网| 68精品国产免费久久久久久婷婷| 亚洲黄页视频免费观看| 国产精品久久久久久久久久久久久久| 午夜精品99久久免费| 高清欧美一区二区三区| 亚洲精品国产精品国产自| 国产精品私拍pans大尺度在线| 亚洲高清免费观看高清完整版| 国产精品成人观看视频国产奇米| 午夜精品久久久99热福利| 欧美性猛交xxxx久久久| 精品一区二区三区电影| 国产精品亚洲欧美导航| 丝袜情趣国产精品| 91免费国产视频| 亚洲aa中文字幕| 国产精品综合网站| 乱亲女秽乱长久久久| 亚洲成人教育av| 黑人狂躁日本妞一区二区三区| 在线色欧美三级视频| 亚洲国产女人aaa毛片在线|