1. 程式人生 > >升級PHP7帶來的變化

升級PHP7帶來的變化

PHP7

女主宣言

最近女主在QCon2017的會議上聽到一句話:“在決定做一件事情之前,先不要考慮它的困難有多難,要先想想收益明顯不明顯,如果明顯那就克服一切困難把它搞定”。多麼激勵人心有木有~ 在是否升級PHP7的問題上,花椒技術團隊和addops團隊也是進行了一番“苦戰”,最後終於在2016年11月完成升級。今天就為大家分享一篇PHP7的升級歷程,希望能夠幫助有同樣升級想法的GG們。

背景

在升級PHP7前花椒服務端的程式碼基本全部採用PHP 5.* 編寫。可是當遇到高併發的場景時,比如去年奧運期間的張繼科直播,瞬間百萬粉絲湧入直播間,伺服器負載爆表、PHP執行佇列堆積嚴重,CPU被吃光,短時間內只能靠擴容來抗住高併發。考慮到如果使用別的語言進行重構的話週期會比較長,跟不上產品快速迭代的速度。於是便考慮到升級PHP7,因為官方給出PHP7的效能是一次里程碑的變革。

在衡量了一下利弊後得出如下結論,發現收益還是大於困難的。

困難:

1.php7的小版本更新頻率高(2016年幾乎每個月都有一個升級),是否穩定有待考證。

2.新版本在高併發的線上環境、或者某些特殊場景下是否有bug,有待考證。

3.業務依賴的擴充套件元件繁多,如果版本不穩定,對RPM包的管理和維護工作會造成很多困難。

4.線上環境的大版本更新,難以做到快速無縫遷移,有一定的運維難度。

5.公司各各產品線無大規模PHP7的生產環境,名副其實的“第一個吃螃蟹的人”。

收益:

1.官方提示效能相比PHP5.*有很大提高,這樣就能更好的支援高併發場景。

2.效能提升後,從運維角度看可以節省很多伺服器資源從而降低成本。

3.對新技術熱情高漲,技術人員成就感爆棚。

1壓測報告

鳥哥(官方)測試:

鳥哥-惠新宸分享的PHP7效能報告,方便大家參考。

WordPress的QPS壓測:

在WordPress專案中,PHP7對比PHP5.6,QPS提升2.77倍!

Benchmark對比:

Benchmark對比

處理時長耗時從2.991下降到1.186,大幅度下降60%!

花椒技術團隊的基準測試

說明:直接輸出 “hello world”

KVM虛擬機器伺服器配置: cpu 4核、記憶體 8G

系統關鍵引數:net.ipv4.tcp_max_tw_buckets = 20000

結果:

基準測試

結論:

  • php5.3的系統資源佔用依舊比  php7高。但是處理的內容少的時候,差距不是非常大;
  • 併發上去之後,php7使用佔用率明顯減少,php5.3資源佔用率是php7的2倍;
  • 兩個版本php均出現了響應錯誤的情況(連線超時),網路出現瓶頸;
  • php7的tps高於php5.3 16%到22%

花椒技術團隊PHP7框架測試

說明:程式包含QFrame框架,輸出一段簡單的json

KVM虛擬機器伺服器配置: cpu 4核、記憶體 8G

系統關鍵引數:net.ipv4.tcp_max_tw_buckets = 20000

結果:

PHP7框架測試

結論:

  • 從只壓框架角度看,PHP5.3依舊佔用非常多的系統資源,idel依舊為0;
  • PHP7在1000併發下,系統即將到達瓶頸。但此時依舊可以正常處理絕大部分請求;
  • PHP7的tps最少是5.3的5倍;

花椒技術團隊PHP7資源請求測試

說明:包含一次、兩次、三次redis請求,一次redis、一次 mysql,兩次redis、一次mysql等測試場景

物理機伺服器配置: cpu 24核、記憶體 64G

系統關鍵引數:net.ipv4.tcp_max_tw_buckets = 20000

結果:

PHP7資源請求測試

結論:

  • 單純 Redis請求時,PHP7是   PHP5.3的 3倍以上;
  • 包含 Mysql請求時,PHP7是   PHP5.3的 2倍以上;

