Chinaunix

标题: apache的某个进程运行时间太长,导致cpu 100%,apache假死掉? [打印本页]

作者: mysnopy    时间: 2007-09-14 23:19
标题: apache的某个进程运行时间太长,导致cpu 100%,apache假死掉?
能不能帮忙写个shell,我现在的情况是:apache的几个进程会把CPU耗光,apache变假死,web连接不了,能不能半个小时判断一下,要是这个进程一直存在(超过半个小时)和CPU占用比较大,两个同时满足的话,把这个apache进程kill掉?


作者: qintel    时间: 2007-09-15 23:40
最好是找出这个进程为什么占这么大的原因来,是程序写得垃圾,还是数据库没配置好?

写个脚本是下策。

ps aux 得到信息,grep或sed过滤掉没用的,shell判断时间,awk得到进程号,kill之。
作者: linux_paly    时间: 2007-09-15 23:59
top -n 1 -b |grep 'httpd' |awk '{print $1,$9,$11}'  


后面的awk判断不怎么会.就不写了.

[ 本帖最后由 linux_paly 于 2007-9-16 00:01 编辑 ]
作者: 9er    时间: 2007-09-17 12:56
原帖由 qintel 于 2007-9-15 23:40 发表
最好是找出这个进程为什么占这么大的原因来,是程序写得垃圾,还是数据库没配置好?

写个脚本是下策。

ps aux 得到信息,grep或sed过滤掉没用的,shell判断时间,awk得到进程号,kill之。




思路...
作者: mysnopy    时间: 2007-09-17 22:56
老大么,我的web服务器流量太大,所以经常有某个进程出现问题,按上面的 linux_paly 兄说的,但我不懂,shell,所以不知道以弄,现在天天晚上起来管着apache.
作者: huzi1986    时间: 2007-09-17 23:08
不懂就要学习
作者: mysnopy    时间: 2007-09-18 12:27
先看看了。
作者: steelyoung    时间: 2007-09-18 12:46
2楼说的对,写脚本是下下策,找出问题原因才是根本!
作者: linux_paly    时间: 2007-09-18 13:22
top -n 1 -b |grep 'httpd' |awk 'length($9)>=100.0{print "kill", $1}'|sh


解决cpu>=100%时,自动关闭.           我觉得应该看看httpd.conf,配制,虽然很少用httpd,但httpd.conf好想是很好用的.
作者: mxbao    时间: 2007-09-18 14:44
应该是优化问题,或者负载问题,呵呵
如果是环境问题,久解决
如果是硬件问题,久换硬件,或者做负载均衡,哈
作者: hansfly    时间: 2007-09-18 14:59
学习中
作者: mysnopy    时间: 2007-09-20 17:02
原帖由 linux_paly 于 2007-9-18 13:22 发表
top -n 1 -b |grep 'httpd' |awk 'length($9)>=100.0{print "kill", $1}'|sh


解决cpu>=100%时,自动关闭.           我觉得应该看看httpd.conf,配制,虽然很少用httpd,但httpd.conf好想是很好用的.



我服务器有8台做集群的,但有时集群时有时会出现某台负载过高的情况,所以才这样的。谢谢,我测试一下看。

[ 本帖最后由 mysnopy 于 2007-9-20 17:04 编辑 ]
作者: mysnopy    时间: 2007-09-20 22:13
Cpu(s): 36.5%us,  1.0%sy,  0.0%ni, 39.3%id, 22.9%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:   3369668k total,  3242216k used,   127452k free,     8932k buffers
Swap:  4096532k total,   111624k used,  3984908k free,  2934056k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                               
16810 xxxx  18   0  241m 8460 5452 S  201  0.3   2580:28 httpd                                                                  
10215 xxxx   18   0  447m  49m 9184 S    2  1.5   0:40.37 httpd                                                                  
10844 xxxx   18   0  446m  49m 8724 S    2  1.5   0:39.14 httpd

不行呀,我用这个命令:
top -n 1 -b |grep 'httpd' |awk 'length($9)>=100.0{print "kill", $1}'|sh
试了好多次,但都不行,还在,我用root执行的。最后是直接手工kill掉的?
作者: linux_paly    时间: 2007-09-21 19:22
运行.

#top -n 1 -b |grep 'httpd' |awk 'length($9)>=100.0{print "kill", $1}'

输出什么看一下.
作者: qintel    时间: 2007-09-23 14:56
原帖由 mysnopy 于 2007-9-20 17:02 发表



