Skip to content

Process.MaxWorkingSet should read from /sys/fs/cgroup/memory when available #28812

@richlander

Description

@richlander

I am playing with the Process.MaxWorkingSet API. I am getting results that I don't expect. Should the values be so different in Linux containers? Is that some container-ism or something wrong with our Linux PAL?

C:\testapps\workingset>dotnet run
Hello World!
MinWorkingSet: 204800
WorkingSet64: 15110144
MaxWorkingSet: 1413120

C:\testapps\workingset>docker run --rm -v C:\testapps\workingset:/app -w /app microsoft/dotnet:3.0-sdk dotnet run
Hello World!
MinWorkingSet: 0
WorkingSet64: 23556096
MaxWorkingSet: 9223372036854775807

C:\testapps\workingset>docker run --rm -m 60m -v C:\testapps\workingset:/app -w /app microsoft/dotnet:3.0-sdk dotnet run
Hello World!
MinWorkingSet: 0
WorkingSet64: 23568384
MaxWorkingSet: 9223372036854775807

C:\testapps\workingset>docker run --rm microsoft/dotnet:3.0-sdk uname -a
Linux b1a8742108c0 4.9.125-linuxkit dotnet/corefx#1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 GNU/Linux

C:\testapps\workingset>docker run --rm -m 60m -v C:\testapps\workingset:/app -w /app microsoft/dotnet:3.0-sdk-alpine dotnet run
Hello World!
MinWorkingSet: 0
WorkingSet64: 25010176
MaxWorkingSet: 9223372036854775807

C:\testapps\workingset>docker run --rm -m 60m microsoft/dotnet:3.0-sdk-alpine cat /sys/fs/cgroup/memory/memory.limit_in_bytes
62914560

C:\testapps\workingset>docker run --rm microsoft/dotnet:3.0-sdk-alpine uname -a
Linux 0ba6cfe799f1 4.9.125-linuxkit dotnet/corefx#1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 Linux

C:\testapps\workingset>type Program.cs
using System;
using System.Diagnostics;

namespace workingset
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Console.WriteLine($"MinWorkingSet: {Process.GetCurrentProcess().MinWorkingSet}");
            Console.WriteLine($"WorkingSet64: {Process.GetCurrentProcess().WorkingSet64}");
            Console.WriteLine($"MaxWorkingSet: {Process.GetCurrentProcess().MaxWorkingSet}");
        }
    }
}

C:\testapps\workingset>

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions