.NET运行时中的监测和可观测性
今年5月份的时候研究分布式追踪的问题知道了的拦截方式比较零散, 刚好8月份的时候看到这篇文章,这个文章总结的比较完整。存档了很久,趁今天有空翻译给大家。原文地址,校验:张蘅水
.NET是一个托管运行时,这意味着它提供了“管理”您的程序的高级功能,从简介到公共语言运行时(CLR)(2007年编写):
运行时具有许多功能,因此按如下方式对它们进行分类很有用:
- 基本功能 对其他功能设计有广泛影响的功能。这些包括:
1.垃圾收集
2.记忆安全和类型安全
3.对编程语言的高级支持。 - 辅助功能 - 许多有用的程序可能不需要基本特性所支持的功能:
1.使用AppDomains进行程序隔离
2.程序安全和沙盒 - 其他功能 - 所有运行时环境都需要但不利用CLR基本功能的功能。相反,它们是创建完整编程环境的结果。其中包括:
1.版本
2.Debugging/Profiling
3.互操作
您可以看到,“Debugging/Profiling”虽然不是基本或辅助功能,但由于“ 需要创建完整的编程环境 ” ,它仍然会进入列表。
这篇文章的其余部分将看什么 监测,可观测性和内省功能核心CLR提供,为什么他们是有用的,如何提供他们。
为了便于浏览,帖子分为3个主要部分(最后有一些“额外阅读材料”):
- 诊断(Diagnostics)
- Perf View(性能分析工具)
- 共同基础设施
- 未来的计划
- 剖析(Profiling)
- ICorProfiler API
- 分析 v .调试
- 调试(Debugging)
- ICorDebug API
- SOS和DAC
- 第三方调试器
- 记忆转储
诊断(Diagnostics)
首先,我们将查看CLR提供的诊断信息,传统上这些信息是通过“Windows事件跟踪”(ETW)提供的。
CLR提供的各种事件涉及:
- 垃圾收集(GC)
- 即时(JIT)编译
- 模块和AppDomains
- 线程和锁争用
- 以及更多
例如,这是触发AppDomain Load事件的地方,这是Exception Thrown事件,这里是GC Allocation Tick事件。
Perf View
如果你想看到来自你的.NET程序的ETW事件,我建议使用优秀的PerfView工具,从这些PerfView教程开始,或者这个优秀的演讲PerfView:终极.NET性能工具。PerfView被广泛认可,因为它提供了宝贵的信息,例如Microsoft工程师经常将其用于性能调查。
共同基础设施
但是,如果从名称中不清楚,ETW事件仅在Windows上可用,这并不适合新的.NET“跨平台”世界。您可以在Linux上使用PerfView进行性能跟踪(通过LTTng),但这只是cmd-line集合工具,称为“PerfCollect”,分析和丰富的UI(包括flamegraphs)目前仅适用于Windows。
但是如果你想分析.NET Performance Linux,还有其他一些方法:
上面的第二个链接讨论了在.NET Core中正在使用的新“EventPipe”基础架构(以及EventSources和EventListeners,你能发现一个主题!),你可以看到它在跨平台性能监控设计中的目标。在高层次上,它将为CLR提供一个单独的位置来推动与诊断和性能相关的“事件”。然后,这些“事件”将被路由到一个或多个记录器,例如,可能包括ETW,LTTng和BPF,精确记录器由CLR运行的OS /平台确定。.NET Cross-Plat性能和事件设计中还有更多背景信息可以解释不同日志记录技术的优缺点。
“事件管道”中正在进行的所有工作都在“性能监控”项目和相关的“EventPipe”问题中进行跟踪。
未来的计划
最后,还有一个性能分析控制器的(Performance Profiling Controller )未来计划,其目标如下:
控制器负责以简单和跨平台的方式控制性能分析基础结构和.NET性能诊断组件生成的性能数据。
我们的想法是通过从“事件管道”中提取所有相关数据,通过HTTP服务器公开以下功能:
REST API
- Pri 1:简单分析:为运行时间配置X个时间并返回跟踪。
- Pri 1:高级分析:开始跟踪(以及配置)
- Pri 1:高级分析:停止跟踪(对此调用的响应将是跟踪本身)
- Pri 2:获取与所有EventCounters或指定EventCounter相关的统计信息。
可浏览的HTML页面
- Pri 1:流程中所有托管代码堆栈的文本表示。
- 提供当前正在运行的用作简单诊断报告的快照概述。
- Pri 2:显示EventCounters的当前状态(可能具有历史记录)。
* 提供现有计数器及其值的概述。
* 开放性问题:我不相信存在必要的公共API来枚举EventCounters。
我很高兴看到“性能分析控制器(Performance Profiling Controller)”(PPC?)的位置,我认为将这种内置到CLR中确实非常有价值,这是其他运行时的内容。
剖析(Profiling)
CLR提供的另一个强大功能是Profiling API,它(大部分)被第三方工具用于在非常低级别挂钩到运行时。您可以在此概述中找到有关API的更多信息,但在较高级别,它允许您连接在以下情况下触发的回调:
- GC相关事件发生
- 抛出异常
- 装配/卸载装配
- 更多,更多
来自BOTR页面的图像分析API - 概述
此外还有其他非常强大的功能。首先,您可以设置每次执行.NET方法时调用的挂钩,无论是在运行时还是用户代码中。这些回调被称为“进入/离开”钩子,并且有一个很好的示例显示如何使用它们,但为了使它们工作,您需要了解不同操作系统和CPU架构的“调用约定”,这并不总是容易的。另外,作为警告,Profiling API是一个只能通过C / C ++代码访问的COM组件,你不能在C#/ F#/ VB.NET中使用它!
其次,Profiler能够通过SetILFunctionBody()API在JIT 之前重写任何.NET方法的IL代码。这个API功能非常强大,构成了许多.NET APM工具的基础,您可以在我之前的文章中了解更多关于如何使用它的方法。如何模拟密封类和静态方法以及随附的代码。
ICorProfiler API
事实证明,运行时必须执行各种疯狂的技巧才能使Profiling API正常工作,只需查看进入此PR的内容允许重新连接(有关'ReJIT'的详细信息,请参阅ReJIT:A How-To指南)。
所有Profiling API接口和回调的总体定义可在\vm\inc\corprof.idl中找到(请参阅接口说明语言)。但它分为2个逻辑部分,一个是Profiler - >'Execution Engine'(EE)接口,称为ICorProfilerInfo
:
// Declaration of class that implements the ICorProfilerInfo* interfaces, which allow the
// Profiler to communicate with the EE. This allows the Profiler DLL to get
// access to private EE data structures and other things that should never be exported
// outside of the EE.
这在以下文件中实现:
另一个主要部分是EE - > Profiler回调,它们在ICorProfilerCallback
界面下组合在一起:
// This module implements wrappers around calling the profiler's
// ICorProfilerCallaback* interfaces. When code in the EE needs to call the
// profiler, it goes through EEToProfInterfaceImpl to do so.
这些回调在以下文件中实现:
- VM\eetoprofinterfaceimpl.h
- VM\eetoprofinterfaceimpl.inl
- VM\eetoprofinterfaceimpl.cpp
- VM\eetoprofinterfacewrapper.inl
最后,值得指出的是,Profiler API可能无法在.NET Core运行的所有操作系统和CPU-arch上运行,例如Linux上的ELT调用存根问题,有关详细信息,请参阅CoreCLR Profiler API的状态。
分析和调试(Profiling v. Debugging)
除此之外,“分析”和“调试”确实有一些重叠,因此从CLR调试与CLR分析中了解.NET运行时上下文中不同的API提供了什么是有帮助的。
调试(Debugging)
调试意味着不同的事情不同的人,比如我问在Twitter上“ 什么是你调试的.NET程序的途径 ”,并得到了广泛的不同反应,虽然反应两组含有一个很好的工具清单和技术,所以他们值得一试,谢谢#LazyWeb!
但也许这句话最好总结一下Debugging究竟是什么
.NET运行时中的监测和可观测性的更多相关文章
- 【转】Sqlite 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该...
开发环境: vs2010+.net framework 4.0+ System.Data.SQLite.DLL (2.0)今天在做Sqlite数据库测试,一运行程序在一处方法调用时报出了一个异常 混合 ...
- Oracle开始从Java运行时中移除JAR包
早在2012年8月,在Java平台首席架构师Mark Reinhold宣布模块化项目Jigsaw之后不久,JEP 162这一题为“准备模块化”的提案就指出,在Jigsaw项目中为模块化系统开发的代码不 ...
- SQLite.dll混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。
其他信息: V5.7.4.4 Can't find the System.Data.SQLite.dll more info : 混合模式程序集是针对"v2.0.50727"版的运 ...
- <VS2010>混合模式程序集是针对“v2.0”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集
在把以前写的代码生成工具从原来的.NET3.5升级到.NET4.0时,将程序集都更新后,一运行程序在一处方法调用时报出了一个异常: 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有 ...
- Erlang运行时中的无锁队列及其在异步线程中的应用
本文首先介绍 Erlang 运行时中需要使用无锁队列的场合,然后介绍无锁队列的基本原理及会遇到的问题,接下来介绍 Erlang 运行时中如何通过“线程进度”机制解决无锁队列的问题,并介绍 Erlang ...
- 使用 Windows 运行时中异步性来始终保持应用程序能够快速流畅地运行
转自:http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/03/26/windows.aspx 人类的思维方式在本质上不是同步的,这直接影响着我 ...
- VS报错之混合模式程序集是针对“v1.1.4322”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。
看到一个kinect大牛编写的一个水果忍者的体感游戏版本,让我为自己一直以来只用现有的网页游戏来模拟kinect体感游戏控制感到惭愧,没办法,我还是菜鸟.学习一段后自己模仿星际大战这个游戏,自己写了一 ...
- C#连接Sqlite 出现:混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。的解决方案
C#连接Sqlite 出现: 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集.的解决方案 C#连接sqlite数据库代码 ...
- c# .netframwork 4.0 调用 2.0时报错 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。
“System.IO.FileLoadException”类型的未经处理的异常在 XXX.dll 中发生 其他信息: 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的 ...
随机推荐
- mysql输入中文出现ERROR 1366
MySQL输入中文出现如下错误: ERROR 1366: 1366: Incorrect string value: '\xE6\xB0\xB4\xE7\x94\xB5...' for column ...
- VMware workstation创建虚拟机console图文
1. 概述2. 配置入口3. 新建虚拟机向导3.1 类型配置3.2 硬件兼容性3.3 操作系统安装3.4 客户机操作系统类型3.5 客户机的名称位置4. 客户机硬件配置选择4.1 客户机处理器配置4. ...
- java编写词法分析器
词法分析器就是通过扫描一段程序判断是否是关键字.标识符.常数.分界符.运算符.一般分为一符一种和经典五中: 这里我用的是经典五中,此词法分析器是用java编写的: /* 保留字|关键字:1 操作符|运 ...
- 深入解读Service Mesh的数据面Envoy
在前面的一篇文章中,详细解读了Service Mesh中的技术细节,深入解读Service Mesh背后的技术细节. 但是对于数据面的关键组件Envoy没有详细解读,这篇文章补上. 一.Envoy的工 ...
- eShopOnContainers 知多少[6]:持久化事件日志
1. 引言 事件总线解决了微服务间如何基于集成事件进行异步通信的问题.然而只有事件总线正常运行,微服务之间基于事件的通信才得以运转. 而现实情况是,总有这样或那样的问题,导致事件总线不稳定或不可用,比 ...
- 十分钟学会Java8的lambda表达式和Stream API
01:前言一直在用JDK8 ,却从未用过Stream,为了对数组或集合进行一些排序.过滤或数据处理,只会写for循环或者foreach,这就是我曾经的一个写照. 刚开始写写是打基础,但写的多了,各种乏 ...
- 利用策略模式优化过多 if else 代码
前言 不出意外,这应该是年前最后一次分享,本次来一点实际开发中会用到的小技巧. 比如平时大家是否都会写类似这样的代码: if(a){ //dosomething }else if(b){ //dosh ...
- Java进阶篇设计模式之七 ----- 享元模式和代理模式
前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...
- Java 在PDF 中添加超链接
对特定元素添加超链接后,用户可以通过点击被链接的元素来激活这些链接,通常在被链接的元素下带有下划线或者以不同的颜色显示来进行区分.按照使用对象的不同,链接又可以分为:文本超链接,图像超链接,E-mai ...
- Android之RxJava详解
文章大纲 一.什么是RxJava二.为什么要用RxJava三.RxJava使用详解四.项目源码下载五.参考文章 一.什么是RxJava Rx(Reactive Extensions)是一个库,用来 ...