ASP.NET如何判断内存和CPU的svchost占用内存过高情况

C#2.0 获取服务器CPU及内存使用情况_百度知道
C#2.0 获取服务器CPU及内存使用情况
最近服务器比较慢,但不知道什么原因。想写个代码来看看使用情况,希望大家不希赐教最好有代码或例子哦先谢过了
我有更好的答案
//cpu频率using Microsoft.Win32;private int GetCPUFrequency()
RegistryKey rk = Registry.LocalMachine.OpenSubKey(@&HARDWARE\DESCRIPTION\System\CentralProcessor\0&);
object obj = rk.GetValue(&~MHz&);
int CPUFrequency = (int)
return CPUF
}////////////////////////////////////磁盘空间 Managementusing System.Mprivate long GetFreeDiskSpace()
ManagementObject disk = new ManagementObject(
&win32_logicaldisk.deviceid=\&d:\&&);
disk.Get();
string totalByte = disk[&FreeSpace&].ToString();
long freeDiskSpaceMb = Convert.ToInt64(totalbyte)/;
return freeDiskSpaceMb;
}///////////////////////内存信息using Susing System.Tusing System.Runtime.InteropSnamespace ConsoleApplication1{
/**//// &summary&
/// Summary description for Class1.
/// &/summary&
class Class1
[StructLayout(LayoutKind.Sequential)]
public struct MEMORY_INFO
public uint dwL
public uint dwMemoryL
public uint dwTotalP
public uint dwAvailP
public uint dwTotalPageF
public uint dwAvailPageF
public uint dwTotalV
public uint dwAvailV
[DllImport(&kernel32&)]
public static extern void GlobalMemoryStatus(ref MEMORY_INFO meminfo);
public static int Main(string[] args)
Class1 class1 = new Class1();
class1.GetMemoryStatus();
private void GetMemoryStatus()
MEMORY_INFO MemI
MemInfo = new MEMORY_INFO();
GlobalMemoryStatus(ref MemInfo);
long totalMb = Convert.ToInt64( MemInfo.dwTotalPhys.ToString())/;
long avaliableMb = Convert.ToInt64( MemInfo.dwAvailPhys.ToString())/;
Console.WriteLine( &物理内存共有& + totalMb + & MB&);
Console.WriteLine( &可使用的物理内存有& + avaliableMb +& MB&);
}////////////////////////////////cpu名字using Microsoft.Win32;private string GetCPUName()
RegistryKey rk = Registry.LocalMachine.OpenSubKey(@&HARDWARE\DESCRIPTION\System\CentralProcessor\0&);
object obj = rk.GetValue(&ProcessorNameString&);
string CPUName = (string)
return CPUName.TrimStart();
}/////////////////////////OS版本using Snamespace determineOS_CS{
class Class1
static void Main(string[] args)
// Get OperatingSystem information from the system namespace.
System.OperatingSystem osInfo =System.Environment.OSV
// Determine the platform.
switch(osInfo.Platform)
// Platform is Windows 95, Windows 98,
// Windows 98 Second Edition, or Windows Me.
case System.PlatformID.Win32Windows:
switch (osInfo.Version.Minor)
Console.WriteLine (&Windows 95&);
if(osInfo.Version.Revision.ToString()==&2222A&)
Console.WriteLine(&Windows 98 Second Edition&);
Console.WriteLine(&Windows 98&);
Console.WriteLine(&Windows Me&);
// Platform is Windows NT 3.51, Windows NT 4.0, Windows 2000,
// or Windows XP.
case System.PlatformID.Win32NT:
switch(osInfo.Version.Major)
Console.WriteLine(&Windows NT 3.51&);
Console.WriteLine(&Windows NT 4.0&);
if (osInfo.Version.Minor==0)
Console.WriteLine(&Windows 2000&);
Console.WriteLine(&Windows XP&);
Console.ReadLine ();
采纳率:22%
windows优化大师超级兔子深度系统优化工具都可以
WMI,具体写法网上很多。
ServerOS = Environment.OSVersion.ToString();
//操作系统:
CpuSum = Environment.GetEnvironmentVariable(&NUMBER_OF_PROCESSORS&);
//CPU个数:
CpuType = Environment.GetEnvironmentVariable(&PROCESSOR_IDENTIFIER&);
//CPU类型:
ServerSoft = Request.ServerVariables[&SERVER_SOFTWARE&];
//信息服务软件:
MachineName = Server.MachineN
//服务器名
ServerName = Request.ServerVariables[&SERVER_NAME&];
//服务器域名
ServerPath = Request.ServerVariables[&APPL_PHYSICAL_PATH&];
//虚拟服务绝对路径
ServerNet = &.NET CLR & + Environment.Version.ToString();
//DotNET 版本
ServerArea = (DateTime.Now - DateTime.UtcNow).TotalHours & 0 ? &+& + (DateTime.Now - DateTime.UtcNow).TotalHours.ToString() : (DateTime.Now - DateTime.UtcNow).TotalHours.ToString();
//服务器时区
ServerTimeOut = Server.ScriptTimeout.ToString();
//脚本超时时间
ServerStart = ((Double)System.Environment.TickCount / 3600000).ToString(&N2&);
//开机运行时长
PrStart = GetPrStart();
//进程开始时间
AspNetN = GetAspNetN();
//AspNet 内存占用
AspNetCpu = GetAspNetCpu();
//AspNet CPU时间
ServerSessions = Session.Contents.Count.ToString();
//Session总数
ServerApp = Application.Contents.Count.ToString();
//Application总数
ServerCache = Cache.Count.ToString();
//应用程序缓存总数
ServerAppN = GetServerAppN();
//应用程序占用内存
ServerFso = Check(&Scripting.FileSystemObject&);
//FSO 文本文件读写
ServerTimeOut = Server.ScriptTimeout.ToString() + &毫秒&;
//本页执行时间
其他1条回答
为您推荐:
其他类似问题
您可能关注的内容
服务器cpu的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。其他回答(3)
最简单的办法:查看进程管理器里的W3P_ASPNET.EXE,如果不知道进程ID,可以把站点的应用程序池(最好单独使用)停了,然后再开,留意进程管理器的进程变化而确定。
园豆:5085
什么叫如何判断?
你是想通过程序写一个任务管理器?不管怎么着你都得调winapi,
调用windows 的api,既可以获取到当前操作系统的资源信息。
具体的函数名称和调用方式,你自己google,我只给你思路。
清除回答草稿
&&&您需要以后才能回答,未注册用户请先。asp.net 获取机器硬件信息(cpu频率、磁盘可用空间、内存容量等)
转载 &更新时间:日 11:55:40 & 作者:
asp.net 收集机器硬件信息的相关代码片断(cpu频率、磁盘可用空间、内存容量……)
代码如下:using S using System.D using System.C using System.W using System.Web.S using System.Web.UI; using System.Web.UI.WebC using System.Web.UI.WebControls.WebP using System.Web.UI.HtmlC using Microsoft.Win32; using System.T using System.Runtime.InteropS using System.M//(添加对 System.Management.dll 的引用才能使用 System.Management 命名空间) namespace EC { /// &summary& /// 收集机器硬件信息的相关代码片断(cpu频率、磁盘可用空间、内存容量……) /// &/summary& public class CpuInfoObject { public CpuInfoObject() { // // TODO: 在此处添加构造函数逻辑 // } #region 获取CPU频率 /************************************************** * 函数名称:GetCPUFrequency() * 功能说明:获取CPU频率 * 参 数: * 使用示列: * Response.Write(EC.CpuInfoObject.GetCPUFrequency()); ************************************************/ /// &summary& /// 获取CPU频率 /// &/summary& /// &returns&整型cpu频率&/returns& public static int GetCPUFrequency() { RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"HARDWARE\DESCRIPTION\System\CentralProcessor\0"); object obj = rk.GetValue("~MHz"); int CPUFrequency = (int) return CPUF } #endregion #region 获取CPU名称 /************************************************** * 函数名称:GetCPUName() * 功能说明:获取CPU名称 * 参 数: * 使用示列: * Response.Write(EC.CpuInfoObject.GetCPUName()); ************************************************/ /// &summary& /// 获取CPU名称 /// &/summary& /// &returns&字符串型cpu名称&/returns& public static string GetCPUName() { RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"HARDWARE\DESCRIPTION\System\CentralProcessor\0"); object obj = rk.GetValue("ProcessorNameString"); string CPUName = (string) return CPUName.TrimStart(); } #endregion #region 磁盘空间 /************************************************** * 函数名称:GetFreeDiskSpace(string DiskName) * 功能说明:获取磁盘空间 * 参 数:DiskName:磁盘名称 D:或E: * 使用示列: * Response.Write(EC.CpuInfoObject.GetFreeDiskSpace("D:")); ************************************************/ /// &summary& /// 磁盘空间 /// &/summary& /// &param name="DiskName"&硬盘名称:D:或E:&/param& /// &returns&整型&/returns& public static long GetFreeDiskSpace(string DiskName) { ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"" + DiskName + "\""); disk.Get(); string totalByte = disk["FreeSpace"].ToString(); long freeDiskSpaceMb = Convert.ToInt64(totalByte) / 1024 / 1024; return freeDiskSpaceMb; } #endregion #region 获取操作系统版本 /************************************************** * 函数名称:GetOSName() * 功能说明:获取获取操作系统版本名称 * 参 数: * 使用示列: * Response.Write(EC.CpuInfoObject.GetOSName()); ************************************************/ /// &summary& /// 获取操作系统版本 /// &/summary& /// &returns&操作系统版本&/returns& public static string GetOSName() { string Rev = ""; System.OperatingSystem osInfo = System.Environment.OSV switch(osInfo.Platform) { //Platform is Windows 95, Windows 98,Windows 98 Second Edition, or Windows Me. case System.PlatformID.Win32Windows: switch(osInfo.Version.Major) { case 0: Rev ="Windows 95";
case 10: if(osInfo.Version.Revision.ToString()=="2222A") Rev ="Windows 98 Second Edition"; else Rev ="Windows 98";
case 90: Rev="Windows Me";
//Platform is Windows NT 3.51, Windows NT 4.0, Windows 2000,or Windows XP. case System.PlatformID.Win32NT: switch (osInfo.Version.Major) { case 3: Rev = "Windows NT 3.51";
case 4: Rev = "Windows NT 4.0";
case 5: if (osInfo.Version.Minor == 0) Rev = "Windows 2000"; else if (osInfo.Version.Minor == 2) Rev = "Windows 2003"; else Rev = "Windows XP";
} return R } #endregion } }
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具鉴于昨天的文章&&&&里面有一个封装好的无锁的类库可以判断并发下的结束状况,我们可以完成并发时,以及并发的同时做一些事,因此,今天我做了个小demo:
using System.Collections.C
using System.Collections.G
using System.D
using System.L
using System.T
using System.T
using System.Threading.T
namespace ConsoleApp6
public enum CoordinationStatus
public sealed class AsyncCoordinator
private Int32 m_opCount = <span style="color: #;
// Decremented when AllBegun calls JustEnded
private Int32 m_statusReported = <span style="color: #; // 0=false, 1=true
private Action&CoordinationStatus& m_
private Timer m_
// This method MUST be called BEFORE initiating an operation
public void AboutToBegin(Int32 opsToAdd = <span style="color: #)
Interlocked.Add(ref m_opCount, opsToAdd);
// This method MUST be called AFTER an operations result has been processed
public void JustEnded()
if (Interlocked.Decrement(ref m_opCount) == <span style="color: #)
ReportStatus(CoordinationStatus.AllDone);
// This method MUST be called AFTER initiating ALL operations
public void AllBegun(Action&CoordinationStatus& callback, Int32 timeout = Timeout.Infinite)
m_callback =
// 是否需要永远运行
if (timeout != Timeout.Infinite)
// 在指定的时间点(dueTime) 调用回调函数,随后在指定的时间间隔(period)调用回调函数
m_timer = new Timer(TimeExpired, null, timeout, Timeout.Infinite);
JustEnded();
// 处理过时的线程
private void TimeExpired(Object o)
ReportStatus(CoordinationStatus.Timeout);
public void Cancel()
if (m_callback == null)
throw new InvalidOperationException("Cancel cannot be called before AllBegun");
ReportStatus(CoordinationStatus.Cancel);
private void ReportStatus(CoordinationStatus status)
if (m_timer != null)
// If timer is still in play, kill it
Timer timer = Interlocked.Exchange(ref m_timer, null);
if (timer != null) timer.Dispose();
// If status has never been reported, else ignore it
if (Interlocked.Exchange(ref m_statusReported, <span style="color: #) == <span style="color: #)
m_callback(status);
class Program
static AsyncCoordinator m_ac = new AsyncCoordinator();
static void Main(string[] args)
Console.BufferHeight = Int16.MaxValue - <span style="color: #;
Console.BufferWidth = Int16.MaxValue - <span style="color: #;
ConcurrentQueue&int& concurrentQueue = new ConcurrentQueue&int&();
for(int i =<span style="color: #;i&<span style="color: #000; i++)
concurrentQueue.Enqueue(i);
Console.WriteLine("添加完毕....");
var t = new Task[<span style="color: #];
for (int i=<span style="color: #; i&<span style="color: #; i++)
m_ac.AboutToBegin(<span style="color: #);
t[i] = Task.Factory.StartNew((param) =&
while (concurrentQueue.Count&<span style="color: #)
if(concurrentQueue.TryDequeue(out x))
Console.WriteLine(x + "
线程Id: {0},
线程数: {1}", Task.CurrentId, param.ToString());
//Thread.Sleep(150);
m_ac.JustEnded();
m_ac.AllBegun(AllDone, Timeout.Infinite);
Console.ReadKey();
public static void AllDone(CoordinationStatus status)
switch (status)
case CoordinationStatus.Cancel:
Console.WriteLine("Operation canceled.");
case CoordinationStatus.Timeout:
Console.WriteLine("Operation timed-out.");
case CoordinationStatus.AllDone:
Console.WriteLine("处理完毕....");
但是发现了一个问题:
这CPU使用率....然后我看了下输出结果:
可以看到线程数才只有5个(我的线程数是从0开始算的),这不会啊,明明我们就开了50个线程啊,不过不管开多少个线程,这CPU扛不住啊,要是说在项目中的某个模块需要用到并发,这CPU使用率你扛得住?服务器本来配置就不会太好,网站的其余模块不要用CPU了?而且,我明明开了50个线程跑啊,为什么只有五个线程?其实很简单,因此并发下,代码只用了五个线程就跑完了这一万个数据,剩下的线程开了没有用武之地。找到只有五个线程开着的原因了之后,要想想怎么解决啊,多的45个线程也是要占内存的,尽管是线程池线程,但也是要占用内存啊,既然是因为并发下运行太快,只要五个线程就能跑满一万个数据,那我就阻塞一会线程就可以了,这样让剩下的45个线程能够有机会运行。改代码!将上面的Thread.Sleep(150)的注释给去掉哦!
嗯,这个结果还是可以的,但是有个Console host占用内存高啊,占就占呗,反正该用的内存还是要用。我们睡眠了一段时间的线程,那么与不睡眠相比,并发的CPU使用率是不是下降了?我们开线程最好的期待不就是跑满CPU么?其实不然,开线程不过就是为了更快的运行程序,将耗时的程序分批次运行,但是如果期间占用CPU太高,我这里是个demo,占用CPU时间很短,也就几十秒。但是真的项目中会允许么?具体情况具体分析吧,如果不介意的话,可以这么跑,大不了另外弄个服务器专门跑并发,然后将数据存储到数据库中(如果你的业务是: 并发调用第三方接口,然后将接口获取的数据做处理,完全可以采用这种设计)。但是请注意,还是不要太耗费CPU的好。并发线程的睡眠时间,我们也可以自己调节下,建议是100-200ms吧。
阅读(...) 评论()下次自动登录
现在的位置:
& 综合 & 正文
ASP.NET(c#)中取得当前计算机CPU
内存使用率等相关信息
C#中调用API的基本过程:
首先,在调用API之前,你必须先导入System.Runtime.InteropServices这个名称空间。该名称空间包含了在Visual
C#中调用API的一些必要集合,具体的方法如下:
System.Runtime.InteropS
在导入了名称空间后,我们要声明在程序中所要用到的API函数。我们的程序主要是获取系统的相关信息,所以用到的API函数都是返回系统信息的。先给出在Visual C#中声明API的方法:
[DllImport("kernel32")]
GetWindowsDirectory(StringBuilder
WinDir,int
其中,"DllImport"属性用来从不可控代码中调用一个方法,它指定了DLL的位置,该DLL中包含调用的外部方法;"kernel32"设定了类库名;"public"指明函数的访问类型为公有的;"static"修饰符声明一个静态元素,而该元素属于类型本身而不是指定的对象;"extern"表示该方法将在工程外部执行,同时使用DllImport导入的方法必须使用"extern"修饰符;最后GetWindowsDirectory函数包含了两个参数,一个为StringBuilder类型的,另一个为int类型的,该方法返回的内容存在于StringBuilder类型的参数中。同时,因为我们在这里使用到了StringBuilder类,所以在程序的开始处,我们还得添加System.Text这个名称空间,方法同上。
其他几个API函数的声明如下:
[DllImport("kernel32")]
GetSystemDirectory(StringBuilder
SysDir,int
[DllImport("kernel32")]
GetSystemInfo(ref
[DllImport("kernel32")]
GlobalMemoryStatus(ref
MEMORY_INFO
[DllImport("kernel32")]
GetSystemTime(ref
SYSTEMTIME_INFO
以上几个API的作用分别是获取系统路径,获得CPU相关信息,获得内存的相关信息,获得系统时间等。
在声明完所有的API函数后,我们发现后三个函数分别用到了CPU_INFO、MEMORY_INFO、SYSTEMTIME_INFO等结构,这些结构并非是.Net内部的,它们从何而来?其实,我们在用到以上API调用时均需用到以上结构,我们将函数调用获得的信息存放在以上的结构体中,最后返回给程序输出。这些结构体比较复杂,但是如果开发者能够熟练运用,那么整个API世界将尽在开发者的掌握之中。以下就是上述结构体的声明:
//定义以下各结构
//定义CPU的信息结构
[StructLayout(LayoutKind.Sequential)]
lpMinimumApplicationA
lpMaximumApplicationA
dwActiveProcessorM
dwNumberOfP
dwProcessorT
dwAllocationG
dwProcessorL
dwProcessorR
//定义内存的信息结构
[StructLayout(LayoutKind.Sequential)]
MEMORY_INFO
dwTotalPageF
dwAvailPageF
//定义系统时间的信息结构
[StructLayout(LayoutKind.Sequential)]
SYSTEMTIME_INFO
结构体定义的主体部分和C++中的没多大差别,具体每个结构体内部成员的定义可参考联机帮助中的SDK文档。同时,我们还发现在每个结构体定义的上面都有一句用中括号括起来的说明性文字。这些说明都是有关结构体成员的布局的,共有三种选项,分别说明如下:
LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序。
注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
在上面的程序中,为了方便起见我们都用到了第三种方式所有的API函数以及相关的结构体声明完毕后,我们就运用这些API来实现我们的程序功能――获取系统的相关信息。
界面可按如下方式布置,不过有兴趣的读者自然可以发挥自己的想象,将界面布局做得更好。
简单的界面布置好后,我们添加一个按钮("获取信息"按钮)的消息处理函数如下:
GetInfo_Click(object
System.EventArgs
//调用GetWindowsDirectory和GetSystemDirectory函数分别取得Windows路径和系统路径
<span style="COLOR: #8;
StringBuilder
StringBuilder(nChars);
GetWindowsDirectory(Buff,nChars);
WindowsDirectory.Text
"Windows路径:"+Buff.ToString();
GetSystemDirectory(Buff,nChars);
SystemDirectory.Text
"系统路径:"+Buff.ToString();
<span style="COLOR: #
//调用GetSystemInfo函数获取CPU的相关信息
<span style="COLOR: #
<span style="COLOR: #
CPU_INFO();
<span style="COLOR: #
GetSystemInfo(ref
<span style="COLOR: #
NumberOfProcessors.Text
<span style="COLOR: #
"本计算机中有"+CpuInfo.dwNumberOfProcessors.ToString()+"个CPU";
<span style="COLOR: #
ProcessorType.Text
"CPU的类型为"+CpuInfo.dwProcessorType.ToString(); <span style="COLOR: #
<span style="COLOR: #
ProcessorLevel.Text
<span style="COLOR: #
"CPU等级为"+CpuInfo.dwProcessorLevel.ToString();
<span style="COLOR: #
OemId.Text
ID为"+CpuInfo.dwOemId.ToString();
<span style="COLOR: #
PageSize.Text
"CPU中的页面大小为"+CpuInfo.dwPageSize.ToString();
<span style="COLOR: #
//调用GlobalMemoryStatus函数获取内存的相关信息
<span style="COLOR: #
MEMORY_INFO
<span style="COLOR: #
MEMORY_INFO();
<span style="COLOR: #
GlobalMemoryStatus(ref
<span style="COLOR: #
MemoryLoad.Text
MemInfo.dwMemoryLoad.ToString()+"%的内存正在使用";
<span style="COLOR: #
TotalPhys.Text
"物理内存共有"+MemInfo.dwTotalPhys.ToString()+"字节";
<span style="COLOR: #
AvailPhys.Text
"可使用的物理内存有"+MemInfo.dwAvailPhys.ToString()+"字节";
<span style="COLOR: #<span style="COLOR: #
TotalPageFile.Text
<span style="COLOR: #
"交换文件总大小为"+MemInfo.dwTotalPageFile.ToString()+"字节";
<span style="COLOR: #
AvailPageFile.Text
<span style="COLOR: #
"尚可交换文件大小为"+MemInfo.dwAvailPageFile.ToString()+"字节";
<span style="COLOR: #
TotalVirtual.Text
<span style="COLOR: #
"总虚拟内存有"+MemInfo.dwTotalVirtual.ToString()+"字节";
<span style="COLOR: #
AvailVirtual.Text
<span style="COLOR: #
"未用虚拟内存有"+MemInfo.dwAvailVirtual.ToString()+"字节";
<span style="COLOR: #
//调用GetSystemTime函数获取系统时间信息
<span style="COLOR: #
SYSTEMTIME_INFO
<span style="COLOR: #
SYSTEMTIME_INFO();
<span style="COLOR: #
GetSystemTime(ref
<span style="COLOR: #
<span style="COLOR: #
StInfo.wYear.ToString()+"年"+StInfo.wMonth.ToString()+"月"+StInfo.wDay.ToString()+"日"; <span style="COLOR: #
<span style="COLOR: #
<span style="COLOR: #
(StInfo.wHour+<span style="COLOR: #).ToString()+"点"+StInfo.wMinute.ToString()+"分"+StInfo.wSecond.ToString()+"秒"; <span style="COLOR: #
<span style="COLOR: #
} <span style="COLOR: # <span style="COLOR: #
【上篇】【下篇】}

我要回帖

更多关于 linux查看内存占用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信