记laravel5.5项目php-fpm迁移到swoole4.2.9
事起说明
最近对上线半年多的laravel项目做了一次少大的改动,由php-fpm改为swoole,这里做个记录。
2019年过年前半个月,上阿里云后台查看前一天的访问请求日志,发现很多接口响应慢。翻了前几天的日志,发现不少响应慢的接口,包括app首页资讯、文章列表、文章详情等所有和cms相关的接口。想着最近没上线过什么新功能,怎么最近变慢好多。阿里云后台查看nginx错误日志,上服务器看php-fpm错误日志。发现和上次php-fpm优化报的同样错误信息。时间点差不多都吻合,大都是push发出后的那几分钟。用户大都在开盘那会打开咱们公司的APP了,虽然公司这款app不做期货交易,黄金交易,但接口响应这么慢,严重影响用户体验!(下图是阿里云后台看到的日志信息)因为临近过年不想有大改动,向公司临时申请加一台服务器,配置好调试上生产负载均衡。
过完年后,刚开工,需求不多。想着要优化系统,自己ab压测一下测试环境的接口,接口tps110多,有点低。参考网上的laravel框架优化资料(https://learnku.com/articles/5088/optimize-laravel-site-to-open-speed),照着改了tps上升到120左右,没起到什么起作用。
在公司技术群里咨询下,有人建议用swoole+laravel,网上说做得好性能可以十倍以上的提升。又上github搜索swoole+laravel,选用别人已经集成好的,最后选用laravels(https://segmentfault.com/a/1190000013358289?utm_source=tag-newest)。
开发机安装swoole扩展,composer拉取laravels包(折腾好会,这里就不表述了)。
原来http请求到达web服务器,服务器nginx将请求转发给php-fpm,让php-fpm管理进程对php程序读取解析并返回。使用 swoole会接管php-fpm要做这部分事情。
nginx配置更改如下(nginx监听接收88端口的请求并转发本机5200端口,如果是php-fpm,默认本机9000端口接收):
gzip on;
gzip_min_length ;
gzip_comp_level ;#返回结果的压缩比,数值越高压缩的越小但更消耗CPU,但不一定有更高的压缩率╥﹏╥
gzip_disable "msie6";
upstream laravels {
# 通过 IP:Port 连接
# 通config/laravels.php中listen_ip listen_port保持一致
server 127.0.0.1:5200 weight= max_fails= fail_timeout=30s;
keepalive ;
} server {
listen ;
server_name test-cms.xxxx.com;
root /alidata/www/test-cms.xxx.com/public;
access_log /alidata/logs/nginx/test-cms.xxx.com.log;
error_log /alidata/logs/nginx/test-cms.xxx.com-error.log;
charset utf-;
location / {
try_files $uri @laravels;
}
location @laravels {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header Server-Protocol $server_protocol;
proxy_set_header Server-Name $server_name;
proxy_set_header Server-Addr $server_addr;
proxy_set_header Server-Port $server_port;
proxy_pass http://laravels;
}
}
在修改config/laravels.php中配置:
'listen_ip' => env('LARAVELS_LISTEN_IP', '127.0.0.1'),
'listen_port' => env('LARAVELS_LISTEN_PORT', 9527),
运行和排查
php bin/laravels {start|stop|restart|reload|info|help}
再根据laravels命令:
命令 | 说明 |
start | 启动LaravelS,展示已启动的进程列表 "ps -ef|grep laravels"。支持选项 "-d|--daemonize" 以守护进程的方式运行,此选项将覆盖laravels.php 中swoole.daemonize 设置;支持选项 "-e|--env" 用来指定运行的环境,如--env=testing 将会优先使用配置文件.env.testing ,这个特性要求Laravel 5.2+ |
stop | 停止LaravelS |
restart | 重启LaravelS,支持选项 "-d|--daemonize" 和 "-e|--env" |
reload | 平滑重启所有Task/Worker进程,这些进程内包含了你的业务代码,不会重启Master/Manger/Timer/Custom进程 |
info | 显示组件的版本信息 |
help | 显示帮助信息 |
如下:
再用上压测机用apache jmeter试了下,50的并发压测半分钟,结果显示性能提升很大哦^_^:
再上100的并发压测:
没什么提升,再看系统负载不高啊,为啥tps上不去?
在排查此问题时,在接口加了时间间隔打印。
期间一直没找出问题出在哪,截图压测的几个接口都是从redis获取数据,不会读取mysql的。
网上有人说可能是swoole的redis链接未释放导致的。
可问题是我这里虽然redis链接句柄用的是class静态变量保存,但是redis是短连接,代码的变量不应该在请求结束就释放了吗?
如果是用redis长链接可能导致异常,但像我这正常不会有redis链接未释放的问题啊,查看swoole和laravel错误日志也未找到redis的报错信息。
第二天,忽然想到一位前同事,swoole用的很溜的,请教他后,让我把config/laravels.php的两个参数设置大一些。原来是系统内核数乘2,现在改成系统内核数乘12
继续压测100的线程数:
tps上到1200了非常激动
在该同事想看看更高性能意见后,改成200线程数,400线程数,tps越来越大,系统负载也越来越高,接近极限,最后达到2200。
期间发生一个小插曲,200线程组改成400线程组后,发现tps竟然达到7000多,真是把我两乐坏了,后来看下没有重启swoole服务,接口直接报错。。。
所以在此提醒下,任何更改php代码的行为,都需要重启swoole服务才能生效!!!
夜深了,明天要上班就不写了。
未完待续,下篇接着更!!
记laravel5.5项目php-fpm迁移到swoole4.2.9的更多相关文章
- [置顶] 将项目从tomcat 迁移到JBoss
注:针对的是jboss5.0,其它版本没有测试过 ,主要参考了:http://www.diybl.com/course/3_program/java/javajs/20100719/460908.ht ...
- 将Java项目从maven迁移到gradle
将Java项目从maven迁移到gradle 如何将一个java项目从maven迁移到gradle呢?gradle集成了一个很方便的插件:Build Init Plugin,使用这个插件可以很方便地创 ...
- 将项目从tomcat 迁移到JBoss5.0
http://java-boy.iteye.com/blog/531411从Tomcat升级到JBoss5.1真是一个痛苦的过程,可能遇到很多问题.以下是我碰到的问题,及解决方法. 一.Hiberna ...
- Runner之记计帐项目的典型用户和用户场景
项目任务:编写日历选择界面和查明细界面(查看某一天的具体收支出状况) 1.背景 ①典型用户 (1)姓名:张云 (2)年龄:17~23 (3)收入:家长给的生活费与自己兼职(1500元/月) (4)代表 ...
- 将公司的主要项目从eclipse迁移到android studio for mac环境(1)
上星期,我决定要解决这个问题.理由如下: 3个月之前,我已经投入一段时间要做好这个迁移工作,直到最后,我发现能够安装了,但是运行不了,这个过程也看不到bugly上传,在找不到原因的情况下,我放弃了. ...
- ASP.NET项目从VS2008迁移至VS2010或2012编译不过的问题
这次将一个VS2008编写的网站迁移至VS2010或者2012下都编译不通过,统统报相同的错误:缺少System.Linq引用,缺少System.Xml.Linq引用,但是明明有引用啊,引用DLL我都 ...
- 项目由Windows2003 迁移到Windows 2008 过程,报 JS错误
这两天在做服务器迁移,遇到了一些小的问题,现在做个粗略的记录 原服务器环境:Windows 2003 现服务器环境:Windows 2008 其中SSB项目在迁移部署后发现,报 JS的错误. 我在想除 ...
- 【6】Laravel5.1的migration数据库迁移
查看Laravel5.1的目录 当你配置好数据库后,在命令行执行下边的操作 php artisan migrate 打开数据库会发现,我们的数据库多了四个表,神奇吧! 打开任意一个migration查 ...
- django(django项目创建,数据库迁移)
Django项目的创建与介绍 安装:pip3 install django==1.11 查看版本号:django-admin --version 新建项目: 1.切到目标目录 2.django-adm ...
随机推荐
- [ACM_数据结构] POJ2352 [树状数组稍微变形]
Description Astronomers often examine star maps where stars are represented by points on a plane and ...
- linux系统编程之信号(五):信号集操作函数,信号阻塞与未决
一,信号集及相关操作函数 信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来描述信号的集合 ...
- hadoop2.6 上hive运行 报“native-lzo library not available”异常处理
环境:Hadoop 2.6.0 + hive-0.14.0 问题出现的背景:在hive中建表 (建表语句如下),并且表的字段中有Map,Set,Collection等集合类型. CREATE EXT ...
- 使用ABP框架踩过的坑系列5
DDD领域驱动开发,实际是为复杂的业务场景而生的,为了让开发人员专注于业务,而操作系统.数据库.网络之类的技术细节,必须要持久透明化:实际就是数据库系统DBMS的ORM抽象,目标就是业务不需要考虑数据 ...
- Win(Phone)10开发第(2)弹,导出APPX包并签名部署
当我们新建一个win10 uap项目,如果想导出测试包,需要点击项目名称,选择商店-导出应用包,这个时候会生成一个文件夹,包含appx和ps1等文件. powershell运行Add-AppDevPa ...
- 上云、微服务化和DevOps,少走弯路的办法
本文由 网易云发布. 作者:张亮 如果说一个项目的发展历程就像一段未知的旅程,那<云原生应用架构实践>就像一张地图,基于前人的探索标明了在这段旅途中将会碰到的障碍,并注明了越过这些障碍的 ...
- day 112天,爬虫(拉钩网,斗音,GitHub)第二天
提前准备工作.安装准备工作(day3用) 1. 安装scrapy https://www.cnblogs.com/wupeiqi/articles/6229292.html a. 下载twiste ...
- poj1511
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 25099 Accepted: 829 ...
- Windows 内核漏洞学习—空指针解引用
原标题:Windows Kernel Exploitation – NullPointer Dereference 原文地址:https://osandamalith.com/2017/06/22/w ...
- leetcode-908-最小差值 I
题目描述: 给定一个整数数组 A,对于每个整数 A[i],我们可以选择任意 x 满足 -K <= x <= K,并将 x 加到 A[i] 中. 在此过程之后,我们得到一些数组 B. 返回 ...