.NET Core Process APIs not Consistent (or always useful) in all situations

The Process APIs should return accurate and useful values in all situations. I wrote a simple app that uses all the memory APIs I could find. I am happy to add more if people direct me to them.

Major take-aways:

  • Multiple properties return a value of 0 on Unix.
  • Process.MaxWorkingSet != memory.limit_in_bytes when memory limited
  • Process.WorkingSet64 != memory.usage_in_bytes

Related issues:

On Windows

C:\testapps\memory>dotnet run

***Configuration**
Build: .NET Core 3.0.0-preview4-27514-07
OS: Microsoft Windows 10.0.17763
OS Arch: X64

***Working set****
Process.MinWorkingSet: 204800
Process.MaxWorkingSet: 1413120
Process.PeakWorkingSet64: 15667200
Process.WorkingSet64: 15663104

***Memory*********
Process.PeakPagedMemorySize64: 267993088
Process.PrivateMemorySize64: 267993088
Process.NonpagedSystemMemorySize64: 42288
Process.PagedMemorySize64: 267993088
Process.PagedSystemMemorySize64: 138040

***Virtual memory
Process.VirtualMemorySize64: 2307580309504
Process.PeakVirtualMemorySize64: 2307580309504

On Linux

rich@tofino:~/memory$ dotnet run

***Configuration**
Build: .NET Core 3.0.0-preview4-27514-07
OS: Linux 3.10.105-bsp-1.2 dotnet/corefx#2 SMP PREEMPT Sat Oct 27 19:24:05 IST 2018
OS Arch: Arm64

***Working set****
Process.MinWorkingSet: 0
Process.MaxWorkingSet: 9223372036854775807
Process.PeakWorkingSet64: 0
Process.WorkingSet64: 18436096

***Memory*********
Process.PeakPagedMemorySize64: 0
Process.PrivateMemorySize64: 0
Process.NonpagedSystemMemorySize64: 0
Process.PagedMemorySize64: 0
Process.PagedSystemMemorySize64: 0

***Virtual memory
Process.VirtualMemorySize64: 2735525888
Process.PeakVirtualMemorySize64: 0

***CGroup*********
CGroup usage: 1644941312
CGroup memory limit: 9223372036854775807

On macOS

Richards-MacBook-Pro:memory rich$ dotnet run

***Configuration**
Build: .NET Core 3.0.0-preview4-27514-07
OS: Darwin 18.2.0 Darwin Kernel Version 18.2.0: Thu Dec 20 20:46:53 PST 2018; root:xnu-4903.241.1~1/RELEASE_X86_64
OS Arch: X64

***Working set****
Process.MinWorkingSet: 0
Process.MaxWorkingSet: 9223372036854775807
Process.PeakWorkingSet64: 0
Process.WorkingSet64: 18923520

***Memory*********
Process.PeakPagedMemorySize64: 0
Process.PrivateMemorySize64: 0
Process.NonpagedSystemMemorySize64: 0
Process.PagedMemorySize64: 0
Process.PagedSystemMemorySize64: 0

***Virtual memory
Process.VirtualMemorySize64: 6893395968
Process.PeakVirtualMemorySize64: 0

On WSL

rich@phantomlake:/mnt/c/testapps/memory$ ~/dotnet/dotnet run

***Configuration**
Build: .NET Core 3.0.0-preview4-27514-07
OS: Linux 4.4.0-17763-Microsoft dotnet/corefx#253-Microsoft Mon Dec 31 17:49:00 PST 2018
OS Arch: X64

***Working set****
Process.MinWorkingSet: 0
Process.MaxWorkingSet: 9223372036854775807
Process.PeakWorkingSet64: 0
Process.WorkingSet64: 17985536

***Memory*********
Process.PeakPagedMemorySize64: 0
Process.PrivateMemorySize64: 0
Process.NonpagedSystemMemorySize64: 0
Process.PagedMemorySize64: 0
Process.PagedSystemMemorySize64: 0

***Virtual memory
Process.VirtualMemorySize64: 84865474560
Process.PeakVirtualMemorySize64: 0

On Linux running in a Debian container on Windows

C:\testapps\memory>docker run --rm -v c:\testapps\memory:/app -w /app mcr.microsoft.com/dotnet/core-nightly/sdk:3.0 dotnet run

***Configuration**
Build: .NET Core 3.0.0-preview4-27508-07
OS: Linux 4.9.125-linuxkit dotnet/corefx#1 SMP Fri Sep 7 08:20:28 UTC 2018
OS Arch: X64

***Working set****
Process.MinWorkingSet: 0
Process.MaxWorkingSet: 9223372036854775807
Process.PeakWorkingSet64: 0
Process.WorkingSet64: 25559040

***Memory*********
Process.PeakPagedMemorySize64: 0
Process.PrivateMemorySize64: 0
Process.NonpagedSystemMemorySize64: 0
Process.PagedMemorySize64: 0
Process.PagedSystemMemorySize64: 0

***Virtual memory
Process.VirtualMemorySize64: 2689052672
Process.PeakVirtualMemorySize64: 0

***CGroup*********
CGroup usage: 76718080
CGroup memory limit: 9223372036854771712

On Linux running in a Debian container on Windows -- memory-limited to 100MB

C:\testapps\memory>docker run -m 100mb --rm -v c:\testapps\memory:/app -w /app mcr.microsoft.com/dotnet/core-nightly/sdk:3.0 dotnet run

***Configuration**
Build: .NET Core 3.0.0-preview4-27508-07
OS: Linux 4.9.125-linuxkit dotnet/corefx#1 SMP Fri Sep 7 08:20:28 UTC 2018
OS Arch: X64

***Working set****
Process.MinWorkingSet: 0
Process.MaxWorkingSet: 9223372036854775807
Process.PeakWorkingSet64: 0
Process.WorkingSet64: 25604096

***Memory*********
Process.PeakPagedMemorySize64: 0
Process.PrivateMemorySize64: 0
Process.NonpagedSystemMemorySize64: 0
Process.PagedMemorySize64: 0
Process.PagedSystemMemorySize64: 0

***Virtual memory
Process.VirtualMemorySize64: 2688528384
Process.PeakVirtualMemorySize64: 0

***CGroup*********
CGroup usage: 72470528
CGroup memory limit: 104857600