监控Linux/WSL中的.NET进程内存
资源密集型的.NET工作,如OCR、PDF生成或图像处理,在WSL(Windows Subsystem for Linux)或Linux容器等受限环境中可能难以计量。 您可以直接从控制台应用程序记录进程的内存消耗,或使用标准Linux工具在外部监视它。
前提条件
- .NET SDK安装,版本
5.0或更高。 - 一个Linux环境,无论是本地的还是通过WSL。
- 一个基本的.NET控制台应用程序。
解决方案
1. 将内存使用记录到控制台
读取进程的私有内存大小并以MB为单位打印出来:
using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
// Trigger your memory-consuming logic here (e.g., OCR, PDF generation, etc.)
// Log memory usage
Process currentProcess = Process.GetCurrentProcess();
long memorySize = currentProcess.PrivateMemorySize64; // In bytes
Console.WriteLine($"Memory Usage: {memorySize / (1024 * 1024)} MB");
}
}
using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
// Trigger your memory-consuming logic here (e.g., OCR, PDF generation, etc.)
// Log memory usage
Process currentProcess = Process.GetCurrentProcess();
long memorySize = currentProcess.PrivateMemorySize64; // In bytes
Console.WriteLine($"Memory Usage: {memorySize / (1024 * 1024)} MB");
}
}
Imports System
Imports System.Diagnostics
Class Program
Shared Sub Main(ByVal args As String())
' Trigger your memory-consuming logic here (e.g., OCR, PDF generation, etc.)
' Log memory usage
Dim currentProcess As Process = Process.GetCurrentProcess()
Dim memorySize As Long = currentProcess.PrivateMemorySize64 ' In bytes
Console.WriteLine($"Memory Usage: {memorySize / (1024 * 1024)} MB")
End Sub
End Class
PrivateMemorySize64返回进程分配的专用内存量(以字节为单位),而不与其他进程共享。 这是您应用程序运行负荷的可靠指标。
2. 持续跟踪内存
对于长时间运行的进程,将读取包装在循环中以随时间抽样使用情况:
while (true)
{
var memory = Process.GetCurrentProcess().PrivateMemorySize64;
Console.WriteLine($"Memory Usage: {memory / (1024 * 1024)} MB");
Thread.Sleep(5000); // Log every 5 seconds
}
while (true)
{
var memory = Process.GetCurrentProcess().PrivateMemorySize64;
Console.WriteLine($"Memory Usage: {memory / (1024 * 1024)} MB");
Thread.Sleep(5000); // Log every 5 seconds
}
Imports System.Diagnostics
Imports System.Threading
While True
Dim memory = Process.GetCurrentProcess().PrivateMemorySize64
Console.WriteLine($"Memory Usage: {memory / (1024 * 1024)} MB")
Thread.Sleep(5000) ' Log every 5 seconds
End While
Thread.Sleep(5000)调用每五秒记录一次日志。 将输出导管到一个文件或另一个进程,或当使用超过某个阈值时用它触发警报。
控制台输出
Memory Usage: 214 MB
选项:使用Linux工具在外部监视
要在应用程序外部监视一个进程,请使用标准实用工具之一。 <pid>是进程ID,操作系统为每个正在运行的进程分配的唯一编号。
top 或 htop: 实时监控单个进程。
top -p <pid>
top -p <pid>
ps: 打印内存字段的一次性快照。
ps -o pid,vsz,rss,comm -p <pid>
ps -o pid,vsz,rss,comm -p <pid>
这里RSS是驻留集大小,即正在使用的物理内存。
smem: 安装它以获得更详细的单个进程拆解。
sudo apt install smem
smem -p <pid>
sudo apt install smem
smem -p <pid>
最佳实践
- 在生产部署前,在测试环境中运行内存跟踪。
- 对于长时间运行的服务或API,集成如Prometheus或Grafana这样的度量堆栈。
- 保留
GC.Collect()仅用于调试。