我服务器有8台做集群的,但有时集群时有时会出现某台负载过高的情况,所以才这样的。谢谢,我测试一下看。



你的集群是不是用LVS做的?负载过高的机器是固定某一台,还是不固定?Web服务主要是跑些什么应用,会有很大流量?http下载?最好把情况详细说明下。

如果只是一般的php web程序,那就分析一下Apache的配置文件,请程序员和DBA分析应用程序和数据库负载。

[ 本帖最后由 qintel 于 2007-9-23 15:00 编辑 ]
作者: wd    时间: 2007-09-23 16:09
lsof -p $pid 看看这个进程在干吗,实在不行就直接kill调好了。apache里面kill一个没关系。
作者: mysnopy    时间: 2007-09-23 19:48
原帖由 qintel 于 2007-9-23 14:56 发表



你的集群是不是用LVS做的?负载过高的机器是固定某一台,还是不固定?Web服务主要是跑些什么应用,会有很大流量?http下载?最好把情况详细说明下。

如果只是一般的php web程序,那就分析一下Apache的 ...



我的集群是用lvs做的,每天有100多万的PV,是流媒体类的网站,主要跑web应用,用户可以上传视频上来,然后后台转换成flv格式的文件,因为用户量比较大,所以用了集群,但现在的话,我用apache的worker模式跑的,某个进程资源占用会比较高过会apache就死掉了,最可恶的是lvs竟然侦测不到某台已经连不上了,只有apache停掉或这台服务器关机了或死机了才能侦测到,apache假死不能侦测到,所以没办法只能用shell来判断有没有假死之类的。

程序是php的。
作者: mysnopy    时间: 2007-09-25 09:19
原帖由 linux_paly 于 2007-9-21 19:22 发表
运行.

#top -n 1 -b |grep 'httpd' |awk 'length($9)>=100.0{print "kill", $1}'

输出什么看一下.



试了,没用么。 进程时间都很长,CPU占用倒没到100。 可能需要把CPU进程长的或CPU占用大的一起删掉。

[ 本帖最后由 mysnopy 于 2007-9-25 09:21 编辑 ]

未命名.GIF (5.99 KB, 下载次数: 38)

未命名.GIF

作者: linux_paly    时间: 2007-09-25 10:45
试试:
top -n 1 -b |grep 'httpd' |awk 'length($9)>=90.0{print "kill", $1}'|sh && top -n 1 -b |grep 'httpd' |awk 'length($11)>=0.30{print "kill", $1}'|sh



length($9)>=90.0      CPU 占用率       我设为90%

length($11)>=0.30     运行时间          我设为0.30

你自己可以修改

[ 本帖最后由 linux_paly 于 2007-9-25 10:48 编辑 ]
作者: mysnopy    时间: 2007-09-25 11:25
谢谢楼上的,我再试一下,试完回来报告。

两个是不是或的关系,不应该是and的关系?
作者: qintel    时间: 2007-09-25 11:35
原帖由 mysnopy 于 2007-9-23 19:48 发表



我的集群是用lvs做的,每天有100多万的PV,是流媒体类的网站,主要跑web应用,用户可以上传视频上来,然后后台转换成flv格式的文件,因为用户量比较大,所以用了集群,但现在的话,我用apache的work ...



LVS应该有这功能的,写个测试页面,好像是用ldirector进程实现的,读不了这个测试页面,就不往这个机子上调度新进的请求了
还有LVS调度算法有4,5种吧,可能有能适合你需求的,你多钻研一下LVS官方文档,网上流传的一些中文文档都不完整,有些甚至就是错误的。。。我前些天配置heartbeat时有类似的经历,花2天看完了相关的英文官方文档,要比看网上互相转载的那几个中文的有价值的多。。。

:wink: 我管理网站的日PV接近90W了

[ 本帖最后由 qintel 于 2007-9-25 11:37 编辑 ]
作者: mysnopy    时间: 2007-09-25 17:01
我就用ldirector这个方法的,能判断,但apache假死判断不了。只有apache停掉或服务器死机才能侦测到。
作者: mysnopy    时间: 2007-09-26 13:53
原帖由 linux_paly 于 2007-9-25 10:45 发表
试试:
top -n 1 -b |grep 'httpd' |awk 'length($9)>=90.0{print "kill", $1}'|sh && top -n 1 -b |grep 'httpd' |awk 'length($11)>=0.30{print "kill", $1}'|sh



