dotnet / corefx-tools

Place to include various misc tools for .NET and .NET Core.
MIT License
58 stars 41 forks source link

perfollect support for Mac OS #93

Open babakontheweb opened 5 years ago

babakontheweb commented 5 years ago

Are there any plans to support perfcollect on Mac OS? Attempting to install via ./perfcollect install responds with

ERROR: Auto install unsupported for this distribution. Install perf manually to continue. but there are no instructions to be found on how to install manually.

Attempting to run ./perfcollect collect myAppCollect before performing the install results in

Perf not installed. Install perf to proceed.

sywhang commented 5 years ago

PerfCollect uses perf and LTTng as its tracing mechanism - As far as I am aware, neither perf or LTTng is available on macOS, so we can't enable perfcollect to support macOS unless macOS decides to switch over to the Linux kernel for some reason :-)

That's the bad part of the answer. The good part - we are actively working on a cross-platform performance monitoring tool via EventPipe which should enable users to do performance diagnostics on macOS as well. Just to set expectations, these are being actively being worked on, which means they are not quite ready for use yet. We're working to get this into the official .NET Core 3.0 release timeframe. In case you want to keep an eye out on what is coming:

This probably isn't the exact answer you wanted to hear, but hopefully that helps your understanding of where we stand.

wfurt commented 5 years ago

eventpipelines work on OSX since 2.1. What exactly are you trying to achieve @babakontheweb? You can do something like:

export COMPlus_EnableEventPipe=1
export COMPlus_EventPipeConfig=Microsoft-System-Net-Sockets:0xFFFFFFFFFFFFFFFF:5,Microsoft-System-Net-Security:0xFFFFFFFFFFFFFFFF:5,Microsoft-System-Net-Http:0xFFFFFFFFFFFFFFFF:5

and run your app. It will create .netperf file in app's current directory and you can load it in perfview.

sywhang commented 5 years ago

To add to @wfurt's answer, you can also get some useful runtime events (ex. JIT, GC, Threads, etc.) as well. To do that you can add Microsoft-Windows-DotNETRuntime:0x4c14fccbd:4 to COMPlus_EventPipeConfig environment variable (they're comma-separated).

Alternatively you can use the dotnet-collect tool: https://github.com/dotnet/diagnostics/tree/master/src/Tools/dotnet-collect.

None of the above gives native stacks though, which may/may not be a limiting factor depending on your usage.