用“忙碌度”来度量设备虚拟化的性能

本文讨论设备性能的一般度量方法,并根据性能判断的基准点是否确定唯一,将设备性能分为外部性能内部性能 两类。

外部性能

我们采用很多方法来量化一个设备的性能,一般是横向比较,也就是运行一些基准测试软件来获得针对指定设备的测试成绩,作为度量设备性能的量化数据。但是,如果只有单个设备的量化成绩,其实作用不大。100分的成绩,对应的性能到底为高、中或低,需要和更多的设备进行横向比较,才能体现出来。业界会针对某类设备,设立若干个性能相关的标杆基准点,来判别不同的量化分数所对应的性能级别。值得注意的是,这个所谓的标杆基准点,可能是有形的数字,但更可能是无形的,由一些评测实验室在他们的评测报告中体现,当一款新的旗舰设备隆重上市后,旧标杆将随之被修正。

换句话说,通过横向比较为来判断性能时,在不同的时间,比较和判断的标杆基准点很可能是不同的。如果你淘了一块心仪已久的两年前的旗舰显卡,欣欣然准备要大显身手的时候,重新评估一下这块显卡在今天的性能地位,发现已经掉档到入门级别了,你可能会大失所望吧。设备本身的性能并未改变,变化的是评判的标准。

硬件生产工艺的进步,会带来设备性能的大幅提升,特别是摩尔定律还在发生作用的年代,这个提升的幅度是指数级别的,非常惊人。影响性能成绩的另一个因素,是测试软件自身的代码演进和优化程度。一个并不罕见的情况是,使用不同的基准测试软件,对不同的设备进行测试,如果这些设备在市场上的目标定位相同,最后的测试成绩很可能互有参差,而不是一边倒地断定出孰优孰劣。在某个测试软件中,A产品领先一些,另一个测试软件中,B产品则略胜一筹。还有一种情况是,将某个基准测试软件版本升级之后,重新测试某产品,可能会发现结果大不相同。再比如,同一块显卡上,使用不同的3D编程接口(如OpenGL、DX或其它),在渲染相同的内容时,性能也可能不同。这是3D编程接口需要不断迭代升级的一个原因,如何通过优化自身的结构,来更好地发挥硬件的有限性能。

软件的编程方式和优化特性的选择,对不同的设备会产生不同的性能表现。

这种通过外部横向比较而产生的性能数据和判断依据,称为外部性能。其典型特征是:性能的判断依据不断变化——主要地,其性能基准点不断地被提高。

内部性能

继续阅读“用“忙碌度”来度量设备虚拟化的性能”

156 total views, 1 views today

GVT对显示引擎的虚拟(2)

引用注明>> 【作者:张佩】【原文:http://www.yiiyee.cn/Blog/

  • 1. GVT对显示中断的模拟
ISR
中断能打断普通线程的执行

显示引擎定义的中断大部分都是通用型的,不同设备厂商开发的不同代产品在工作的时候,都会不断产生这些中断。比如同步中断(v-sync和h-sync)、vblank中断、扫描中断,这些中断和终端显示器对帧囊(FrameBuffer)的处理相关,在数据处理过程中不断地实时产生;以及插拔检测(hot plug detection)中断,当显示器插入或拔出Port的时候产生。显示引擎也可能会定义一些私有类型的中断,因不同的显卡设备而异,比如一些错误检测中断,其实是硬件和软件驱动之间的一种简单的通信机制。

GVT虚拟的显示设备只实现了最基本的功能,所以模拟通用型中断就足够了。实际上,GVT现在的代码只模拟了vblank和flip done两种中断,发现已经能够满足系统驱动和大部分应用软件的需求了。当然这是不够的,已经发现了一些应用软件,依赖于线扫描中断和垂直同步中断,不久的将来,GVT会陆续加入对它们的支持。理想的情况是GVT把所有的通用型显示中断都模拟好,我们不能假设形形色色的应用软件永远不会使用某种通用型中断。 继续阅读“GVT对显示引擎的虚拟(2)”