2升級PHP7過程

灰度上線升級:部署PHP7新叢集,灰度解析到新叢集。

說明:根據使用者群體的分佈進行灰度解析,將一些使用者較少的省市解析到PHP7新環境,使用者主體依然解析到PHP5.*老環境,觀察一段時間後(1~2周)根據結果進行相應調整。如沒問題,便可大規模解析到PHP7環境。

升級PHP7過程

舉例:如上圖所示為使用者群體分佈圖,可先將青海、甘肅、雲南等地使用者通過DNS地域解析到PHP7環境的叢集,方便隨時觀察和調整。如無問題可再將江蘇、江西、廣東、北京等地解析到PHP7叢集。

3升級後的效能對比

拿一個真實業務升級PHP7後的CPU效能變化圖作為參考:

CPU效能變化

結果:

在4.6號完成升級後,CPU的資源使用有將近30%的提升,符合測試結果預期。如果按照1萬RMB一臺伺服器計算,10臺機器的叢集能節省3萬RMB,100臺機器的叢集能節省30萬RMB。10000臺就是3000萬啊!

4運維細節

RPM包版本:addops-php-7.0.10-1.el6.x86_64 (addops自己封裝的RPM)

編譯引數:

Build Date => Oct 27 2016 17:25:53

–prefix=/usr/local/php

–sharedstatedir=/data/php
–localstatedir=/data/php
–enable-fpm
–enable-phpdbg
–enable-phpdbg-webhelper
–enable-phpdbg-debug
–disable-debug
–with-layout=GNU
–with-config-file-path=/usr/local/php/etc
–with-config-file-scan-dir=/usr/local/php/etc/php.d
–disable-ipv6
–enable-dtrace
–enable-libxml
–with-openssl=shared,/usr/local/openssl
–with-pcre-regex
–with-sqlite3
–with-zlib
–enable-bcmath
–with-bz2
–enable-calendar
–enable-ctype
–with-curl=shared,/usr/local/curl
–enable-dom
–with-enchant
–enable-exif
–enable-fileinfo
–enable-filter
–enable-ftp
–with-gd
–with-webp-dir=/usr/local/libwebp
–with-jpeg-dir
–with-png-dir
–with-zlib-dir
–with-xpm-dir=/usr/local/
–with-freetype-dir
–enable-gd-native-ttf
–with-gettext
–with-gmp
–with-mhash
–enable-hash
–with-iconv
–enable-json
–enable-mbstring
–with-mcrypt
–with-mysqli=mysqlnd
–enable-opcache
–enable-opcache-file
–enable-huge-code-pages
–enable-pcntl
–enable-pdo
–with-pdo-mysql=mysqlnd
–with-pdo-pgsql
–without-pdo-sqlite
–with-pgsql
–enable-phar
–enable-posix
–with-readline
–with-recode
–enable-session
–enable-shmop
–enable-simplexml
–enable-soap
–enable-sockets
–enable-sysvmsg
–enable-sysvsem
–enable-sysvshm
–with-tidy
–enable-tokenizer
–enable-xml
–enable-xmlreader
–with-xmlrpc
–enable-xmlwriter
–with-xsl
–enable-zip
–enable-mysqlnd
–enable-mysqlnd-compression-support
–with-pear

使用者通過HULK平臺的puppet叢集管理對RPM和配置檔案進行統一管控,可以搜尋一下平臺支援的php7擴充套件:

然後編輯配置檔案進行同步:

秒級完成叢集軟體包的安裝和同步,使用者完全自助部署PHP7新叢集。需要注意配置檔案的引數要和老叢集的保持一致,不然兩個環境配置不一樣就給自己挖坑了。

通過HULK平臺,業務人員可以自助的完成線上環境的部署,將之前複雜的運維交付以分鐘級單位完成。這也為花椒直播在2016年的很多大活動打下了夯實的基礎。

總結

在面對新技術時先衡量一下給團隊的收益,收益明顯的話再去做。關於持續整合和持續交付(CI/CD)也是HULK未來重點努力的方向,有啥好的實踐和落地方案的小夥伴歡迎留言交流~

文章來自微信公眾號:HULK一線技術雜談