Enterprise Just Builder

Solution for Enterprise Software Architecture

调优与调试

Xperf 高手训练营 (1): NetTCPPortSharing 和 NLA Services 导致系统启动缓慢

本系列文章将通过一些现实生活中的例子来展示如何用 Xperf 工具来诊断一些常见的性能问题,并如何实现系统优化的。1

我们的第一个案例是某台笔记本花了2分钟才能显示出正常的桌面。要加速启动速度,我们必须先了解问题出在哪里。所以首先需要抓取系统痕迹(trace),xbootmgr 工具适用于系统开关机的场景,其命令如下:

xbootmgr -trace boot -traceFlags Latency+DISPATCHER -postBootDelay 120 -stackWalk Profile+ProcessCreate+CSwitch+ReadyThread+Mark+SyscallEnter+ThreadCreate

注意这里的 -stackwalk 开关。 stackwalking 使得我们可以在痕迹中查看模块以及函数调用。对于 64位机器,在收集痕迹文件之前,须先禁止执行换页以防部分内核被换出。你可以执行以下命令来达到这一目的。

Reg.exe add “HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management” -v DisablePagingExecutive -d 0x1 -t REG_DWORD -f

收集好痕迹文件,接着打开 Performance Analyzer。Performance Analyzer (又称 xperfview) 是用来分析 XPERF 痕迹的工具。它是 Windows 性能工具箱(Windows Performance Toolkit) 中的利器,该工具箱是 Windows SDK 的一部分。

 

, ,

Windows 调试集锦 <1>

调试 WinLogon1
WinLogon 是一个用户模式进程,负责处理用户登入登出的交互任务,以及处理 CTRL+ALT+DELTE。要调试 Winlogon 最简单的办法是使用 NTSD 然后通过内核调试器来控制并调试。