145 total views, 2 views today

GVT对显示引擎的虚拟(1)

引用注明>> 【作者:张佩】【原文:http://www.yiiyee.cn/Blog/

server-virtualization
这是一幅描绘了平台虚拟化的示意图

GVT是Intel针对集成显卡(IGD)设备实现的虚拟化方案,最近已经被成功地Upstream到了Linux内核4.10中了。所以用户只要拥有一份最新的Linux内核代码或镜像文件,就可以尝试这个很酷的显卡虚拟化功能。但GVT只是一个核心模块,剥离了和具体的系统虚拟化方案的耦合性,所以要想通过GVT来虚拟化你的显卡,还必须结合特定虚拟化平台下的适配模块。GVT本身是平台无关的,它通过一套公共的接口来抽象各种虚拟化平台的功能。

KVMGT是一起被Upstream的另一个模块,它就是在KVM(Kernel Virtual Machine)平台下GVT的适配模块。虚拟软件比如QEMU在KVM平台上,可以通过KVMGT暴露的用户层接口,来创建和维护GVT的虚拟GPU实例。将来,GVT在XEN和其它虚拟化平台下的适配模块,也将会被Upstream到Linux内核中去,不过这需要一些时间和持续的努力。 继续阅读“GVT对显示引擎的虚拟(1)”

111 total views, 2 views today

浅论Intel GPU虚拟化实现方案GVT

引用注明>> 【作者:张佩】【原文:http://www.yiiyee.cn/Blog/

v0.3 (未完成版,慎勿转载)

kvmgt
KVMGT未upstream前的架构图

在最近的Linux内核4.10的发布中,Intel的GPU虚拟化方案(GVT)完成了代码上传,从此成为Linux内核的一部分。GVT在4.10的发布文档中,作为主要的新特性之一而被发布者隆重地介绍。在过去的两年中,我作为一名开发者,参与到了GVT的开发过程中。对此重大里程碑事件深感欣慰。将陆续写作一些文章,对Inte的GPU驱动和虚拟化实现,进行由粗入细的介绍。

我近来对于一些计算机术语,产生了一点个人趣味上的偏好,细节在此不能备述,容后专文细讲。这里就两个用惯的术语,要在文章中,做很大的习惯上的改变,读者可能会觉得很不适应。无法,我确定了要这样做,只能请读者忍耐。

术语新译
Context:境(一般译作:上下文)
Execution Context:执行境
Hardware Context: 硬境
Logic Context:拟境
buffer:囊(一般译作:缓冲区)
Ring buffer:环形囊

继续阅读“浅论Intel GPU虚拟化实现方案GVT”

236 total views, 12 views today

网络内核调试的春天

今天试了两个虚拟机,virtualbox和vmware player,看能不能支持网络调试。结果非常满意,两个虚拟机软件默认配置的虚拟网卡,都能用于建立网络内核调试连接,我三下两除二地,就把内核调试给建立了。vmware中的网卡设备是82574L Gigabit NIC,设备ID是8086/10D3。VirtualBox中的网卡设备是Pro/1000 MT(即颇为经典的E1000系列),设备ID是8086/100E。检查Windows网络内核调试所支持的NIC列表,发现这两块网卡,都在被支持的列表中。链接:Supported NIC for network kernel debug。

不同的虚拟机软件配置其虚拟网卡的方式不尽相同,我比较喜欢VirtualBox,它直接提供了一个可选列表框让用户选择,默认是Pro/1000 MT。VMWare Player则没有类似的接口,但我查看了网上的一些资料,用户也可以通过直接修改配置文件的方式,配置虚拟网卡的类型。 继续阅读“网络内核调试的春天”

136 total views, 2 views today

全局观Windows BCD

引用注明>> 【作者:张佩】【原文:http://www.yiiyee.cn/Blog/
v1.0
BCD Objects
  • 引入BCD

