問題:
大概每隔兩個星期左右,秋色園上伺服器就會來一次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
最後插播個流行漫畫: