[实战] PHP WorkerMan CPU过高导致的业务延时 排查与优化
WorkerMan介绍
官方项目地址:https://www.workerman.net/features workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP多进程以及libevent事件轮询库, PHP开发者只要实现一两个接口,便可以开发出自己的网络应用,例如Rpc服务、聊天室服务器、手机游戏服务器等。 workerman的目标是让PHP开发者更容易的开发出基于socket的高性能的应用服务, 而不用去了解PHP socket以及PHP多进程细节。 workerman本身是一个PHP多进程服务器框架,具有PHP进程管理以及socket通信的模块, 所以不依赖php-fpm、nginx或者apache等这些容器便可以独立运行。
业务场景
终端机通过互联网走TCP协议通过NGinx反向代理服务器与线上PHP服务器中的WorkerMan进程通讯,属于长连接,对实时性要求较高。
系统与应用环境
# uname -r 3.10.0-693.11.1.el7.x86_64 # cat /etc/centos-release CentOS Linux release 7.4 Workerman version:3.5.5 PHP version:5.6.36 # php -m [PHP Modules] event phpiredis 这里只列出了高并发相关的已经加载的模块
现象
终端机通过扫码形式进行打开,发现在扫码后会有大约5-10秒的延时才开始下一流程工作。体验变得很糟糕。
排查过程
因为终端机是与Workerman通讯的,因此,直接查看此应用的情况
Workerman 实时连接情况
通过htop指令,发现Workerman占用的CPU核心(CPU 1)还是特别高的。
按理说,刚增加的CPU核数,应该可以改善CPU高的问题啊。不过呢,仔细观察,本机的业务分为传统PHP类和Workerman,按照官方的手册讲到的,Workerman并不跟php-fpm有太多的影响。实际中确实也反映出来了,跟Workerman连接的终端会延时,同一时刻,相关的PHP访问却不受影响,除非整个服务器的CPU都超高。
开始把问题瞄向了磁盘IO和网络IO瓶颈上面,不过当我调出相关的性能监控的时候,发现并不是这个原因。虽然说有写日志的行为,在SSD磁盘的上面还是没有压力的。
随即寻求Workman官方技术群主帮助,通过状态页和相关监控系统指令,产生了疑问:
业务有啥耗费cpu的操作么?请求量不大怎么cpu这么高?
通过mpstat查看每个核的CPU状况,发现运行Workerman的CPU核心确实存在CPU高的现象
于是,立即使用strace命令跟踪下情况
strace命令是一个集诊断、调试、统计与一体的工具,我们可以使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用工作过程的目的。 strace -ttp 进程号
其中每一行是一个系统调用,从这个信息中我们很容易看到进程在做一些什么事情,可以定位到进程卡在哪里,卡在连接还是读取网络数据等
在与终端机发送消息是一去一回,有一个FD=10的操作相当的频繁,刷新的非常快。
使用lsof跟踪此进程
# lsof -p 24373 | grep 10
可以看出,这个就是本机向redis主机通讯(没有采用默认的6379端口号)
会不会是redis的瓶颈引发的?
再次确认了所连接的Redis配置如下
内网每秒发包数不到2000 pps,远远没达到极限的5万pps
事实证明,并不是因为Redis服务的瓶颈。
定位问题
与开发人员进行沟通,得知这是终端设备查询的操作。而且访问的数据都相同,这样疯狂访问redis,导致了cpu利用率过高,就容易延迟了。
至此,基本定位出问题了,剩下的就交给开发进行优化了。
解决方案
1.减少查询返回的量
2.将每次一种状态生成的redis操作的频繁指令合并到多个指令数据集合操作一条redis操作。
3.将遍历方法变成校对产生变化的值,从而减少量级。
取值时间 9:00-21:00
WorkerMan主机平均负载
优化前
优化后
WorkerMan进程CPU使用率
优化前
优化后
redis主机网络流入流出数据包数(pps)
优化前
优化后 ,因为是通过2次优化处理,所以这张图能很明显的看出对比变化
目前线上业务延时已经恢复正常,优化还在进行中,重点将会是WorkerMan进程的CPU优化,不知各位看官有什么多进程处理的好方案呢?
- JVM内存溢出导致的CPU过高问题排查案例
- php请求超时过高导致系统负载高的优化方法?
- 生产线上mysql占CPU过高排查实战
- jvm cpu过高排查实战
- 生产线上mysql占CPU过高排查实战
- php缓存扩展频繁存储/读取数组引发CPU过高问题排查手记(php-memcache为例)
- PHP相关系列 - php缓存扩展频繁存储/读取数组引发CPU过高问题排查手记(php-memcache为例)
- php-fpm CPU占用率过高的排查方法
- php-cgi消耗cpu过多导致机器负责过高
- 生产线上mysql占CPU过高排查实战
- 解决WordPress被利用xmlrpc.php导致VPS CPU内存占用过高问题
- java实战CPU占用过高问题的排查及解决
- JceSecurity/BouncyCastleProvider导致JVM内存溢出、CPU过高问题排查
- 实战Nginx+mysql+PHP(FastCGI)的安装、配置与优化(原理篇)
- 服务器大量php-cgi.exe进程,导致CPU占用100%的解决
- 一例由于一网站cpu占用过高导致服务器cpu占用始终是100%的问题解决
- Mysql占用CPU过高如何优化,如何解决
- 安装第三方网络软件导致svchost.exe占CPU过高使其过热
- Ubuntu 9.10 cpu 温度过高“Temperature/speed normal”,导致kern.log记录日志文件过大的解决办法
- java虚拟机CPU占用率过高排查方法