系统启动是一件困难的事情,面对困难,在实现的时候尽量简单化,是个保守而易用的原则。所以Windows系统最初的启动配置文件是一个文本格式的文件(boot.ini),系统启动管理器通过解析文本内容,提取启动参数。

启动配置数据(Boot Configuration Data,简称BCD)是在Vista的时候引入的新机制,目的是希望把启动弄得复杂一点——不不,抱歉我说反了,目的是用一个综合而安全的方案,满足日渐复杂的启动需求。更进一步说,BCD的引入是希望把现存和可能的多种启动方式,和系统启动过程的扩展和配置需求,集成在统一的接口中进行管理和使用。这个统一的配置接口能够覆盖各种需求,包括不同的启动方式,支持休眠与唤醒,实现系统的回退安装,支持启动初期的硬件检测等。

人们对BCD的态度褒贬不一。从肯定的方面看,当一个事物的复杂性增加时,换用更灵活的手段对它重新管理和呈现,是发展的必然。就好比从蜗居换入广厦,室内装修和布置方案,自然是可以大作改观的。从批评的一方看,很多开发者认为,BCD以元数据的方式保存配置信息,数据本身不具有可读性,同时BCD的结构设计得相当复杂,对于学习和使用都缺乏亲和性。他们一致的看法是,虽然boot.ini简陋,但BCD却过于激进,更受青睐的方式是grub方式的配置文件,grub是一种在Linux系统上被广泛使用的启动管理器,其配置文件是文本文件格式的,可直接使用文本编辑器进行编辑和查看,同时还达到了功能完备的目的。

纷争虽然存在,但学习是唯一手段。作为既成的事实,BCD在Windows系统上的重要性业已根深蒂固,如此重要的系统基础设施,已经没有推翻重来的可能性。

继续阅读“全局观Windows BCD”

186 total views, 2 views today

我后十年的技术路

过去一年我是比较地迷茫的,这种迷茫是源于我对过去十年工作的反思,一种无意义的反思。

过去十年,我的主要工作是在Windows系统环境下编写内核驱动,我几乎涉及过80%的驱动类型,并在后四年里专门做图形显示驱动。另一项主要的工作内容是软件调试,在AMD工作时,我每个礼拜要至少完成3个debug任务;我每年都会遇到一两个特别奇怪而紧急的问题,最后通过艰深困苦的汇编调试,证明是微软的代码bug。

时间促使我反思,在长久的埋头苦作后,我灵光一现地抬起头来,发现自己做的所有工作,好像都只是皮毛和外表。我做不到以三言两语来描述通常要长篇大论描述的问题,因为我尚被无数的细节所羁绊,远未能抵达其核心。事物的真实面貌并没有被真实展现,我看到的只是包装过的模样,尚不了解它的骨肉和肌理。 继续阅读“我后十年的技术路”

1,373 total views, 10 views today

GPU异步V-Sync技术方案

引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog

2014年中,我在公司内部提交了一个名为“异步Timing”(又名“异步V-Sync”)创新方案,用于解决GPU使用V-Sync同步所导致的问题。但十分可惜的是,Intel的创新审核委员没有通过我的方案,只礼貌性地回了一封感谢邮件。这件事情本来尘埃落定,我已不作多想。但最近很多IT新闻介绍了AMD在今年CES上所展示的一项FreeSync技术,惊喜颇多。我发现AMD的FreeSyn技术所要解决的问题和采取的策略,与我的“异步Timing”的设计方案十分相似。我写作此文,向大家介绍V-Sync的基本概念和产生的问题,以及异步Timing方案的细节。

在计算机图形显示系统中,这几个概念是相互关联的:Timing(时序),V-Sync(垂直同步),Refresh Rate(刷新率)。它们是从同一个地方衍生出的概念:Timing Controller(时序控制器,简称T-Con)经过配置后产生连续的Timing时序,Timing时序决定了何时会产生一个V-Sync中断;显示器每收到一个V-Sync中断,便开始一次显示刷新;显示器每秒刷新的次数就对应了它的Refresh Rate(刷新率)。 继续阅读“GPU异步V-Sync技术方案”

