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

首頁 > 開發 > PHP > 正文

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

2024-05-04 23:40:41
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了使用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 kBHugePages_Total:    0HugePages_Free:    0HugePages_Rsvd:    0HugePages_Surp:    0Hugepagesize:    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=128vm.nr_hugepages = 128

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

$ cat /proc/meminfo | grep Huge
AnonHugePages:  444416 kBHugePages_Total:   128HugePages_Free:   128HugePages_Rsvd:    0HugePages_Surp:    0Hugepagesize:    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 kBHugePages_Total:   128HugePages_Free:   113HugePages_Rsvd:    27HugePages_Surp:    0Hugepagesize:    2048 kB

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

$ cat /proc/meminfo | grep Huge
AnonHugePages:  436224 kBHugePages_Total:   128HugePages_Free:   117HugePages_Rsvd:    27HugePages_Surp:    0Hugepagesize:    2048 kB

可見開啟了huge_code_pages以后, fpm啟動后多用了4個pages, 現在我們檢查下php-fpm的text大?。?/p>

$ size /home/huixinchen/local/php7/sbin/php-fpm
  text    data     bss     dec     hex   filename10114565   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/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking inf-dev-maybach.weibo.com (be patient)Completed 1000 requestsCompleted 2000 requestsCompleted 3000 requestsCompleted 4000 requestsCompleted 5000 requestsCompleted 6000 requestsCompleted 7000 requestsCompleted 8000 requestsCompleted 9000 requestsCompleted 10000 requestsFinished 10000 requests Server Software:    nginx/1.7.12Server Hostname:    inf-dev-maybach.weibo.comServer Port:      8000 Document Path:     /wordpress/Document Length:    9048 bytes Concurrency Level:   100Time taken for tests:  8.957 secondsComplete requests:   10000Failed requests:    0Write errors:      0Total transferred:   92860000 bytesHTML transferred:    90480000 bytesRequests per second:  1116.48 [#/sec] (mean)Time per request:    89.567 [ms] (mean)Time per request:    0.896 [ms] (mean, across all concurrent requests)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/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking inf-dev-maybach.weibo.com (be patient)Completed 1000 requestsCompleted 2000 requestsCompleted 3000 requestsCompleted 4000 requestsCompleted 5000 requestsCompleted 6000 requestsCompleted 7000 requestsCompleted 8000 requestsCompleted 9000 requestsCompleted 10000 requestsFinished 10000 requests Server Software:    nginx/1.7.12Server Hostname:    inf-dev-maybach.weibo.comServer Port:      8000 Document Path:     /wordpress/Document Length:    9048 bytes Concurrency Level:   100Time taken for tests:  8.391 secondsComplete requests:   10000Failed requests:    0Write errors:      0Total transferred:   92860000 bytesHTML transferred:    90480000 bytesRequests per second:  1191.78 [#/sec] (mean)Time per request:    83.908 [ms] (mean)Time per request:    0.839 [ms] (mean, across all concurrent requests)Transfer rate:     10807.45 [Kbytes/sec] received

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

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



注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜精品一区二区三区视频免费看| 久久久久久高潮国产精品视| 91精品国产91久久久久久最新| 日日骚久久av| 久久久久久国产精品三级玉女聊斋| 亚洲人成电影网站| 久久不射热爱视频精品| 免费97视频在线精品国自产拍| 亚洲国产精品久久久久久| 亚洲欧洲黄色网| 91免费国产网站| 亚洲香蕉成人av网站在线观看| 欧美怡红院视频一区二区三区| 日韩专区在线播放| 中文字幕日本精品| 高跟丝袜欧美一区| 欧美在线观看www| 最近2019年中文视频免费在线观看| 欧美成人免费网| 日韩av在线免费播放| www.日韩系列| 国产精品爱久久久久久久| 国产精品高清免费在线观看| 日韩中文字幕国产精品| 久久久精品影院| 国产精品欧美亚洲777777| 亚洲综合在线小说| 久久久噜噜噜久久| 中文字幕日韩精品有码视频| 亚洲国产高清福利视频| 国产www精品| 国产亚洲精品va在线观看| 欧美日韩综合视频网址| 亚洲欧美日韩第一区| 亚洲天堂精品在线| 欧美一级淫片aaaaaaa视频| 日韩欧美在线视频观看| 亚洲最大成人网色| 欧美极品在线播放| 亚洲综合色av| 亚洲一区免费网站| 久久精品一偷一偷国产| 性欧美办公室18xxxxhd| 色偷偷9999www| 91福利视频在线观看| 欧美一级在线亚洲天堂| 色综合久久久888| 色婷婷亚洲mv天堂mv在影片| 国产精品美女久久| 亚洲免费成人av电影| 91国内揄拍国内精品对白| 国产精品久久久久久婷婷天堂| 久久久视频精品| 成人免费视频xnxx.com| 一夜七次郎国产精品亚洲| 91社影院在线观看| 久久精品亚洲热| 黄网站色欧美视频| 亚洲美女动态图120秒| 久久亚洲综合国产精品99麻豆精品福利| 秋霞午夜一区二区| 亚洲福利影片在线| 国产一区二区三区在线观看视频| 中文字幕精品—区二区| 尤物九九久久国产精品的分类| 国产日本欧美视频| 日韩亚洲欧美成人| 亚洲精品中文字幕av| 亚洲欧美在线免费观看| 中文字幕国内精品| 欧美日韩999| 亚洲精品视频在线播放| 国产精品扒开腿做爽爽爽男男| 国产成人精品一区| 欧美在线激情视频| 羞羞色国产精品| 欧美一区二粉嫩精品国产一线天| 大胆人体色综合| 久久6免费高清热精品| 久久精品欧美视频| 日韩在线观看免费| 97人人爽人人喊人人模波多| 亚洲欧美激情另类校园| 美女撒尿一区二区三区| 日本亚洲欧洲色α| 亚洲第一中文字幕在线观看| 欧美成人亚洲成人日韩成人| 国产精品入口免费视| 欧美成人精品h版在线观看| 日日狠狠久久偷偷四色综合免费| 久久精品99无色码中文字幕| 91精品国产综合久久男男| 日韩av中文在线| 疯狂欧美牲乱大交777| 毛片精品免费在线观看| 亚洲一区二区在线播放| 97久久精品人人澡人人爽缅北| 亚洲欧美中文字幕在线一区| 国产精品aaaa| 成人美女av在线直播| 黄色成人av网| 国产精品视频白浆免费视频| 成人免费网视频| 亚洲精品资源美女情侣酒店| 国产精品美女无圣光视频| 久久精品夜夜夜夜夜久久| 青青草国产精品一区二区| 韩国日本不卡在线| 亚洲乱码国产乱码精品精天堂| 欧美国产日韩xxxxx| 91色琪琪电影亚洲精品久久| 久久人体大胆视频| 欧美激情乱人伦一区| 久青草国产97香蕉在线视频| 欧美理论电影在线观看| 欧美日韩国产综合新一区| 欧美精品久久久久久久久| 日本精品视频在线观看| 国产亚洲欧美日韩精品| 亚洲v日韩v综合v精品v| 欧美午夜美女看片| 久久伊人91精品综合网站| 日韩亚洲一区二区| 亚洲精品国产电影| 欧美日韩另类在线| 色视频www在线播放国产成人| 日韩av在线导航| 亚洲综合精品伊人久久| 欧美日韩中国免费专区在线看| 亚洲精品久久久一区二区三区| 国产日韩中文字幕在线| 高清在线视频日韩欧美| 日韩欧美在线视频日韩欧美在线视频| 中文字幕精品一区久久久久| 欧美最猛性xxxxx(亚洲精品)| 午夜精品福利视频| 久久久久久久91| 在线日韩中文字幕| 国产精品国模在线| 色爱av美腿丝袜综合粉嫩av| 国产精品久久久久久久久| 欧美精品videosex牲欧美| 粉嫩av一区二区三区免费野| 国产精品av免费在线观看| 久久影院中文字幕| 91国内免费在线视频| 亚洲第一精品自拍| 日韩欧美在线视频| 日韩精品免费观看| 久久6精品影院| 欧美午夜片在线免费观看| 色偷偷av一区二区三区| 亚洲国产私拍精品国模在线观看| 亚洲理论在线a中文字幕| 国产丝袜精品第一页| 国产精品老女人视频| 久久久亚洲国产| 国产极品jizzhd欧美| 亚洲电影免费观看高清| 国产精品一区二区久久国产| 国产精品久久久久久久久久久新郎| 欧美超级免费视 在线| 欧美天堂在线观看| 亚洲天堂一区二区三区|