การตรวจสอบข้อมูล CPU ใน C#
ข้อมูล CPU มีหลายระดับที่แตกต่างกัน:
- Physical Processors (Sockets) - จำนวน CPU ตัวจริงบนเมนบอร์ด
- Cores - จำนวนโคร์ทั้งหมด (Physical processors × cores per processor)
- Logical Processors - จำนวน thread ที่ CPU รองรับ (รวม Hyper-threading)
ตัวอย่าง: CPU 2 ตัว แต่ละตัว 4 โคร์ รองรับ Hyper-threading → 2 Sockets, 8 Cores, 16 Logical Processors
1. Logical Processors (ง่ายที่สุด - ไม่ต้องเพิ่ม reference)
using System;
class Program
{
public static void Main()
{
int logicalCount = Environment.ProcessorCount;
Console.WriteLine($"Logical Processors: {logicalCount}");
}
}
ผลลัพธ์ตัวอย่าง: Logical Processors: 8
2. Physical Processors และ Cores (ต้องใช้ WMI - Windows เท่านั้น)
ต้องเพิ่ม reference: System.Management.dll (.NET Framework) หรือ NuGet: System.Management (.NET Core/5+ Windows only)
Physical Processors (Sockets)
using System;
using System.Management;
class Program
{
public static void Main()
{
try
{
var searcher = new ManagementObjectSearcher("SELECT NumberOfProcessors FROM Win32_ComputerSystem");
foreach (ManagementObject obj in searcher.Get())
{
Console.WriteLine($"Physical Processors (Sockets): {obj["NumberOfProcessors"]}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
Cores (รวมทุก Socket)
using System;
using System.Management;
class Program
{
public static void Main()
{
try
{
int coreCount = 0;
var searcher = new ManagementObjectSearcher("SELECT NumberOfCores FROM Win32_Processor");
foreach (ManagementObject obj in searcher.Get())
{
coreCount += Convert.ToInt32(obj["NumberOfCores"]);
}
Console.WriteLine($"Total Cores: {coreCount}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
3. รวมทั้งหมดในโค้ดเดียว
using System;
using System.Management;
class Program
{
public static void Main()
{
Console.WriteLine($"Logical Processors: {Environment.ProcessorCount}");
try
{
// Physical Processors
var csSearcher = new ManagementObjectSearcher("SELECT NumberOfProcessors FROM Win32_ComputerSystem");
foreach (ManagementObject obj in csSearcher.Get())
{
Console.WriteLine($"Physical Processors: {obj["NumberOfProcessors"]}");
}
// Cores
int cores = 0;
var procSearcher = new ManagementObjectSearcher("SELECT NumberOfCores, NumberOfLogicalProcessors FROM Win32_Processor");
foreach (ManagementObject obj in procSearcher.Get())
{
cores += Convert.ToInt32(obj["NumberOfCores"]);
Console.WriteLine($"Logical Processors (per CPU): {obj["NumberOfLogicalProcessors"]}");
}
Console.WriteLine($"Total Cores: {cores}");
}
catch (Exception ex)
{
Console.WriteLine($"WMI Error: {ex.Message}");
Console.WriteLine("หมายเหตุ: WMI ต้องการ Windows และอาจต้องการสิทธิ์ Admin");
}
}
}
ผลลัพธ์ตัวอย่าง:
Logical Processors: 8 Physical Processors: 1 Logical Processors (per CPU): 8 Total Cores: 4
ข้อควรระวัง
- WMI ทำงานได้เฉพาะ Windows - Linux/macOS ใช้ไม่ได้
- ต้องการสิทธิ์ Admin บางครั้งสำหรับ WMI query
- ประสิทธิภาพ - WMI query ช้า ควร cache ผลลัพธ์หากเรียกบ่อย
- Container/Docker - Environment.ProcessorCount อาจคืนค่า host ไม่ใช่ container limit (ใช้ cgroup แทน)
ทางเลือกสำหรับ Cross-Platform (.NET 6+)
// .NET 6+ มี API ใหม่ (ยัง experimental)
var info = System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture;
Console.WriteLine($"Architecture: {info}");
// สำหรับ Linux: อ่านจาก /proc/cpuinfo
// สำหรับ Docker: อ่านจาก /sys/fs/cgroup/cpu/cpu.cfs_quota_us