220 total views, 2 views today

Windows安全软件的思考

引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog

最近以来,我重新翻阅了几本Windows系统下的安全类书籍,同时上网查阅资料,很意外地发现,很多几年前流行的牛叉技术,虽然还在书本和网页上历历在目,但实际上多数已不能在新系统中使用了。我由此也发生了一些个人的思考,虽然多年不接触安全技术,但思考的能力还在。

分析安全问题的来源

总是因为存在安全隐患,才有了攻击动作的发生而因为有了大量的攻击,才继而产生了安全防护的需求。所以一定要研究安全隐患的来源。总体上分类,安全问题可以划分为本地和分布式两种,所以安全攻击的方法也可以分为本地攻击和分布式网络攻击。

先看存在于本地机器上的安全隐患,也就是在一台安装了Windows系统的PC机内部的安全隐患,把它分成下面两类:

第一类,是OS架构本身存在的结构性的设计缺陷或不周到,从而导致了被后门软件利用,并据此发动的针对本地资源的攻击。这些不周到主要体现在OS为一系列的Hook技术提供了便利。存在于Windows系统上的Hook技术,从1990年代以来就一直很热门。概言之,它包括静态修改二进制文件和执行时动态修改运行逻辑这两种方法。 继续阅读“Windows安全软件的思考”

81 total views, 1 views today

多了一个“星号”

引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog

国庆假期我看WDK 8.1中的sample项目,遇一极有趣问题,和基本的指针使用有关,特缀文于此。请看下面是WDK8.1 msplot项目中的一段代码(经我简化过),三行而已,作一个减法运算。注释中的例值,其期望结果应是0x10,但意外得到一个溢出后的大值:

/* struct _PLOTGPC                      */
/* {                                    */
/*  //...                               */
/*  LPVOID pData;                       */ 
/* };                                   */

LPBYTE *pByte = pPlotGPC->pData; // pByte:0x0040fa30
pByte -= (ULONG_PTR)pPlotGPC;    // pPlotGPC:0x0040fa20
pPlotGPC->pData = pByte;         // 结果:0xff3d11b0

继续阅读“多了一个“星号””

85 total views, 1 views today

假货泛滥是淘宝的毒瘤

引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog

我前段时间装修房子,好几个月都没有更新博客。但手里却已经积攒了十多个可供写作的dump文件。现在终于用空了,再次面对word文档敲击键盘时,我却并不急于去分析任何一个dump文件,而要来谈谈淘宝网。有一件发生在眼前的事情,勾起我的一些思考,使我要发挥一番。

买到假货

我前天在天猫上买了一根USB转串口线(商品link)。这是一种很简单的线材,把电脑上的USB口转成串口输出,或把外部串口转成USB输入。串口这种古老的接口,在上世纪曾广泛使用,但进入新世纪后就逐渐被USB接口代替而几乎销声匿迹。如果不是因为一些很传统的需求,现在已很少有它的用武之地。仅在一些特殊的应用领域,串口仍被某些设备所使用,比如老式的打印机、Modem以及串口调试等。现在的常用方式是把USB口转成串口并连接串口外设,这需要通过一根内含转换器的线缆来实现,也就是我买的这根线。

我在购买时特地只选了天猫店铺。这种线缆实现很容易,所以价格不贵,30元以内。我选择了一家地址显示为苏州的店铺,希望早点寄到。快递隔天即送到了,我对此很满意。包装不是密封的,我取出线缆,把USB口连接到电脑上并安装驱动,进行测试。我本以为这么一根简单而廉价的线缆,奸商们必不太愿意对它大费周章吧。但我却想错了。我晦气临头,发现自己买到了假货。 继续阅读“假货泛滥是淘宝的毒瘤”

131 total views, 1 views today

Win32K里的死循环

引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog

