升级PHP7带来的变化

addops&花椒技术 360云计算

女主宣言

最近女主在QCon2017的会议上听到一句话:“在决定做一件事情之前,先不要考虑它的困难有多难,要先想想收益明显不明显,如果明显那就克服一切困难把它搞定”。多么激励人心有木有~ 在是否升级PHP7的问题上,花椒技术团队和addops团队也是进行了一番“苦战”,最后终于在2016年11月完成升级。今天就为大家分享一篇PHP7的升级历程,希望能够帮助有同样升级想法的GG们。 PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

背景

在升级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未来重点努力的方向,有啥好的实践和落地方案的小伙伴欢迎留言交流~