일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- table용량
- left join
- Gradle Jar
- c#
- MS-SQL
- 스마트공장
- Xamarin
- delete truncate 차이
- c# 강의
- mssql join
- OPC UA
- Jar 경로
- springboot Gradle
- MSSQL
- OPC DA
- Full Outer Join
- OPC
- mssql table 용량
- lock
- deepl python
- right join
- deepl api
- SCM
- JOIN DBMS별 차이점
- CPU 사용량
- mssql 옵티마이저
- Java 버전 여러개 사용
- inner join
- kafka
- Gradle JDK Path
- Today
- Total
IT’s Ha
[.NET] CPU,Memory, HDD 정보 가져오기 본문
안녕하세요.
이번 포스팅은 Windows OS환경에서 CPU와 Memory, HDD 정보 가져오기 입니다.(하나의 예시를 구현하였고, 세부적인 내용은 필요하신 기능에 의해 수정하여 사용하시면 됩니다.)
개발 환경은 C# Console Project를 이용하였고, .NET 7.0을 사용하였습니다.
1. 프로젝트 생성
먼저, C# Console Project를 생성해주세요. 프로젝트명은 MonitoringExample으로 지정해줍니다.
2. MemoryClass 생성
프로젝트 아래에 Class 디렉토리(폴더)를 생성합니다. 그리고 그 안에 클래스를 추가합니다.
namespace MonitoringExample.Class
{
public class MemoryClass
{
// 메모리 총 용량
private double _totalSize = 0;
// 여유 공간
private double _freeSize = 0;
// 사용 공간
private double _useSize = 0;
public double TotalSize
{
get { return _totalSize; }
set { _totalSize = value; }
}
public double FreeSize
{
get { return _freeSize; }
set
{
_freeSize = value;
}
}
public double UseSize
{
get { return _useSize; }
set { _useSize = value; }
}
}
}
메모리에서 가져올 내용은 메모리의 총 용량, 여유 공간, 사용 공간 입니다.
3. HardDiskClass
Class 폴더 아래에 클래스를 추가합니다.
namespace MonitoringExample.Class
{
public class HardDiskClass
{
//하드디스크 이름
private string _name = string.Empty;
// Total 용량
private long _totalSize = 0;
// 여유 공간
private long _freeSize = 0;
// 사용 공간
private long _useSize = 0;
public string Name
{
get { return _name; }
set { _name = value; }
}
public long TotalSize
{
get { return _totalSize; }
set { _totalSize = value; }
}
public long FreeSize
{
get { return _freeSize; }
set
{
_freeSize = value;
}
}
public long UseSize
{
get { return _useSize; }
set { _useSize = value; }
}
}
}
하드디스크에서 가져올 정보는 하드 디스크의 이름, 총 용량, 여유 공간, 사용 공간 입니다.
4. PCClass
using System.Collections.ObjectModel;
namespace MonitoringExample.Class
{
public class PCClass
{
// CPU 사용량
private double _cpuUsage;
// Memory 사용량
private MemoryClass _memory = new MemoryClass();
// HDD (2개 이상 될수 있기 때문에 ObservableCollection에 정보를 저장)
private ObservableCollection<HardDiskClass> _hardDisk = new ObservableCollection<HardDiskClass>();
public double CpuUsage
{
get { return _cpuUsage; }
set { _cpuUsage = value; }
}
public MemoryClass Memory
{
get { return _memory; }
set { _memory = value; }
}
public ObservableCollection<HardDiskClass> HardDisk
{
get { return _hardDisk; }
set { _hardDisk = value; }
}
}
}
PCClass는 CPU사용량, 메모리 클래스, 디스크정보들을 가지고 있습니다. 디스크 같은경우는 2개 이상 나눠져있을 가능성이 있어 ObservableCollection클래스로 구성하였습니다.
5. ServiceClass
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Management;
namespace MonitoringExample.Class
{
//서비스 클레스
public class ServiceClass
{
public static PCClass PC = new PCClass();
private Thread thread;
PerformanceCounter cpu = new PerformanceCounter("Processor Information", "% Processor Utility", "0,_Total");
public ServiceClass()
{
thread = new Thread(ScanStatus);
thread.IsBackground = true;
thread.Start();
}
private async void ScanStatus()
{
try
{
do
{
await Task.Delay(500);
ScanHddDisk();
ScanMemory();
ScanCPU();
} while (true);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
private void ScanHddDisk()
{
DriveInfo[] hddDrives = DriveInfo.GetDrives();
ObservableCollection<HardDiskClass> tmpHdd = new ObservableCollection<HardDiskClass>();
HardDiskClass hdd;
foreach (DriveInfo drive in hddDrives)
{
if (drive.DriveType == DriveType.Fixed)
{
hdd = new HardDiskClass();
hdd.Name = drive.Name.ToString();
hdd.TotalSize = drive.TotalSize / 1024 / 1024 / 1024;
hdd.FreeSize = drive.AvailableFreeSpace / 1024 / 1024 / 1024;
hdd.UseSize = (drive.TotalSize - drive.AvailableFreeSpace) / 1024 / 1024 / 1024;
tmpHdd.Add(hdd);
}
}
PC.HardDisk = tmpHdd;
}
private void ScanMemory()
{
var wmi = new ManagementObjectSearcher("select * from Win32_OperatingSystem");
var info = wmi.Get().Cast<ManagementObject>().Select(mo => new MemoryClass()
{
TotalSize = Math.Round(double.Parse(mo["TotalVisibleMemorySize"].ToString()) / 1024 / 1024, 2),
FreeSize = Math.Round(double.Parse(mo["FreePhysicalMemory"].ToString()) / 1024 / 1024, 2),
UseSize = Math.Round((double.Parse(mo["TotalVisibleMemorySize"].ToString()) - double.Parse(mo["FreePhysicalMemory"].ToString())) / 1024 / 1024, 2)
}).FirstOrDefault();
PC.Memory = info;
}
private void ScanCPU()
{
var sValue = Math.Round(cpu.NextValue(),2);
PC.CpuUsage = sValue;
}
}
}
서비스 클레스는 CPU,Memory, Disk정보를 가지고 오는 역할을 합니다.
1) PerformanceCounter
- PerformanceCounter는 Windows에서 제공하는 성능 모니터의 정보를 가지고 있습니다. 여기서 저희는 CPU의 정보를 가져 오기위해 사용을 합니다. 성능모니터를 실행하시면 아래와 같은 화면이 나타납니다.
위 성능 모니터에서 + 버튼을 누르면 카운터 추가 화면이 나타납니다.
우리가 CPU에서 가지고 올 카운터는 Processor Information 에서 % Processor Utility의 인스턴스에 0,_Total에 대한 정보를 가지고 올려고 합니다. 다른 사이트에서는 Processor카운터의 정보를 가지고 오는 경우가 있는데, 작업관리자와 같은 내용을 보여주기 위해서는, Processor Information의 정보를 가지고 사용합니다.
2)ManagementObjectSearcher
- ManagementObjectSearcher를 이용하여 OS에 대한 정보를 가지고 옵니다. 메모리의 정보를 가지고 올 예정입니다.
3)ScanHddDisk
- DriveInfo[] hddDrives = DriveInfo.GetDrives(); 디바이스의 정보를 가지고 와서 DriveType.Fixed을 디스크 정보로 저장하게 됩니다.
4)ScanMemory
- ManagementObjectSearcher를 이용하여 OS에 대한 정보를 가지고 옵니다. 그리고 총 용량(TotalVisibleMemorySize), 여유 공간(FreePhysicalMemory), 사용량은 (총 용량 - 여유 공간)의 데이터를 사용합니다.
5)ScanCPU
- CPU의 정보는 PerformanceCounter를 통하여 가져옵니다. 그리고 소숫점 2자리까지 표현을 위하여 Math함수를 사용하여 반올림 처리합니다.
이번 포스팅은 여기서 마치겠습니다.
6.Program.cs
using MonitoringExample.Class;
namespace MonitoringExample
{
static class Program
{
static void Main(string[] args)
{
ServiceClass ms = new ServiceClass();
while (true)
{
Thread.Sleep(2000);
Console.WriteLine("==============================================================");
Console.WriteLine("Memory TotSize : " + ServiceClass.PC.Memory.TotalSize + "Gb");
Console.WriteLine("Memory FreeSize : " + ServiceClass.PC.Memory.FreeSize + "Gb");
Console.WriteLine("Memory UseSize : " + ServiceClass.PC.Memory.UseSize + "Gb");
Console.WriteLine("CPU : " + ServiceClass.PC.CpuUsage + "%");
foreach (HardDiskClass hdd in ServiceClass.PC.HardDisk)
{
Console.WriteLine("HDD Disk " + hdd.Name + " - Total SIze : " + hdd.TotalSize + "Gb , Use Size : " + hdd.UseSize + "Gb , Free Size : " + hdd.FreeSize + "Gb");
}
}
}
}
}
프로그램 파일에서는 ServiceClass를 생성하고 데이터를 콘솔에 뿌려줍니다.
7. 실행결과
위와같이 결과가 나옵니다.
궁금하신 내용이나 잘못된 내용은 댓글이나 메일로 부탁드리겠습니다. 감사합니다.
'.NET' 카테고리의 다른 글
[.NET] Visual Studio Nuget 패키지 오류 (0) | 2023.02.15 |
---|