liuhaoyang/butterfly-csharp

跨平台的 CoreCLR Profiler技术选型讨论

liuhaoyang opened this issue · 6 comments

目前已知如下方案可实现跨平台的CoreCLR Profiler

  1. 针对CoreCLR在不同平台提供的tracing数据进行监控,如windows使用ETW,linux使用LTTng,参考#11 #12
  1. 使用CoreCLR提供的非托管Profiling API实现CoreCLR监控,需使用c++实现,已知部分商业APM使用此方案,如听云。

分别实现也是为了性能数据,如果从 CoreCLR 提供的非托管 Profiling API 拿到的性能数据够用的话,那就只写一份代码多好呀。

@netcore-jroger Profiling API 不能调研托管代码也不能被托管代码调用,需要收集和通信全部用cpp写,开发和维护成本是问题

@netcore-jroger Profiling API 不能调研托管代码也不能被托管代码调用,需要收集和通信全部用cpp写,开发和维护成本是问题

托管代码可以调用Profiling dll里面的代码,Profiling dll也可以调用托管代码,前者容易实现,后者稍微复杂一些。
但“开发和维护成本是问题”,这个结论是没错的。

Dynatrace、AppDynamics、Newrelic 等APM架构大致如下:

工具分为Profiling dll和托管代码2部分

  1. Profiling dll仅实现通用的IL改写功能,不实现任何业务逻辑。
    Profiling dll通过xml或json配置文件根据定制的规则嵌入托管代码。
    Profiling dll写好后,增加新的监控逻辑代码不需要改动,只需要更改配置文件和对应的托管代码就可以了。

  2. 托管代码实现具体的业务逻辑
    实现嵌码后的数据拦截、性能数据的汇总、与报表服务器的通讯