PHP7+Swoole开发超高性能后台程序--韩天峰@PHPCon2016
2020-02-27 328浏览
- 1.PHPCon 2016 PHP7+Swoole开发超高性能后台程序 @hantianfeng Rango- /
- 2.
- 3.• 车轮互联总架构师 • Swoole开源项目创始人 • PHP官方PECL扩展开发组成员 • 微博:@hantianfeng •Github:https://github.com/matyhtf
- 4.1. C10K, C100K,C1M 2. 1W+ QPS
- 5.C10k 1. 基于epoll实现异步IO处理 2. 选择nginx和swoole 3. 并发100万TCP连接不是难事
- 6.1W+ QPS 1. 单台服务器每日可处理超过10亿次动态请求 2. 类似淘宝秒杀系统、微信抢红包、刷朋友圈这样全民 级应用。如果PHP程序能达到1W+ QPS,只用几百台机 器就能支撑。
- 7.如何实现1W+ QPS 1. IO操作要足够快 或者 异步 常见的IO操作:Redis、MySQL、CURL、磁盘读写 2. CPU消耗足够少 应用服务器、PHP框架、PHP应用程序
- 8.同步阻塞模型 100 进程 10次操作 IO类型 耗时 单进程 100 进程 Redis 1ms 1000qps 100000qps 10000qps MySQL 5ms 200qps 20000qps 2000qps CURL 100ms 10qps 1000qps 100qps 磁盘IO 10ms 100qps 10000qps 1000qps
- 9.同步阻塞模型 1. 多开进程就能增加处理能力 2. 增加进程会带来额外的进程切换开销
- 10.CPU CPU消耗 耗时 单核 24核 kernel - - - php-fpm 2ms 500qps 12000qps PHP 10ms 100qps 2400qps PHP 20ms 50qps 1200qps + 30ms 33qps 800qps
- 11.C++ 1. 程序员学习时间+3年 2. 开发调试软件时间 x 3 3. QPS提升2倍 C++ 机器的时间可以用钱购买,人的时间无法用钱买
- 12.01 提升PHP程序性能
- 13.PHP7 CPU消耗 耗时 单核 24核 PHP 5ms 200qps 4800qps PHP 10ms 100qps 2400qps + 15ms 67qps 1600qps · 程序员不需要做任何事情,升级PHP7就立即提升1倍性能
- 14.Yaf/Phalcon CPU消耗 耗时 单核 24核 C 1ms 1000qps 24000qps
- 15.Swoole 1. 使用Swoole\Http\Server取代php-fpm将部分PHP对象常驻 内存,减少传统LAMP架构每次请求创建销毁对象的开销 2. Swoole\Http\Server使用纯C编写,网络通信引擎和协议解析 性能非常强悍。 3. Swoole最新版本可稳定运行在PHP7环境
- 16.PHP7+Swoole 软件 QPS Golang 166838.68 PHP7+Swoole 287104.12 Nginx-1.9.9 245058.70 ab -c 100 -n 1000000 -khttp://127.0.0.1:8080/
- 17.Zend
- 18.Zend php program.php 词法分析->生成Token 语法分析->生成OpCode 执行OpCode 创建HashTable,添加数据
- 19.Zend 1. APC/OpCache只能优化PHP代码编译生成 OpCode的 开销 2. OpCode执行构建内存中可用HashTable需要消耗CPU 资源 3. LAMP每次请求结束会释放掉HashTable,下一次请求 再次构建HashTable内存
- 20.Swoole 1. 大数组、对象、常量等常驻内存,节省大量重复创建销 毁的CPU消耗 2. PHP框架的环境路径计算、常量定义、初始化框架、类 载入、解析注释语法等操作仅启动时执行一次 3. 业务代码仅剩最干净的请求处理逻辑
- 21.PHP7 Swoole Yaf Phalcon Redis 快如闪电
- 22.02 PHP7+Swoole超高性 能程序开发实践
- 23.uhttp://chelun.com/url/D2M2qXu 3位检验码 + 自增ID(62进制) u swoole_http_server + redis 单机性能高达 5W+ QPS u 作为车轮互联商业广告的流量入口和出口 u 统计设备号、UID、IP、UV、PV、地理位置等信息,为运营 部门提供数据 u 统计逻辑基于Swoole Task功能实现,不影响核心逻辑
- 24.
- 25.MySQL-Proxy 1. 基于swoole_mysql实现,支持php-fpm长连接 2. 后端使用连接池可以有效减少MySQL服务器的连接数。 100台PHP机器 x 500进程 = 5W MySQL连接 100台PHP机器 x 500进程 = 共用4000 MySQL连接 3. 支持MySQL后端服务路由,php-fpm到MySQL-Proxy只需要 建立一个连接,即可向到多台MySQL服务器发送SQL 4. 近期会开源出来
- 26.MySQL-Proxy 1. 早期版本基于 MYSQLI_ASYNC、mysqli::reap_async_query、 swoole_mysqli_get_sock 2. 存在3个问题,1) connect连接是阻塞的,2) 结果较大可能会阻塞, 3) 缓存区设置较小,有大量read, poll 系统调用导致sys很高 3. 新的API swoole_mysql 自行解析MySQL二进制协议,阻塞时自动 让出,实现了真正的异步非阻塞。并且改为 64K 缓存区,大大减少 了系统调用次数。
- 27.MySQL (query ) u 3字节长度+ 1字节packet_id + 1字节cmd + n字节SQL语句 uhttp://blog.csdn.net/wind520/article/details/43964821
- 28.MySQL (ResuleSet)
- 29.MySQL API
- 30.
- 31.
- 32.
- 33.超高性能统计运算程序 1. 单机日均计算100亿条统计数据 2. 使用PHP Array 全内存 存储、计算数据。超大规模读写Redis会成为 瓶颈 3. 使用Worker/Task进程实现数据的Map-Reduce 4. 推荐使用PHP的SPL数据结构,性能很好 5. 中间数据可以使用MySQL内存表,汇总计算后删除数据 6. PHP的GC非靠谱,及时unset掉不用的数据,连续运行无内存泄漏
- 34.超高性能统计运算程序
- 35.Swoole 2.0 1. Swoole底层内置协程,不依赖PHP的Yield、Generator 2. 同步的代码,异步的IO 3. 告别callback hell,告别Go语言
- 36.Swoole 2.0 PHP 1. 由TSF团队研发完成,提交到Swoole开源项目 2. 2.0预计在7月份发布,新版TSF 2.0预计8月发布 开发者列表 • 司超 chalesi chalesi@tencent.com • 朱新宇 alvinzhu alvinzhu@tencent.com • 王广超 winterswang winterswang@tencent.com • 袁易之 markyuan markyuan@tencent.com • 杨锡坤 roketyyang roketyyang@tencent.com
- 37.THANK YOU - 2017 - Q&A