length($9)>=90.0      CPU 占用率    ...



运行这个我全部的httpd进程都关掉了,就是apache停了,但满足上面条件的没有呀,奇怪了。
作者: 用的是我的    时间: 2007-09-26 15:35
提示: 作者被禁止或删除 内容自动屏蔽
作者: linux_paly    时间: 2007-09-26 18:44
awk 'length($11)>=0.30                0.30太小,换成1000.00吧
作者: mysnopy    时间: 2007-09-26 21:10
原帖由 linux_paly 于 2007-9-26 18:44 发表
awk 'length($11)>=0.30                0.30太小,换成1000.00吧




今天测试时网络都断了,apache都停了,吓我一跳,有几万的IP在访问的,。。。

这个时间单位是分钟吧?我再试。。。
作者: mysnopy    时间: 2007-09-27 11:27
晕了,今天测试了,一个httpd进程CPU占用超过100%,有200%,时间有1496,但用上面的命令:
top -n 1 -b |grep 'httpd' |awk 'length($9)>=90.0{print "kill", $1}'|sh && top -n 1 -b |grep 'httpd' |awk 'length($11)>=100{print "kill", $1}'|sh

top -n 1 -b |grep 'httpd' |awk 'length($9)>=90.0{print "kill", $1}'|sh && top -n 1 -b |grep 'httpd' |awk 'length($11)>=1000{print "kill", $1}'|sh

试了好多次,进程依然存在,最后工只能用kill -9 命令直接kill掉。
作者: linux_paly    时间: 2007-09-27 13:22
运行:

top -n 1 -b |grep 'httpd' |awk '{print $9,$11}'

把出现的数字写上来.

自己调一下,也可以.         

把|sh 去掉.   

top -n 1 -b |grep 'httpd' |awk 'length($9)>=90.0{print "kill", $1}' && top -n 1 -b |grep 'httpd' |awk 'length($11)>=1000{print "kill", $1}'

就可以查看输出的内容

应该是

kill  数字

把|sh 去掉.就不会执行了,应该是设置问题,自己相对应的设一下.
作者: cndefu    时间: 2007-09-27 17:22
跟进中,楼主搞定一定要把经验写出来呀
作者: mysnopy    时间: 2007-09-29 22:45
原帖由 linux_paly 于 2007-9-27 13:22 发表
运行:

top -n 1 -b |grep 'httpd' |awk '{print $9,$11}'

把出现的数字写上来.

自己调一下,也可以.         

把|sh 去掉.   

top -n 1 -b |grep 'httpd' |awk 'length($9)>=90.0{print "kill", ...



用了上面的所有方法,都没有输出任何数字,运行命令列表如下:
top -n 1 -b |grep 'httpd' |awk 'length($9)>=90.0{print "kill", $1}' && top -n 1 -b |grep 'httpd' |awk 'length($11)>=1000{print "kill", $1}'

top -n 1 -b |grep 'httpd' |awk 'length($9)>=90.0{print "kill", $1}'

top -n 1 -b |grep 'httpd' |awk 'length($11)>=1000{print "kill", $1}

top -n 1 -b |grep 'httpd' |awk 'length($11)>=100{print "kill", $1}'

但发下运行下面这个就会有输出了(kill 10209):
top -n 1 -b |grep 'httpd' |awk 'length($11)>=9{print "kill", $1}'
那个数字是>=10的时候都是没有输出的.这个数字9是什么单位呢?搞不懂了。

下面的命令:
top -n 1 -b |grep 'httpd' |awk 'length($9)>=3{print "kill", $1}'
数字是3时也会输出,数字>=4时就不会输出了。 不知道这里 length($9) 和 length($11) 分别是什么意思呢?

还发现一个问题加了|sh后,上面的 print "kill"没用,要修改成 print "kill -9" ,加一个 -9 才能杀死进程。

[ 本帖最后由 mysnopy 于 2007-9-29 22:47 编辑 ]

未命名.GIF (7.11 KB, 下载次数: 36)

未命名.GIF

作者: linux_paly    时间: 2007-09-30 11:05
是有些问题....

运行....

top -n 1 -b |grep 'httpd' |awk '{print $9,$11}'      自己可以相应的查看...$9,$11

具体是什么问体,我也不态清楚,自己可以相应的调试一下....
作者: HB07140030    时间: 2009-03-02 11:45
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2