php项目,cpu暴增问题查找
背景:
前几天通过WordPress上线一个应用(前后台部署分离,后台走内网内部使用,前台做了全站缓存对外使用)。
今天访问后台应用发现开始报504,一段时间后全部504.
解决方案:
登录容器发现容器内nginx日志全部499。
通过top指令发现php-fpm占用cpu暴增。
netstat -anp|grep 'php-fpm端口号' 发现所有php-fpm状态都为syn_recv(服务端被动打开后,接收到了客户端的SYN并且发送了ACK时的状态)
所有php-fpm状态都为syn_recv,导致控制SYNqueue的队列数量满,所有新的请求直接拒绝。
立马通过strace命令进行追踪pid,发现一直在循环执行gettimeofday等一些函数
网上查找资料说如果开启xdebug扩展会引发这样的状况,通过php -m发现果然使用了xdebug,关闭此扩展,重启php-fpm。
进行观察发现,cpu使用率平稳,php-fpm状态正常,一切正常。
总结:
线上不要开启xdebug扩展,为什么xdebug会引起此种问题,暂时未深入了解,但是xdebug性能低不适合线上使用,建议使用php_trace扩展代替
通过php_trace来检测php代码执行流程,关于怎样使用php_trace,可查看之前所写的文章。(php_trace为360开源的工具,性能强大,经他们测试在线上只会损耗百分之几左右的性能)
开启php-fpm状态监控,最好能增加报警机制,已及时发现与获取问题原因。
解释:
这里有必要解释下, TCP连接为什么会积压在队列里, 要理解这个问题, 需要先理解linux 对TCP 三次握手的一些具体实现。
我们知道, 在server端,监听一个端口, 调用socket,bind 最后调用listen:
int listen(intsockfd, int backlog);
listen的第二个参数叫做backlog, 用来设置连接队列的大小。实际Linux 维护两个队列, 一个是在接收到SYN后,此时没有完成三次握手, 处于半连接状态,存放到SYNqueue(我们的问题就是发生在此处),
另一个是三次握手完成后, 成功建立连接,存放到acceptqueue,等待应用调用accept 来消费队列。这里的backlog就是用来设置accept queue(旧版内核用来设置SYN queue,详细请man listen)的大小。
TCP 传输跟系统调用实际是一个异步的过程, 系统通过队列来保存最新的TCP状态或数据。也就是说,TCP三次握手由内核来完成, 跟应用层是否调用accept无关, 内核将完成三次握手的socket 放到acceptqueue中,应用调用accept 时,从accept queue中获取连接。那么,如果backlog 非常大,而我又不及时调用accept 来消费队列,则连接就被积压到accept queue中了。
同样, 在三次握手完成后, 客户端就可以发送数据了, 数据由内核接收, 并保存在TCP 的buffer中, 而此时应用(PHP)可能还没有调用accept。
最后感谢一下曾经的面试官,因为之前有问到如何查找线上cpu暴增问题,后来查找了下基本资料,没想到这次用到了。。
php项目,cpu暴增问题查找的更多相关文章
- 解決 imagick 在 多线程运行时导致CPU暴增到100%的方法
假如把imagic 安装到 /usr/local/imagemagick 目录 首先用/usr/local/imagemagick/bin/convert -version指令查看一下输出內容是否已经 ...
- 阿里云服务出现TCP连接快速增加尤其是NON_ESTABLISHED大量增加导致内存和CPU暴增系统无法使用的问题
TCP状态转移要点TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不 会被释放.网络服务器程序要同时管理大 ...
- 记一次Docker中Redis连接暴增的问题排查
周六生产服务器出现redis服务器不可用状态,错误信息为: 状态不可用,等待后台检查程序恢复方可使用.Unexpected end of stream; expected type 'Status' ...
- 网站TCP链接暴增
昨天上线后,TCP链接暴增,红点增多. 问题在查.其中有一部分,多线程修改,突破了线程数 64的限制.线程内,会发起网络请求. 怀疑是热点之一.其他的部分也有修改,也被怀疑.准备下次,2部分分开上线. ...
- linux suse 3.0.101的一次中断暴增的排查
本文相关背景知识可以在:http://man7.org/linux/man-pages/man5/proc.5.html?spm=5176.100239.blogcont6047.8.ImCGpr 看 ...
- 是什么让.NET7的Min和Max方法性能暴增了45倍?
简介 在之前的一篇文章.NET性能系列文章一:.NET7的性能改进中我们聊到Linq中的Min()和Max()方法.NET7比.NET6有高达45倍的性能提升,当时Benchmark代码和结果如下所示 ...
- 数据库实战案例—————记一次TempDB暴增的问题排查
前言 很多时候数据库的TempDB.日志等文件的暴增可能导致磁盘空间被占满,如果日常配置不到位,往往会导致数据库故障,业务被迫中断. 这种文件暴增很难排查,经验不足的一些运维人员可能更是无法排查具体原 ...
- drawRect导致内存暴增的真正原因
那么现在我们分析一下drawRect导致内存暴增的真正原因: 重写drawRect为何会导致内存大量上涨? 要想搞明白这个问题,我们需要撸一撸在 iOS 程序上图形显示的原理.在 iOS 系统中所有显 ...
- 为什么SSL证书流量暴增?
网络服务提供商 Sandvine 近日发布了一份报告,中提到了一个非常有趣的现象:和去年的数据相比,加密网络流量(SSL)在今年正在呈现出爆发式增长. 这个变化在欧洲表现得十分明显:和去年的 1.47 ...
随机推荐
- Kotlin学习记录2
参考我的博客:http://www.isedwardtang.com/2017/09/03/kotlin-primer-2/
- $ python-json模块的基本用法
准备工作 import json # 准备数据: d = dict(name = 'Tom',age = 18) json_str = '{"name":"Tom&quo ...
- tinyxml优化之一
原文链接:http://www.cnblogs.com/zouzf/p/4154569.html 最近在搞XML解析优化,公司引擎用了tinyxml1和tinyxml2两个XML库,后者的效率比前者高 ...
- 编写第一个Shell脚本【TLCL】
怎样编写一个 Shell 脚本 编写一个脚本 使脚本文件可执行 把脚本放到Shell能够找到的地方 脚本文件格式 #!/bin/bash # This is our first script. ech ...
- RAID独立冗余磁盘阵列
独立冗余磁盘阵列(Redundant Array OF Independent Disks,RAID)开始于20世纪80年代美国加州大学伯克利分校的一个研究项目,当时RAID被称为廉价冗余磁盘阵列(R ...
- xml的servlet配置
内容如下 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="ht ...
- python技术
要把zabbix弄成自动监控,下发任务,部署,事件恢复得功能
- Hibernate -- Session的主键生成策略
*缓存:集合--集合放置到内存中 * 只要session存在 session的一级缓存肯定存在. *当执行查询时,以oid为oid=1条件到session的一级缓存中查找oi ...
- Pandas日期功能
日期功能扩展了时间序列,在财务数据分析中起主要作用.在处理日期数据的同时,我们经常会遇到以下情况 - 生成日期序列 将日期序列转换为不同的频率 创建一个日期范围 通过指定周期和频率,使用date.ra ...
- scjp考试准备 - 8 - final关键字
题目,如下代码的执行结果: import java.util.ArrayList; class Pizza{ ArrayList toppings; public final void addTopp ...