Monitorar Memória de Processos .NET no Linux/WSL

This article was translated from English: Does it need improvement?
Translated
View the article in English

Trabalhos pesados em .NET, como OCR, geração de PDF ou processamento de imagens, podem ser difíceis de dimensionar em ambientes restritos como WSL (Windows Subsystem for Linux) ou contêineres Linux. Você pode registrar o consumo de memória de um processo em tempo real diretamente de um aplicativo de console, ou assisti-lo externamente com ferramentas padrão do Linux.

Pré-requisitos

  • SDK .NET instalado, versão 5.0 ou superior.
  • Um ambiente Linux, nativo ou via WSL.
  • Um aplicativo de console básico .NET.

Solução

1. Registrar uso de memória no console

Leia o tamanho da memória privada do processo e imprima em megabytes:

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
$vbLabelText   $csharpLabel

PrivateMemorySize64 retorna a quantidade de memória, em bytes, que o processo alocou exclusivamente e não compartilha com outros processos. É um sólido indicador de quão pesado seu aplicativo está rodando.

2. Monitorar memória continuamente

Para um processo de longa duração, envolva a leitura em um loop para amostrar o uso ao longo do tempo:

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
$vbLabelText   $csharpLabel

A chamada Thread.Sleep(5000) ajusta o registro para uma leitura a cada cinco segundos. Encaminhe a saída para um arquivo ou outro processo, ou use-a para disparar alertas quando o uso ultrapassar um limite.

Saída do console

Memory Usage: 214 MB

Opção: Monitorar externamente com ferramentas Linux

Para assistir um processo de fora do aplicativo, use uma das utilitários padrão. <pid> é o ID do Processo, o número único que o sistema operacional atribui a cada processo em execução.

top ou htop: observe um único processo ao vivo.

top -p <pid>
top -p <pid>
SHELL

ps: imprima um instantâneo único de campos de memória.

ps -o pid,vsz,rss,comm -p <pid>
ps -o pid,vsz,rss,comm -p <pid>
SHELL

Aqui VSZ é o tamanho da memória virtual em KB e RSS é o tamanho do conjunto residente, a memória física em uso.

smem: instale-o para uma análise mais detalhada de cada processo.

sudo apt install smem
smem -p <pid>
sudo apt install smem
smem -p <pid>
SHELL

Melhores práticas

  • Execute o acompanhamento de memória em ambientes de teste antes de implantar para produção.
  • Para serviços ou APIs de longa duração, integre uma stack de métricas como Prometheus ou Grafana.
  • Reserve GC.Collect() apenas para depuração.

AvisoNão chame GC.Collect() em código de produção; use-o apenas enquanto estiver depurando.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais
Pronto para começar?
Nuget Downloads 20,296,129 | Versão: 2026.7 recém-lançado
Still Scrolling Icon

Ainda está rolando a tela?

Quer provas rápidas? PM > Install-Package IronPdf
executar um exemplo Veja seu HTML se transformar em um PDF.