首先要解决的是如何将用户态调试器 NTSD 的输出重定向到内核调试器,为此需先配置内核调试连接。详细可以参考[2. Controlling the User-Mode Debugger from the Kernel Debugger[

其次需要修改注册表,这样 Winlogon 进程一开始启动就可被调试。注册表键值如下:

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\WinLogon.EXE]
"Debugger"="ntsd -d -x -g"

The -d option passes control to the kernel debugger. The -x option causes the debugger to capture access violations as second-chance exceptions. The -g option causes the WinLogon process to run after the attachment. Do not add the -g if you want to start debugging before Winlogon.exe begins (for example, if you want to set an initial breakpoint).

In addition, you should set the GlobalFlag value under the winlogon.exe key to REG_DWORD “0x000400F0”. This sets heap checking and FLG_ENABLE_KDEBUG_SYMBOL_LOAD. However, since this second flag only affects the kernel debugger, symbols must also be copied to the target computer before starting the debugger.

>>> 阅读全文

 

用 IDA Windbg 调试器实现 VMWare 上的 Windows 内核调试

文章评价:
IDA 是交互式反汇编器(Interactive Disassembler)的简称,它由总部位于比利时列日市(Liège)的 Hex-Rays 公司的一款产品。IDA是一种递归下降反汇编器。其主要优势在于呈现尽可能接近源代码的代码。它不仅使用数据类型信息,而且通过派生的变量和函数名称来尽其所能地注释生成的反汇编代码。这些注释将原始十六进制代码的数量减到最少,并显著增加了向用户提供的符号化信息的数量。

和 Windows 原生的调试器 windbg 相比, IDA 可以将程序结构和算法的核心以类似 C 语言的形式呈现,因此更容易通过阅读代码来定位问题的所在。

本文将介绍如何透过 IDA 的 Windbg 插件来实现 Windows 内核调试。

使用 WinDbg 进行 Windows 内核调试通常需要两台计算机,一台称为Debuggee,即目标机,另一台作为 Debugger,也称为主机 HOST。

目标机可以是物理机或虚拟机。如果是物理机,那么该机器至少需要一个串口、1394口或者支持 USB 调试的 USB 端口,另外你还需要与对应的调试连接线,如串口线、1394总线、USB 2.0 或 3.0 调试线等等。 Windows 8 之后的操作系统,普遍使用 USB 3.0 端口进行调试,通过 USBView 工具查看目标机,可以确定机器上哪一个 USB 端口支持调试。

>>> 阅读全文

 

, , , ,

优化Cyberlink PowerDVD 10* 以提高电池续航时间

电池续航时间不足是困扰移动设备和超级本(包括平板)用户的诸多严重问题之一。用户已经习惯从云端的内容服务器“按需”获取流媒体到移动设备当中。由于这些设备的电池容量有限,提高能源效率凸显重要。 Cyberlink PowerDVD 10* (PowerDVD*) 是业界顶尖的高清电影和 3D 电影播放软件之一。该应用也是 OEM 最经常预捆绑的软件之一。在本案例研究中,我们将展示英特尔是如何与 Cyberlink 合作,使 PowerDVD 在 Intel 设备上可以提供同类最佳的使用体验。1

首先,我们将讨论 Cyberlink 在 PowerDVD 中加入流媒体功能时遇到的挑战,以及 Intel 用来改善 PowerDVD 功耗所使用的工具。

接着,我们将讨论 Cyberlink PowerDVD 流媒体应用对电力消耗的影响概况以及对移动设备的电池续航时间的影响。我们还会对 PowerDVD 的行为进行分析以找出症结,如 CPU 解码、大量的上下文切换、 高中断频率等,这些都会导致功耗的增加。最后,我们会用数据来显示优化后所减少的电力消耗。

这次优化是一次巨大的成功。 Intel 团队在以下方面对 PowerDVD 进行了诸多改善:

  • 在播放媒体时 Package C0 从 100% 减少到 20%
  • 借助 Intel Power Gadget SoC 功耗从约 6 瓦减少到约 1.8 瓦
  • Intel VTune analyzer 所报告的 CPU 占用率从 70% 减少到 25%
  • Windows 性能分析工具显示 frequent wakeups (5 Msec) vs. 10 msec wake up frequency for local or streaming media playback frequency of 10%.

一些缩写

>>> 阅读全文

 

,

设备节点和设备栈

在 Windows 中,设备被表示为即插即用 (PnP) 设备树中的设备节点(device node)。通常当 I/O 请求被发送给设备时,多个驱动程序会帮助处理该请求。这些驱动程序中的每一个都与一个设备对象相关联,这些设备对象在栈中进行排列。设备对象的顺序与它们的关联驱动程序一起被称为设备栈(device stack)。每个设备节点都有自己的设备堆栈。1

设备节点和即插即用设备树
Windows 在称为“即插即用设备树”(或简称为“设备树”)的树结构中组织设备。 通常,设备树中的节点表示某个设备或者复合设备的某个独立功能。 不过节点也可以表示与物理设备无关软件组件。

设备树上的节点称为“设备节点”。设备树的根节点称为“根设备节点”。约定俗成地,根设备节点被绘制在设备树的底部,如下图所示。

设备树说明了 PnP 环境中固有的父/子关系。设备树中的一些节点用来表示连接有子设备的总线设备。例如,PCI 总线节点表示主板上的物理 PCI 总线。在启动过程中,PnP 管理器请求 PCI 总线驱动程序枚举连接到 PCI 总线的设备。这些设备被表示为 PCI 总线节点的子节点。在上图中,PCI 总线节点包含一些子节点,这些子节点用来表示连接到 PCI 总线的一些设备,其中包括 USB 主控制器、音频控制器以及 PCI Express 端口。

有些连接到 PCI 总线的设备也是总线。PnP 管理器请求这些总线中都枚举与之连接的设备。在上图中,我们可以看到音频控制器是连接有音频设备的总线,而 PCI Express 端口是连接有显示适配器的总线,该显示适配器则是连接有两个监视器的总线。

>>> 阅读全文

 

, , , ,

Windows 调试教程 (一) 用 CDB 和 NTSD 开始调试

对于软件开发和维护来说,调试是最有价值的技能之一。它贯穿于产品整个生命周期中的每个阶段。从创建项目伊始开发人员就会遇到 bug,bug 可能是逻辑错误、语法错误又或者是编译器错误,bug 随处可见。在软件质量验收阶段也可能会遇到 bug ,因为这时引入了更多高级测试场景,还需要和其他环境进行交互。最后,产品发布后还需获得技术支持。即使用户拿到软件后,调试还要继续,因为用户一旦遇到 bug 就会上报给公司,这时还是要再次进行调试。

本教程的目的是什么?
本教程只是对调试做一些简单介绍,可以归类为”初级教程”,如果大家的反映还不错,我会续写更多的章节。

对于调试这个话题来说,实在有太多复杂技术,所以很难知道要从哪里开始着手。我会试着从基础讲起,带着你熟悉调试。希望这样能将初、中级程序员带到高级调试的世界中。所谓 “高级”调试,是指调试时基本上无需重编译,也无需用对话框或 printf 语句来输出调试信息。

调试器与操作系统
微软随着每版 Windows SDK 都提供了最新的调试器,目前最新版本是 Windows 8.1 SDK ,你可以从微软站点上下载。

CDB, NTSD 和 Windbg
本文适用于 Windows 2000 以上的操作系统。我们将谈论三种调试器: CDB、 NTSD 和 WinDbg。一旦安装完 SDK 之后,这三个调试器也就随之安装。

>>> 阅读全文

 

, , , , ,

逻辑地址,线性地址及物理地址的区别

逻辑地址转线性地址

机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过 MMU (CPU中的内存管理单元)转换成物理地址才能够被访问到。

我们写个最简单的 hello world 程序,用 gcc 编译,再反汇编后会看到以下指令:

mov 0x80495b0, %eax

这里的内存地址0x80495b0 就是一个逻辑地址,必须加上隐含的 DS 数据段的基地址,才能构成线性地址。也就是说0x80495b0是当前任务的DS数据段内的偏移。

在x86保护模式下,段的信息(段基线性地址、长度、权限等)即段描述符占8个字节,段信息无法直接存放在段寄存器中(段寄存器只有2字节)。Intel 的设计是段描述符集中存放在GDT或LDT中,而段寄存器存放的是段描述符在GDT或LDT内的索引值(index)。

>>> 阅读全文

 

Windows事件追踪入门与使用方法

文章评价:
大多数 Windows 开发者或多或少都知道 Windows 事件追踪(Event Tracing for Windows,ETW),ETW 是由 Windows 操作系统提供的一种通用的,系统开销较低(与性能日志和警报相比)的事件追踪手段,用以监控具有负载的系统的性能, 它在内核中运行,可以追踪用户模式应用程序、操作系统内核和内核模式设备驱动引发的事件。此外,ETW 还能够动态地启用或者禁用日志记录,便于进行详细的追踪,而无需重新启动操作系统或者应用程序。
一些操作系统核心组件和第三方应用程序使用 Windows 事件追踪来提供事件日志记录和追踪。

ETW 是随着 Windows 2000 中第一次出现在其发布版本中的,对于后续的 Windows 来说, ETW 已经是内置工具。

ETW的架构
ETW 主要包含四种类型的组件,其核心体系架构如图1-1 所示:

  • 事件提供程序
  • 控制器
  • 使用者
  • 事件跟踪会话

事件跟踪会话(Session) 负责缓存和日志记录,会话接受事件并创建一个跟踪文件。ETW 会话可以使用多种日志记录模式。例如,可以对会话进行配置,直接向使用者应用程序传送事件,或在文件达到特定大小时通过回绕在某个文件中重写旧事件。为每个会话创建的单独写线程会将这些事件刷新到文件或实时使用者应用程序中。如果要实现高性能,还可以使用每服务器的缓冲区,这样无需在日志记录路径中设置锁定。

事件提供程序 (Provider)指的是一种可以将事件写入 ETW 会话的逻辑实体。任何可记录的重要活动均可作为事件,每个活动由记录到 ETW 中的一个事件表示。事件提供程序可以是用户模式应用程序、托管应用程序、驱动程序或任何其他软件实体。唯一的要求是,事件提供程序必须通过注册 API 向 ETW 注册一个提供程序 ID。提供程序首先向 ETW 注册,然后调用 ETW 日志记录 API 如EventWriteEx, EventWriteString 或者 EventWriteTransfer 写入来自代码内多个点的事件。

>>> 阅读全文

 

, , ,

XPerf — Windows Performance Toolkit 使用简介

文章评价:

从 Windows 2000 开始,Windows 中就带了事件跟踪机制。所谓事件跟踪,是一种从各种系统组件触发事件的基础设施,只为少量的内核模式下的实体所使用。在 Windows XP 中, MOF 文件 (与 WMI 提供程序的元数据类似)被用来描述事件。在 Windows Vista 和 Windows Server 2008 中,事件用 XML 装配清单来描述事件,这个设计使得 ETW 的使用更为普遍,成百上千的新的事件提供程序( Event Proivder ) 被添加到系统中。

这些提供程序会产生什么信息呢?首先, Windows事件日志(Windows Event Log) 使用这些 ETW 提供程序生成的一部分信息(但不是全部)。因此可以获得有关系统事件的各种诊断消息。另一个提供程序是性能监视器(Performance Monitor), 特点是能够查询成组的 ETW 事件。将这些不同源的信息组织在一起并不是件容易的事。尤其利用同样的跟踪,在对系统的整体的分析和对某些特定应用的分析中不断切换的时候。

这种整合的需求最终导致了 Windows 性能工具包(Windows Performance Toolkit, WPT) 的诞生,它致力于数据收集和集成,是正确地解释和利用 ETW 输出不可缺少的工具。特别的是,它能用一致的方式查看大量的信息,让你能够对系统内正发生的事情有一个整体印象。另外,通过利用内核采样中断,你可以使用全局的采样事件探查器 (包括调用堆栈分析)。更棒的是,它是完全免费的。

下面让我们来看看 WPT 的功能。从 Windows 7 开始,WPT 被包括在 Windows SDK 中,你需要下载 Windows SDK 并安装它。

>>> 阅读全文

 

, , , , , , , ,

GPUView 的使用

文章评价:
GPUView 是我(原文作者: Matt )和 Steve Pronovost 在微软实习期间开发的工具,该工具可以用来检查电脑上的图形应用程序、Windows 图形内核、 显卡驱动程序、 显卡和 CPU 内核间的交互。和一些标准分析工具 IceCap、Vtune 或图形 API 分析工具如 PIX 不同,该工具的视角别具一格,它密切关注 CPU 和 GPU 间的交互,从而判断应用程序的性能是受限于 CPU 、GPU 或者二者,进而了解需要对哪一部分进行调整才能提高资源利用率。

GPUView 可以帮助我们解决以下问题:1

  • 为什么会错过垂直同步刷新?
  • 在 GPU 渲染新的图形表面是否占住了 GPU 导致帧丢失?
  • 是应该优化 CPU 代码来改善性能,还是应该降低 GPU 负担?
  • 在显示帧之间 GPU 是否已经早早收到图形任务,还是 GPU 一直空闲在那里等待 CPU 代码?

在本文的第一部分我们会关注如何使用并了解 GPUView ,在文章的第二部分我们会看一些实际的例子,学习用 GPUView 来查看某些实际游戏的性能问题。

GPUView 是 Windows 7 SDK 的一部分。下载并安装好 SDK 之后,你可以到“ C:\\Program Files\\Microsoft SDKs\\Windows\\v7.0\\bin” 目录下执行 wpt_x64.msi 或者 wpt_x86.msi 来安装带有 GPUView 的 Windows Performance Toolkit。

要使用 GPUView,你需要用管理员权限打开命令行,然后运行 Log.cmd 来启动事件日志。再次运行 Log.cmd 就会停止日志记录。Log.cmd 会生成 Windows 的几个事件跟踪 (*.etl) 文件;这些不同事件流会被合并到单个文件中,即 Merged.etl,GPUView 会读取该文件。下面是一些示例事件:

>>> 阅读全文

 

, ,

使用 ETW 改善调试和性能优化

当下的软件系统正变得日益庞大复杂,随之对软件的开发和管理就成为了一项艰巨挑战。此外,不同的硬件组合和工作负载特征也增加了各种软件故障诊断的难度。因此,可靠性和可管理性本身成为重要功能也就不足为奇了。而正是这些功能催生了对软件检测的需求。

在软件执行过程中,针对某些关键错误状态添加智能检测手段可以极大地缩短故障调试时间。在其他某些方面,检测也是非常有用。如在企业环境中,需要对大量计算机的软硬件故障和资源冲突等不良情况进行监视并采取措施。此外,检测还非常有助于解决性能问题,因为性能问题对于外部的工作负载、配置参数以及底层硬件和软件状态都十分敏感,所以诊断起来比较困难。当性能下降时,有关人员可以根据实际工作环境的追踪文件(trace) 来确定性能不佳的组件或服务,或者发现开发阶段未预见到的性能瓶颈。最后,IT 专家可以使用各种管理工具从事务追踪中得出资源使用率的统计数据用于容量规划和趋势分析。

Windows® 事件追踪 (ETW) 是操作系统提供的一个追踪工具,具有高速通用的特点。它使用内核中的缓冲和日志记录机制,追踪用户模式应用程序和内核模式设备驱动程序所引发的事件。此外,你可以动态地启用和禁用 ETW 日志记录,从而轻松地在生产环境下进行详细追踪,而无需重新启动系统或重新启动应用程序。日志记录机制使用每处理器独立的缓冲区,通过异步写线程将这些缓冲区写入磁盘,从而将写入事件对大规模服务器应用程序的干扰降至最小。

最初引入 ETW 的操作系统是 Windows 2000。自此开始,各版本操作系统和服务器组件开始纷纷采用 ETW 对其活动进行检测。现在,ETW 已成为 Windows 平台中的主要检测技术之一。越来越多的第三方应用程序也开始采用 ETW 进行检测。ETW 还被提取到 Windows 预处理器 (WPP) 软件追踪技术中,为追踪类似“printf”样式的消息提供了一组简单易用的宏,以便用于开发过程中的调试。

在 Windows Vista™ 上,ETW 发生了改头换面的变化,其中最重大的变化之一就是引入了统一的事件提供者模型和 API。简而言之,新的统一 API 对追踪结果进行日志记录并将结果写至事件查看器,为事件提供程序提供了一种一致的、简单易用的机制。同时,还添加了一些用于改善开发人员和用户体验的新功能。在本文中,我们将介绍新的 ETW 提供程序模型,并为大家讲解开发人员应如何在基于 Windows Vista 的应用程序中采用这一新模型。

>>> 阅读全文

 

, ,

Windows 开/关转换性能分析

简介
Windows 开/关转换(即启动、休眠、关机过程)的性能对用户体验是至关重要的,因为它提高了用户对计算机的感受程度,并提供一致的开/关机体验。

对于以下的用户场景,开/关机转换性能非常重要:

  • 用户将硬件和操作系统的启动时间作为主要的性能指标。
  • 系统更新可以保护 Windows 用户并及时引入新功能,但用户对漫长的更新和重新启动周期感到沮丧。过长的关机时间会让用户感到烦躁,并增加了系统管理员的服务时间。较长的关机时间,也对移动系统的可靠性产生不利影响,例如增加了因电力不足而意外关机的风险。
  • 移动用户希望他们的计算机的能迅速转换到睡眠状态。睡眠性能对保持数据的完整性是非常重要的。如果从休眠状态恢复的时间太长,用户将忽略睡眠功能,而是直接关闭计算机。

本文会详细介绍 Windows 的开/关转换,重点介绍每个转换阶段的性能漏洞,并展示了如何通过使用 Windows 性能工具包(WPT)识别和分析这些问题。性能分析往往是必要的,因为诸如应用程序、驱动程序、服务和设备等这些系统扩展,如果没有经过优化,都会对开/关转换时间产生负面影响。优化不良的系统扩展通常由下面原因导致:

  • 延迟
  • 缺乏并行
  • 过多的资源消耗

本文可以帮助用户大大减少开/关转换时间。我们将这些性能优化应用到了实验室的许多系统上,在一些系统中,启动到桌面的时间减少了将近50%。某些系统上,开机时间减少到 40 到 50 秒。但是转换过程中的驱动程序,服务,或应用程序的影响是各不同的,因此你的测试结果也不尽相同。

表1是某四台真实机器的 Windows 7 的启动时间。这一数据显示了从BIOS POST 结束后到 Post Boot 阶段(系统空闲状态)所经过时间。启动阶段在本文后面的“引导转换”一节中会进一步说明。

>>> 阅读全文

 

, , , , ,

了解Linux操作系统 (一)进程管理

文章评分:

前言
Linux 是一种由全世界开发者共同开发的开源操作系统。其源代码可以自由获取并可以在 GNU GPL 授权下使用。有很多公司提供不同的系统发行版供用户使用,如Redhat和Novell SUSE。大部分桌面发行版都可以从网站上免费下载,但服务器版一般是需要购买的。

在过去的几年里,Linux 被世界上许多公司的数据中心所使用。如今 Linux 操作系统为科学领域和企业用户所认可。它已经成为一种多种用途的操作系统。你能在多种嵌入式设备中发现它,如:防火墙、手机或电脑主机。所以 Linux 的性能对于科学领域和企业用户来说已经成为一个热门议题。然而一个操作系统可能被用来计算全球的天气预报或者被用来运行数据库等多种用途,Linux 必须能够为各种可能的使用情境提供优良性能。大多数 Linux 发行版含有常规的调校参数来满足所有用户。

IBM 意识到作为一种操作系统,Linux 非常适合在 IBM 系统之上运行企业级应用。大多数企业应用现在都可以运行在 Linux 上,包括文件服务器、打印服务器、数据库服务器、Web服务器、以及沟通和邮件服务器。

在企业级服务器运行 Linux 时需要对其性能进行监控,在必要时需要对服务器进行调优以消除影响用户的性能瓶颈。本红皮书将介绍一些调优 Linux 的方法、监控分析服务器性能的工具、以及对于特定应用的关键性能参数。本文目的是说明怎样分析和调校 Linux 操作系统,从而为在系统上运行的各种不同应用提供优良的性能。

>>> 阅读全文

 

, , , , ,