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 ...
随机推荐
- python之路 线程、进程、协程、队列、python-memcache、python-redis
一.线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import threa ...
- NGUI,多相机共存时,控制显示的元素
当多个相机存在于一个场景中时,我们需要控制某些元素的可见性来达到我们想要的结果. 1:某个相机不需要看见的元素,统一用一个layer来管理 2:选中UIROOT下的相机 在clear flag里面设置 ...
- maven Eclipse实战材料整理
最近在看github上面的项目,发现好多的源码都是maven组织的,但又要去使用maven,因此找资料学习,但是效果很不好,直到昨天晚上看了mooc上面的视频,理清了自己的思路,特将资料列表如下: 视 ...
- angularjs中directive声明scope对象的用法
总的来说用法 分三种: >1: scope: false --> 继承父域,实现 双向数据绑定 示例代码 可自测: <!DOCTYPE html> <html lang ...
- 系统OOM复位定位
定位OOM的工具: 1.多次收集Thread Dump信息kill -3 PID通过对比分析heap 对象信息和Thread信息来定位 2.通过 -Xloggc:D:/gc.log -XX:+He ...
- SDWebImage 加载Https自签名证书时的图片问题
你是否遇到了这种情况,好不容易把自签名HTTPS证书配置好了,访问https接口也成功了,但是图片加载不出来? 传了SDWebImageAllowInvalidSSLCertificates 还是没效 ...
- HDU4631(标程代码)
/*将x从小到大排序,每次插入一个点,直接找比这个点的x大的第一个,然后从这个开始向两边找 ,找点的下标用多重容器实现*/ #include<stdio.h> #include<st ...
- 【笔记】IntelliJ IDEA配置Hibernate
参考:imooc:http://www.imooc.com/video/7706 1.创建Hibernate的配置文件. 将依赖包导入项目.http://blog.csdn.net/a15337525 ...
- 并发-CopyOnWrite源码分析
CopyOnWrite源码分析 参考: https://blog.csdn.net/linsongbin1/article/details/54581787 http://ifeve.com/java ...
- cmd下进入oracle sqlplus
1.sqlplus /nolog 2.connect sys/orcl@ORCL as sysdba 3.select sysdate from dual exit;