问题: 
大概每隔两个星期左右,
秋色园 上服务器就会来一次CPU百分百,由于问题发生的概率极低,要它重现也难,所以只能意淫是内存太少的原故。
以前出现,远程上去结束掉进程,就正常了,悲剧的是最近秋色园VPS不知啥原因,经常远程不上去, 最后转转折折只能进VPS管理后台重启。
要遇上CPU百分百,又是需要机缘,所以一旦发生和遇到解决的时间差度大,就会造成服务器长时间打不开,后果大伙都懂的。。。
 
 
解决: 
方法一:设置应用池CPU策略,达到N的时候自动回收进程(不实用,排除) 
因为更新网站dll时,偶尔有顺时达到100%,可能就1-2秒,可能会导致回收到,如果再有偶尔,就会造成死循环了。
 
方法二:写个软件放上去,监控cpu如果持续1分钟,直接kill掉进程。(就这么招了。。。 )
花了点时间,写了下代码,扔上去了,哟省事了。。。。
新建一个控制台。。。代码如下:
using  System; 
using  System.Collections.Generic; 
using  System.Text; 
using  System.Threading; 
using  System.Diagnostics; 
 
namespace  IISCpuForServer 
{ 
    class  Program 
    { 
        static  void  Main(string [] args) 
        { 
            Console.WriteLine(" 监控IIS CPU w3wp 进程中,若100%,而自动结束该进程... " ); 
            Thread thread = new  Thread(new  ThreadStart(Run)); 
            thread.IsBackground = true ; 
            thread.Start(); 
            Console.Read(); 
        } 
        static  void  Run() 
        { 
            try  
            { 
                while  (true ) 
                { 
                    Process[] procs = Process.GetProcessesByName(" w3wp " ); 
                    if  (procs != null  && procs.Length > 0 ) 
                    { 
 
                        foreach  (Process pro in  procs) 
                        { 
                            if  (!pro.HasExited) 
                            { 
                                CheckPro(pro); 
                            } 
                        } 
                    } 
                    Thread.Sleep(TimeSpan.FromMinutes(5 )); 
                } 
            } 
            catch  (Exception err) 
            { 
                Console.WriteLine(err.Message); 
            } 
        } 
        static  void  CheckPro(Process pro) 
        { 
            int  s = 0 ;// 60秒。  
             int  killTimes = 0 ; 
            // 间隔时间(毫秒)  
             int  interval = 1000 ; 
            // 上次记录的CPU时间  
             TimeSpan prevCpuTime = TimeSpan.Zero; 
            while  (true ) 
            { 
                // 当前时间  
                 TimeSpan curTime = pro.TotalProcessorTime; 
                // 间隔时间内的CPU运行时间除以逻辑CPU数量  
                 double  value = (curTime - prevCpuTime).TotalMilliseconds / interval / Environment.ProcessorCount * 100 ; 
                prevCpuTime = curTime; 
 
                if  (s > 0 ) 
                { 
                    if  (value > 90  && value < 100 ) 
                    { 
                        killTimes++; 
                        if  (killTimes > 50 ) 
                        { 
                            Console.WriteLine(pro.Id + "  长期高CPU,秒杀... " ); 
                            pro.Kill(); 
                            Thread.Sleep(TimeSpan.FromMinutes(3 )); 
                            return ; 
                        } 
                    } 
                    else  
                    { 
                        killTimes = 0 ; 
                    } 
                    if  (killTimes > 0 ) 
                    { 
                        Console.WriteLine(pro.Id + "  CPU: "  + value + "  -- killtimes: "  + killTimes); 
                    } 
                } 
                Thread.Sleep(interval); 
                if  (s > 59 ) 
                { 
                    s = -1 ; 
                    break ; 
                } 
                else  
                { 
                    s++; 
                } 
            } 
        } 
 
    } 
}
 
 
Autumn Park is QBlog the official site, created by the passing autumn, based on the framework data layers developed cyqdata support multi-user, multi-language, multi-database (access, mssql, oracle), directory level url and other powerful blog system
Edit 2012/12/6 14:35:31  | network  |
									Comment 
									|
									Browse (7358)