这是我到新公司后上手的第一个issue。一线工程师找到我,说有一个urgent issue有没有兴趣看一看。当时他已经组织了一个team的人帮助他,我便成了其中一员。

问题确实很紧急,已经影响了产线的生产。当时正临清明假期,导致很多人都岌岌可危地面临清明加班的可能。其实这个问题已经报出来好几个月,但一线工程师一直以绥靖政策对待,以各种方式把问题发生率降低到客户接受的水平。绥靖政策长时间以来是有效的,但最近却突然失效,发生率飙升到了20%。一线工程师才真的着急了。

问题定性

组一个team的人debug同一个问题,在我以前是未曾经历过的。初始的想法当然是认为人多力量大。但真正实施的时候,也可能遭遇人多嘴杂的窘况。 继续阅读“Win32K里的死循环”

140 total views, 1 views today

奇妙的系统性能问题(2)

引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog

这篇文件是对上一篇《奇妙的系统性能问题》的补充。我在经历那次性能陡降问题困扰的过程中,还碰到了一次BSOD。当蓝屏发生的时候,我甚至是兴奋的。因为在此之前,我一直都认为问题是系统或软件模块导致的。而蓝屏正好是分析的切入点。所以当分析了这个dump后,我立刻扭转了方向,判断认为:确实是磁盘坏了。

这个结论是正确的,但却不完备的。因为最后的结果是磁盘并没有坏,而是受到了外部环境的干扰。

这个dump文件弥足珍贵,因为正常情况下,这种伤硬盘的实验我们是不会主动去做的。所以这个dump文件完全得于碰巧,在此进行分析。 继续阅读“奇妙的系统性能问题(2)”

131 total views, 3 views today

奇妙的系统性能问题

引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog

在前一家公司时,我借了一台测试板用于开发和测试。这块板子在正常运行了一段时间后,忽然遇到持续性的系统性能问题。问题来得非常突然,是某一天早晨上班的时候突然发生的。像电影里面马师爷抱怨的那样,吃着火锅还唱着歌,就突然遇到劫道的了。都太突然了。

问题的特征非常明显,就是系统性能无限下降。登录到系统登录界面,往往要十几分钟。Win 8.1的Metro UI出来,又要若干分钟时间。所以常态下看到的界面,就是Metro UI上面一个个磁贴只有边框,图标内容则完全没画出来。 继续阅读“奇妙的系统性能问题”

100 total views, 1 views today

VS2012开发驱动小Tip之:更改KMDF版本以支持XP系统

我的印象中,我最早使用的KMDF版本是1.5,那是Vista出来的时候,时间大概2006年左右。KMDF的版本变更并不是很快,总是伴随着WDK的发布而更新的,而WDK版本的更新,一般又是和OS同步的。KMDF的主版本还是1,但次版本号总是以2递增:1.5(Vista)、1.7(Vista SP1)、1.9(Win7)、1.11(Win8)、1.13(Win8.1)

早期的KMDF版本保持了良好的向后兼容性,比如用最晚KMDF 1.9编译出来的驱动程序,可安装使用于XP系统*。但从下图(MSDN)可以看出,从KMDF 1.11开始,情况变化了。KMDF 1.11取消了对Vista以前系统的支持。而KMDF 1.13更绝,编译出来的驱动只能安装在Win8.1上。 继续阅读“VS2012开发驱动小Tip之:更改KMDF版本以支持XP系统”

434 total views, 4 views today

虫趣:当NV显卡驱动碰上Verifier

引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog

今天开电脑的时候,刚完成用户登陆,就遇到一个蓝屏。桌面还没有进去呢。趁着系统正处于抓取dump文件的过程中,赶紧拍了一张照,留作纪念。造成蓝屏的不是别人,乃是负责图形渲染和显示的显卡驱动:Nvidia显卡驱动。

我使用的系统:Win Blue x64。

0xc4

继续阅读“虫趣:当NV显卡驱动碰上Verifier”

253 total views, 4 views today