升級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對比:
處理時長耗時從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
結果:
結論:
- 從只壓框架角度看,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
結果:
結論:
- 單純 Redis請求時,PHP7是 PHP5.3的 3倍以上;
- 包含 Mysql請求時,PHP7是 PHP5.3的 2倍以上;
2升級PHP7過程
灰度上線升級:部署PHP7新叢集,灰度解析到新叢集。
說明:根據使用者群體的分佈進行灰度解析,將一些使用者較少的省市解析到PHP7新環境,使用者主體依然解析到PHP5.*老環境,觀察一段時間後(1~2周)根據結果進行相應調整。如沒問題,便可大規模解析到PHP7環境。
舉例:如上圖所示為使用者群體分佈圖,可先將青海、甘肅、雲南等地使用者通過DNS地域解析到PHP7環境的叢集,方便隨時觀察和調整。如無問題可再將江蘇、江西、廣東、北京等地解析到PHP7叢集。
3升級後的效能對比
拿一個真實業務升級PHP7後的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一線技術雜談