寫個軟件來防止服務器網站CPU百分百


問題:

大概每隔兩個星期左右, 秋色園上服務器就會來一次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));//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)//cpu連續超過90% 50秒就殺。
                    {
                        killTimes++;
                         if (killTimes >  50)
                        {
                            Console.WriteLine(pro.Id +  "  長期高CPU,秒殺... ");
                            pro.Kill();
                            Thread.Sleep(TimeSpan.FromMinutes( 3));
                             return;
                        }
                    }
                     else
                    {
                        killTimes =  0;
                    }
                     if (killTimes >  0)//只有cpu超過90%才打印文字
                    {
                        Console.WriteLine(pro.Id +  "  CPU: " + value +  "  -- killtimes: " + killTimes);
                    }
                }
                Thread.Sleep(interval);
                 if (s >  59)
                {
                    s = - 1;
                     break;
                }
                 else
                {
                    s++;
                }
            }
        }

    }
}


原文地址:http://www.cyqdata.com/cyq1162/article-detail-54284

最后插播個流行漫畫:


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM