寫個軟體來防止伺服器網站CPU百分百

來源:互聯網
上載者:User

問題:

大概每隔兩個星期左右,秋色園上伺服器就會來一次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

最後插播個流行漫畫:

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.