Có 3 khái niệm quan trọng về CPU topology:
- Physical Processors (Sockets): Số CPU socket vật lý trên mainboard.
- Cores: Số core vật lý trên mỗi socket.
- Logical Processors: Số thread logic (Core * Hyper-threading factor). Đây là số thread có thể chạy đồng thời thực sự.
1. Logical Processors (Environment.ProcessorCount) - Dễ nhất
int logicalCount = Environment.ProcessorCount;
Console.WriteLine($"Logical Processors: {logicalCount}");
// Output: 8 (ví dụ: 4 cores + Hyper-threading)
Đây là số thread có thể chạy song song. Phổ biến nhất để cấu hình MaxDegreeOfParallelism, thread pool size.
2. Physical Processors & Cores (WMI - Windows only)
using System.Management; // NuGet: System.Management (Windows only)
public static void PrintCpuInfo()
{
// Physical Processors (Sockets)
int physicalProcessors = 0;
foreach (var item in new ManagementObjectSearcher("SELECT NumberOfProcessors FROM Win32_ComputerSystem").Get())
physicalProcessors = Convert.ToInt32(item["NumberOfProcessors"]);
// Cores (tổng số core vật lý)
int coreCount = 0;
foreach (var item in new ManagementObjectSearcher("SELECT NumberOfCores FROM Win32_Processor").Get())
coreCount += Convert.ToInt32(item["NumberOfCores"]);
// Logical Processors (tổng)
int logicalProcessors = 0;
foreach (var item in new ManagementObjectSearcher("SELECT NumberOfLogicalProcessors FROM Win32_Processor").Get())
logicalProcessors += Convert.ToInt32(item["NumberOfLogicalProcessors"]);
Console.WriteLine($"Physical Processors (Sockets): {physicalProcessors}");
Console.WriteLine($"Total Cores: {coreCount}");
Console.WriteLine($"Total Logical Processors: {logicalProcessors}");
Console.WriteLine($"Environment.ProcessorCount: {Environment.ProcessorCount}");
}
Kết quả mẫu
Physical Processors (Sockets): 1
Total Cores: 4
Total Logical Processors: 8
Environment.ProcessorCount: 8
3. Cross-platform (.NET Core / .NET 5+) - Không có API built-in cho Physical/Core
.NET không cung cấp API cross-platform để lấy physical cores/sockets. Các lựa chọn:
- Linux: Parse
/proc/cpuinfohoặclscpu. - macOS:
sysctl -n hw.physicalcpu hw.logicalcpu. - Thư viện:
System.Management(Windows),Microsoft.Win32.Registry, hoặc P/Invoke.
Ví dụ Cross-platform helper (Linux/macOS/Windows)
public static class CpuInfo
{
public static int LogicalCount => Environment.ProcessorCount;
public static (int Physical, int Cores, int Logical) GetDetails()
{
if (OperatingSystem.IsWindows())
return GetWindowsDetails();
else if (OperatingSystem.IsLinux())
return GetLinuxDetails();
else if (OperatingSystem.IsMacOS())
return GetMacOSDetails();
else
return (0, 0, LogicalCount);
}
private static (int, int, int) GetWindowsDetails()
{
// WMI code như trên
return (physical, cores, logical);
}
private static (int, int, int) GetLinuxDetails()
{
// Parse /proc/cpuinfo
// physical id -> sockets, cpu cores -> cores per socket, processor -> logical
return (0, 0, LogicalCount); // Simplified
}
private static (int, int, int) GetMacOSDetails()
{
// sysctl
return (0, 0, LogicalCount); // Simplified
}
}
Khi nào dùng cái nào?
| Metric | Dùng cho |
|---|---|
| Environment.ProcessorCount | Parallel.ForEach MaxDegreeOfParallelism, ThreadPool sizing, Task partitioning, general concurrency limit. |
| Physical Cores | CPU-bound workload tuning, affinity, licensing (per-core), NUMA awareness. |
| Physical Sockets | NUMA topology, memory locality, server licensing. |
Lưu ý: Trong container (Docker/K8s), Environment.ProcessorCount phản ánh CPU limit của container (cgroups), không phải host. Rất quan trọng cho cloud-native apps.