华为dtrace是什么文件|如何选择一个 Linux Tracer

A. 甲骨文收购sun会对java的广泛应用产生影响吗

4 月20日,Sun 公司董事会通过决议,同意以每股9.5美元的价格将公司出售给Oracle。虽然还有一些必要的审查和手续,但是两家公司的合并,看起来是不可避免的了。一时间,很多IT领域的朋友众说纷纭,对Sun 公司各种产品和技术的前途提出种种预测。在这里我个人就Sun 公司软件部门的一些产品和技术(包括Solaris数据库,Java编程语言,MySQL数据库等等)的未来发表一点看法。需要说明的是,虽然我个人在 Sun 公司工作,但是并没有任何机会接触到公司决策层的任何相关资料。因此,在本文中出现的所有观点,仅仅是我个人的观点,而不是我的雇主Sun 公司的观点。 Solaris操作系统 在Oracle与Sun 公司共同发表的新闻稿当中指出:Sun 公司所拥有的Java语言和Solaris操作系统是“根本性的长期战略优势”。Solaris操作系统对于Oracle的重要性,由此可见一斑。 作为一家数据库厂商,Oracle做梦都想要拥有自己的操作系统。在没有自有操作系统的情况下,唯一的选择就是全面支持市面上各种操作系统,根据市场的变化来调整不同操作系统的优先级。2000年之前,Sun 公司正如日中天,在金融、电信、能源等多个关键性领域的装机量排名第一,因此Oracle选择将Solaris作为优先考虑的操作系统。2001年前后,GNU/linux在服务器端的性能已经相当出色,可以运行在价格低廉的x86处理器上,能够方便地从网络上免费下载到安装文件。更重要的是,大量向往自由的技术人员通过各种渠道分享经验,在网络上很容易找到与GNU/Linux相关的各种文档。与此相反,Solaris需要运行在昂贵的 UltraSparc处理器上(当时x86版本的Solaris 8已经可以免费下载,但是还远远没有达到健壮实用的程度),安装过程烦琐复杂,系统管理员还需要经过Sun 公司的专门培训。随着互联网泡沫的全面破灭,企业对信息系统的性价比提出了越来越高的要求。在这种情况下,Solaris的新增装机量开始下降,无须财务主管审批即可立即部署的GNU/Linux开始占领数据中心。Oracle敏捷地注意到了这个趋势,于2002年推出了名为“坚不可摧的 Linux”(Unbreakable Linux)的客户支持计划,开始向GNU/Linux倾斜。需要注意的是,“坚不可摧的Linux”并不是一个新的GNU/Linux发行版,而是指 Oracle向 Linux用户提供的软件更新以及技术支持等等增值服务。与此同时,Oracle开始加大在操作系统方面的投入,慷慨解囊资助GNU/Linux社区中的多个关键性项目,同时试图构造一个全新的GNU/Linux发行版。由于操作系统的复杂性,Oracle在自有操作系统方面的进展缓慢。由于与IBM 公司的DB2存在正面竞争,尽管Solaris的市场正在萎缩,Oracle依然将Solaris作为优先考虑的操作系统。2006 年,GNU/Linux在数据中心的新增装机量已经超过了50%,Solaris的新增装机量则降低到15%以下。这时候Oracle的首席执行长官 Larry Ellison做了一个聪明绝顶的决定:将Red Hat的图标换成Oracle的图标,将“Red Hat Enterprise Linux”几个单词修改成”Oracle Enterprise Linux”,一举推出了与Red Hat Enterprise Linux完全兼容的Oracle Enterprise Linux,同时推出价格仅有Red Hat一半的客户支持计划。尽管业界对此众说纷纭,Oracle终究是依靠GNU/Linux社区的强大实力摆脱了对Solaris的依赖,同时也过了一把“自有操作系统”的瘾。 2006年4 月,在被问及是否会考虑收购Red Hat的时候,Oracle的总裁Larry Ellison信心满满地说:Oracle不会收购一家随时都有可能被淘汰的公司。尽管如此,Red Hat成功地用市场份额证明了他们比Oracle更懂操作系统。Oracle可以轻易地将Red Hat和Novell等等公司贡献给开放源代码社区的成果拿来使用,却无法拿来这些公司在开放源代码领域的声望,也无法拿来用户对这些卓有贡献的公司的忠诚, 这也许是Oracle收购Sun 的原因之一:Sun 懂得操作系统。在文件系统方面,ZFS是目前为止功能最强大的文件系统;在应用开发方面,DTrace能够轻易从内核层和用户层寻找应用程序的瓶颈;在系统安全方面,Solaris Trusted Extension获得了最为全面的EAL 4+认证(包括LSPP, CAPP, RBAC);在超级计算方面,目前世界排名第六的德克萨斯超级计算中心(Texas Advanced Computing Center)运行的是Solaris操作系统。(需要说明的是,排名前五的超级计算机运行的都是不同版本的GNU/Linux操作系统。)尽管新增装机量的增长缓慢,但是在世界各地的数据中心里,依然有10%左右的服务器在运行不同版本的Solaris操作系统。通过收购Sun 公司,Oracle可一举获得操作系统领域的核心技术、人才、声望、以及现有的客户。 因此,Oracle不会放弃Solaris操作系统。剩下来的问题,是如何继续Solaris操作系统的开发。Oracle是会继续支持目前的 OpenSolaris项目呢,还是会采用传统的闭源方式?我个人的看法是,Oracle有可能在GPL授权协议(有可能是GPLv3)的框架下重新发布 OpenSolaris项目。OpenSolaris目前最大的问题,是硬件兼容性的问题。在x86/x64平台上,尚有大量的声卡、网卡、显卡以及其他外接设备没有OpenSolaris的驱动程序。类似的问题,GNU/Linux社区已经解决得比较好了。相关的驱动,基本上都是开放源代码的,只是由于 GPL协议和CDDL协议之间互不兼容,使得OpenSolaris社区无法利用GNU/Linux社区的这些成果。我在《回顾:OpenSolaris 2008.11》一文中明确指出:使用GPL授权协议发布OpenSolaris项目,在技术上可以解决OpenSolaris项目所面临的困境,在感情上可以消除GNU/Linux社区的敌意。的确,使用GPL授权协议使得GNU/Linux社区也可以充分利用OpenSolaris项目中诸如ZFS和 DTrace等等亮点,但是从长远来看,恐怕是OpenSolaris项目得到的好处要更多一点。毕竟,对于一位普通的开发人员来说,没有ZFS和 DTrace的GNU/Linux已经足够好用,但是没有声卡网卡驱动的OpenSolaris就不太好用了。 关于开放源代码软件,Larry Ellison有一句名言:“如果开源软件变的足够好了,很简单,我们就把它拿过来用。”现在GNU/Linux在设备驱动方面的优势如此明显,Larry会放过这个机会吗? Java编程语言 谈起Java编程语言,我们首先要明确Java语言目前有三个分支:Java SE(标准版)、Java EE(企业版)和Java ME(嵌入版)。Java SE是Java EE和Java ME的基础,类似于国家自然科学资金的基础性研究项目,基本上是光花钱不挣钱的。Java EE可以认为是Java语言在企业级解决方案中的应用,大部分做Java的公司,除了Sun 公司之外基本上都是依靠Java EE盈利的。最近几年,Java EE俨然是企业级解决方案的事实标准。以中国的情况为例,2008年40%的企业级应用是基于Java EE的,35%是基于.Net的,另有18%是基于单纯的HTML和JavaScript的。Java ME可以认为是Java语言在嵌入式设备方面的应用,譬如说现在大部分的手机都支持Java ME的某个子集。在2006年之前,厂商每生产一台支持Java ME的手机,要给Sun 公司支付一定的授权费用。2006年11月,Sun 公司启动了名为PhoneME的开放源代码项目,这个收入就变得不是十分可靠了。 在如上三个分支中,Oracle最感兴趣的显然是Java EE。但是在收购Sun 公司之前,Oracle已经收购了这个领域的大牛BEA。以应用服务器(Application Server)为例,在中国2008年BEA的WebLogic的市场份额为27%,仅次于IBM的WebSphere(29%),Oracle自己的应用服务器占7%,而Sun 公司的应用服务器(GlassFish)仅占4%。又以门户服务器(Portal Server)为例,在中国2008年BEA的WebLogic的市场份额为32%,比IBM的WebSphere(31%)还要高一个百分点,Oracle自己的门户服务器占10%,而Sun 公司的门户服务器仅占7%。显而易见,让Oracle暗自动心的不是Sun 公司在这个领域的市场份额,而是Sun 公司作为Java语言的发明者在这个领域领导地位。可以想像,在两家公司合并之后,Oracle必然会将Sun 公司目前的Java EE部门一分为二 --写标准和申请专利的继续写标准和申请专利,开发应用服务器的则并入原来的WebLogic部门。至于Sun 公司自己的应用服务器GlassFish,至少这个品牌想来是不会再用了。下一代的Java EE参考实现,叫做Oracle WebLogic显然要响亮得多。按照同样的推理,Sun 公司原来叫做Java企业系统(Java Enterprise System, JES)的那套东西,本来占到的市场份额就很小,合并之后跟Oracle现有的中间件产品线发生冲突,也将逐渐退出历史舞台。 Java ME是一个比较难办的问题。随着各种高速无线网络的普及,移动与嵌入领域正在变成下一个金光闪闪的企业级取款机,但是Oracle在这个领域却毫无经验。我个人的观点,是Oracle会让这个部门继续独立运作一段时间,但是会指派一位党委书记(有可能是从外部新招来的)前来参观学习。等这新来的党委书记熟悉了Java ME部门的业务之后,才开始对该部门进行调整,并且调整的幅度不会很大。 Java FX的去留,要取决于Java ME的命运。我们知道,不管Java FX的桌面版做的有多好,在桌面这个领域是肯定收不到支票的。Java FX如果想要挣钱,就必须能够在手机上流畅地跑起来 --这个事情,不仅仅是改进Java FX本身那么简单,还需要考虑手机的处理能力,以及跑在手机上那个Java虚拟机的效率。 不管是Java EE还是Java ME,都严重依赖于Java SE。如果底层的虚拟机做的不够好,上层的框架搭得再好都是白搭。Sun 公司自己的Java虚拟机,有很多独到之处,执行效率也不错。两家公司合并之后,Oracle之前从BEA那里获得的JRockit估计要遭殃。 Oracle是一家注重实用的公司,因此Java虚拟机下一步将注重于提升服务器端的性能,某些只有桌面端才用得上得功能,其优先级估计就要低一点了。在这一点上,Java虚拟机和GNU/Linux近年来的发展趋势基本上是一致的。 熟悉Java开发的朋友可能会问:NetBeans呢?这可是Sun 公司花了10年心血精心培养常来的宝贝。在下任何结论之前,我们还是先看看2008年Java集成开发环境的市场份额。根据CSDN提供的每年一度程序员大调查数据,在中国这组数字大概是这样的:NetBeans占19.3%,基于NetBeans的Sun Java Studio占4.5%,Eclipse JDT占52%,基于Eclipse的JBuilder占5.5%,基于Eclipse的IBM WebSphere Studio占2.8%,基于Eclipse的BEA WebLogic Workshop占6.5%,IntelliJ IDEA占2.2%,Oracle自己的JDeveloper占1.2%。乍看起来,NetBeans以及基于NetBeans的集成开发环境占了 23.8%的市场份额,似乎是Oracle白白占了个大便宜。再仔细想想,NetBeans是一个免费的产品,Sun 公司大力发展NetBeans,指望的是开发人员通过使用NetBeans将其开发的产品部署在自家的应用服务器等部署环境上,这样才能够卖出产品和服务。在过去四年中,虽然NetBeans的市场份额逐年稳步提升,但是在拉动其他产品方面的作用非常有限。Sun 公司之所以坚持做了下来,是因为过去十年的惯性实在是太大,要想停下来的话不管在内在外都免不了要大折腾特折腾一场。换句话说,这些年来Sun 公司大力发展NetBeans确实保住了面子,但是底下里却输掉了钱包。这种死要面子活受罪的事情,Oracle的Larry Ellison是断然不会做的。 MySQL数据库 2008年3 月,Sun 公司以10亿美元的代价收购MySQL,被Jonathan Schwartz认为是“现代软件史上最重要的并购案”。如此重要的一个角色,在在Oracle与Sun 公司共同发表的新闻稿当中并没有提及。很多业内人士认为,由于MySQL与Oracle的数据库业务之间存在直接的竞争关系,很有可能会被Oracle所抛弃。如果我们将数据库业务这个市场看成一个整体,Oracle与MySQL之间毫无疑问是相互竞争的。但是,如果我们进一步对这个市场进行细分,结论就有可能不太一样。 原MySQL公司的首席执行长官Marten Mickos曾经说过:“如果要在开源软件上取得成功,那么你需要服务于:(1)愿意花费时间来省钱的人;和(2)愿意花钱来节约时间的人。”拿数据库这个市场来说,MySQL所服务的,大部分是第一种用户,小部分是第二种用户;Oracle所服务的,大部分是第二种用户,小部分是第一种用户。MySQL 所拥有的用户数量更多,因为不愿意花钱的人总是比愿意花钱的人多;Oracle所拥有的用户质量更高,因为愿意花钱的都是优质客户。Orqcle更多地被使用于中大型企业应用,MySQL更多地被使用于中小型企业应用,不过这个界限并不严格。因此,MySQL的用户群和Oracle的用户群之间存在一定的重叠,但是重叠的程度并不是很大。Oracle的推广是自上而下的,通过专业广告树立权威形象。一位普通的IT从业人员提起Oracle,可能会觉得 Oracle很强大,什么任务都可以胜任。MySQL的推广是自下而上的,通过口口相传培育用户信心。一位普通的IT从业人员提起MySQL,可能会觉得 MySQL同样很棒,“对付这样的应用足够了”。 但是这并不代表Oracle对MySQL的用户不感兴趣。2005年10月,Oracle收购了与MySQL关系密切的InnoDB。当时 InnoDB为MySQL提供一些事物和外键方面的技术,主要使用于比较复杂的应用当中,对于一般的应用基本上没有什么影响。Oracle收购 InnoDB的本意是希望通过拿走MySQL中的优秀特性来打压MySQL,阻止MySQL进入中大型应用这个市场。遗憾的是开发人员普遍将Oracle 的收购行为理解成对MySQL的恐惧,并且进一步得出MySQL的性能已经足以与Oracle相竞争的推论,反倒帮MySQL做了一次活生生的广告,加速了MySQL的普及。到2008年3 月Sun 收购MySQL的时候,MySQL在数据库业务领域的市场份额已经达到25%以上,更拥有了象Google、Yahoo!、YouTube这样的标杆性用户。 现在一切都顺理成章了,通过对Sun 公司的收购,不管你用的是MySQL还是Oracle,你都是Oracle的用户了。请记住,MySQL被Sun 公司收购之后,基本上是处于独立运作的状态,其现金流还是正的。只要Oracle表示继续支持MySQL数据库,就能够赢得MySQL社区的支持,并在适当的时候向他们提供更好的(要掏钱的)产品或者是服务。在未来的两到三年里,MySQL还是会作为一个独立的产品存在。从长远来看,同时维护多个具有相同或者相似功能的产品会造成用户的困惑。因此,MySQL最终还是需要融入Oracle现有的产品线,只是要等到Oracle将MySQL现有的用户群消化掉而已。 开放源代码 通过这笔金额高达74亿美元的交易,Oracle还将得到一个赠品:按照源代码的行数来计算,Oracle将成为世界上对开放源代码社区贡献最大的实体。从操作系统(OpenSolaris)到编程语言(OpenJDK),从数据库(MySQL)到应用服务器(GlassFish),从开发工具(NetBeans)到办公套件(OpenOffice),这些源代码几乎无所不包。这个赠品来得比较突然,估计Oracle还没有想好要怎样去处理它。 Oracle对开放源代码的态度,可以用四个字来总结:拿来主义。如果一个开源软件足够好用,直接拿过来集成到Oracle的产品中就是了,没有必要为其支付任何费用。用Larry Ellison自己的话来说:“我不能够给开放源代码软件开出上亿美元的支票,因为这并不能够使我们在竞争中得到优势。我们能够做的,别人也能够做。”可惜的是,Oracle收购了InnoDB,并没有拉拢到MySQL的用户;Oracle推出了Oracle Enterprise Linux,也并没有能够拉拢到Red Hat的用户。开放源代码的价值,在于围绕该技术所形成的社区,这个社区包括该技术的开发人员和用户。只有这个社区成了规模,才能够给社区领袖带来经济价值。在这一点上,Marten Mickos看得要比Larry Ellison更为透彻。 和Oracle相比,Sun 公司在开放源代码方面显然拥有更多的实战经验。在过去的四年里,只要是可以开放源代码的软件资产,Sun 公司基本上都开放源代码了 -- 不仅仅是软件,连其最新版本的处理器UltraSparc T2的设计都是开放源代码的。这也难怪有人这么评论道:“在这场轰轰烈烈的开放源代码运动中,Sun 公司无疑是开放得最为彻底得一个。从处理器到操作系统,从编程语言到开发工具,从数据库到办公环境,无一例外。”问题在于,作为一家挂牌交易的上市公司,开放源代码的举措并没有能够使公司摆脱财务上的困境,最终被Oracle收入囊中。Sun 公司的这些“实战经验”,到底有多少能够为Oracle所借鉴,是个值得进一步探讨的问题。 结语 我于2004年10月满怀仰慕之情加入Sun 公司。在过去的4 年多时间里,Sun 公司一直处于动荡之中。每隔三五个月,就来一次结构调整,让大家紧张一阵。这几年来,大大小小的调整经历了不少,竟然慢慢地也就习惯了。这一次经济危机,心里也知道公司的情况非常紧张,但是没有想到竟然这么快就要被卖掉。就借用《金刚经》中的几句话,作为这篇文章的结语吧。 一切有为法,如梦幻泡影,如露亦如电,当做如是观。 关于作者: 蒋清野,1999年获得清华大学学士学位,2000年获得美国伊里诺大学香槟分校硕士学位,目前是Sun 中国技术社区的高级经理,同时任北京交通大学软件学院的客座讲师。在加入Sun 公司之前,蒋清野曾就职于北京中基超威信息技术有限公司(AMD公司的子公司),负责Linux操作系统的裁减与驱动开发。在此之前蒋清野就职于美国导航与控制公司,负责惯性导航、人工智能和嵌入式系统等多方面的研发。蒋清野的个人博客地址为http://www.qyjohn.net/

B. 自从java被甲骨文收购以后还有没有中文的手册

jdk6都出来4年了,都没有什么大更新,手册也没什么要更新的

C. 刚买的手机华为p7蓝屏开不了机怎么回事

针对手机蓝屏的问题可能情况有很多,请按照下列情景分别进行操作:1、手机有过刷机行为或使用过第三方刷机软件。非官方系统会影响手机的稳定性。请将手机恢复到官方系统使用。2、安装了某个软件或者点击某个不明链接之后,手机出现蓝屏。您可以在开机过程中不断按电源键+音量下键,进入安全模式,卸载此前安装的软件或者备份重要数据恢复出厂设置尝试解决。3、误删除过系统文件。系统在运行时,无法找到对应的文件,从而发生错乱,导致手机出现故障。请备份重要数据后进行恢复出厂设置尝试。4、安装了 microSD 卡。请重新插拔 microSD 卡后检查问题是否仍然存在。如果问题存在则可能是接触不良,如果问题不存在了,则可能是 microSD 本身损坏或与手机系统不兼容。建议更换优质 microSD 卡。5、如果上述操作后仍无法解决问题,并且手机蓝屏完全没有规律可循,则可能是硬件故障。请携带购机发票前往售后服务网点检测。

D. oracle linux 7 怎么样

Oracle已经发布了Oracle Linux 7.0操作系统,新系统带来了大量的新特性,比如“第三代坚不可摧的内核 UEK”(Unbreakable Enterprise Kernel Release 3)和一个新的默认文件系统 为了这次新的发行版的发布,Oracle的开发者们已经放出过两个预览版,现在最终版终于来了。果然,它有着大量的改进,其中包括使用新的XFS作为默认的文件系统[注:原文为操作系统,应该是笔误],可选的Btrfs文件系统,Linux Containers (LXC), DTrace,Ksplice,加强版Xen和UEK R3。 作为广泛流行的文件系统EXT4的对抗者,XFS有一个显著优势。它所允许用户的文件系统的大小达到了500TB,这比你在EXT4文件系统中所能达到最大值的十倍还多。唯一的缺点是单个文件的大小最大仅为16TB。 这个发行版的一大特色是它支持两种内核。一个是红帽兼容性内核(RHCK),基于Linux内核版本3.10,第二个是Oracle自己的内核版本“第三代坚不可摧的内核”(UEK R3),版本号从3.8.13开始,因为它基于3.8的Linux内核。你或许还记得Linux内核3.8.x已经寿终正寝,但是看来Oracle一直在维护着自己的分支。 “已经能够从Oracle软件发布云上下载了,Oracle Linux 7可以免费下载和部署。所有的bug修复和安全勘误会被发布到Oracle的公共yum服务器上,不管有没有付费,用户都能安装同样的代码,并且从免费到付费的迁移十分简单,无需重新安装。” “当发布最新的Linux更新,工具以及推送给客户和参与者新功能的时候,需要为现代化的数据中心提供企业级的解决方案。为此最新的发行版是构建在Oracle对OpenStack这样的新兴技术提供支持的基础上,”从官方声明可以看出。 通过变更记录来看,Ksplice已经为了实现零宕机的内核完成了安全更新和bug修复,systemd也成了新的系统管理工具,Grub2现在是默认的启动引导程序,并且支持新的固件类型(比如UEFI),还有一个加强版Anaconda安装器,一个新的Apache Web服务器,支持GPT,和大量的安全特性被添加进来。

E. 笔记本电脑华为蓝屏

亲,请使用MPSRPT_NETWORK.EXE工具捕获相关trace,trace文件保存在“%systemroot%\MPSReports\Network\Reports\Cab”。MPSRPT_NETWORK.EXE工具是微软提供的工具,在如下链接中即可下载该工具:http://support.microsoft.com/kb/816819。若无法获取,请在网上搜索。捕获蓝屏trace,对于死机需要捕获手动蓝屏文件。以windows xp为例说明mp的设置过程。右键单击“我的电脑”,在弹出菜单中选择“属性”。在“属性”页面选择“高级”,并选中“Startup and Recovery”的设置。启动和故障恢复在默认操作系统中,选择测试过程中采用的操作系统。在“Write debugging information”下拉框中,选择“complete memory mp”。点击“OK”,重启PC让设置生效。

F. 华为平板能装trace绘图软件吗

这个好像是不可以装的,因为这个绘图软件好像目前为止没有看到有安卓版本的。

G. Sun Soraris 是什么

SUN的UNIX作系统solaris 介绍SUN的UNIX作系统solaris 介绍Solaris 10 作系统是行业领先的 UNIX 平台,它集成了强大的全新功能,性能、可用性和安全性极高。Solaris 10 作系统中的 ZFS 是 Sun 现有存储管理产品的很好补充,其中包括 Sun StorEdge QFS 软件,该软件是在共享环境中访问业务数据的理想之选。除了本文介绍的 ZFS 文件系统之外,Solaris 10 作系统还采用了以下革新技术:N1 Grid Containers 技术在系统虚拟化和资源利用方面取得了突破性进展。DTrace 是一个复杂动态跟踪框架,可对有关系统行为的任何疑问作出简明的回答。Solaris 10 还采用了一项技术,该技术使一系列 Linux 应用程序能按其固有速度在系统中运行。预测性自我修复功能,它也是 Solaris 10 作系统的一项新技术,它使 Sun 系统能够准确地预知组件故障并修复故障。—————————-ZFS – 文件系统之极品。Solaris 10 作系统中的文件系统提供了无限制的存储性能、可验证的数据完整性、几近零的管理,从而在文件系统中取得了前所未有的突破。大多数系统管理员都受缚于当前文件系统的各种局限。毕竟,文件系统就是这样:极易遭受无记载数据崩溃、管理方式极其复杂以及速度慢得令人难以忍受。ZFS, Sun Solaris 10 作系统 (Solaris OS) 中的全新动态文件系统将让您对文件系统的印象焕然一新。ZFS 可用于 Solaris 10 作系统所支持的所有平台,并且所有现有应用程序都可同它配合运行。另外,ZFS 还是 Sun 存储管理产品的有力补充,其中包括 Sun StorEdge QFS 软件,该软件是共享业务数据的理想之选。“如果您愿意去开发整个软件组,那必定存在大量的创新点。”Sun Microsystems, Inc.著名工程师兼 ZFS 的首席设计师Jeff Bonwick 说到“我们对任何产品都进行了重新构思并重新设计,”Sun 著名工程师兼 ZFS 的首席设计师 Jeff Bonwick 说到,“我们抛弃了 20 年前的老技术,因为它们所基于的构想现在已经过时了。”对于任何机器,从台式机到数据中心,ZFS 都能满足其文件系统的要求。由于设计时就是以管理员为出发点,因此 ZFS 也是唯一一款能自我修复,自我管理的作系统文件系统。它提供了如下优势:简单管理ZFS 结合了复杂的存储管理理念并可进行自动化管理,从而将管理费用降低了 80%。可验证的数据完整性ZFS 使用了 64 位的校验和来保护所有数据,可探测并挽救无记载数据崩溃。无限制的伸缩性作为世界上首款 128 位文件系统,ZFS 提供的性能高达 32 位或 64 位系统的 160 亿平方倍。极高的性能其事务模式摆脱了在 I/O 发布顺序上的诸多传统限制,从而大大提高了性能。正如 ZFS 能神奇地将系统管理员从痛苦中解救出来一样,同时它也能免除公司对底线的后顾之忧。由于 ZFS 是基于虚拟存储池的顶层构建的(不像传统的文件系统,还需单独的容量管理器),它大大降低了创建和删除文件系统的复杂程度。这不仅免除了容量管理器的许可证费用和签定单独支持合同的麻烦,还降低了管理费用并提高了存储利用率。ZFS 对应用程序来说就是一个标准的 POSIX 文件系统 – 无需移植。但对管理员来说,它就是一种汇集存储模式,它摒弃了过时的容量理念,同时也避免了相关的分区管理、分区分配和文件系统容量调整等问题。成千甚至上万的文件系统都可同时使用 ZFS 的共用存储池,并且每个文件系统都可根据需要恰到好处地占用一定空间。存储池中所有设备的 I/O 带宽组合对任一文件系统都始终可用。[infographic goes here]提供几近零的管理Sun 给 ZFS 定下的两大目标就是要抛弃大量复杂的存储管理理念并自动执行大量常规管理事务。例如,创建存储池、扩展池容量、添加或删除文件系统都只需通过一个简单的命令即可完成 – 不像传统的文件系统和容量管理器,需要执行一个多步骤流程(format, newfs, edit/etc/vfstab 等等)。想想以下事实:要创建一个存储池,三个文件系统,然后再扩展这个池,这五个合理步骤在 ZFS 中只需五个简单的命令就可完成,而使用传统的文件系统和容量管理器则需 28 个步骤。而且,执行这些命令所需的时间都是固定的,只需几秒钟时间即可完成。而传统的文件系统和容量通常都需花费几个小时的时间来进行配置。在上面的这个事例中,ZFS 将完成这些任务所需的时间从 40 分钟减少到了不到 10 秒钟。ZFS 的命令行界面大大地简化了管理事务。它是面向任务的,允许管理员描述他们需完成的任务,而无需记住或查看那些模棱两可的命令。“您无需担心硬盘、存储器或文件系统到底发生了什么,”Bonwick 说到,“您只需将磁盘添加到存储池中,文件系统即可根据其需要自动获取空间,而无需管理员插手。”“我们想从零开始设计一套完整的系统。“如果您愿意去开发整个软件组,那必定存在大量的创新点。”免去数据完整性方面的猜测工作导致数据崩溃的原因有多种,如系统出错或意外断电等,但 ZFS 可消除您对这些未知状况的担心。ZFS 始终都能使数据保持一致,从而防止出现数据崩溃。所有作就是一个事务。这不仅保持了一致性,还几乎摆脱了 I/O 顺序方面的所有限制,并且允许将所做更改作为一个整体,要么全部成功,要么全部失败。同时所有作都采用了更新前拷贝技术。实时数据绝对不会被覆盖。ZFS 会在更改数据指针和进行更改之前将数据写入一个新的块。更新前拷贝技术具有以下优点:磁盘上的数据始终保持有效状态保留一致可靠的备份可及时将数据回滚至已知状态“我们验证了整个 I/O 堆栈,从开始到结束,丝毫没有牵扯到任何主观推断。这就是可验证的数据完整性,”Bonwick 说到。管理员再也不用运行诸如 fsck 的复杂的恢复程序了,即使系统遭到了遇外关闭。实际上,Solaris 内核工程师 Bill Moore 和 Matt Ahrens 在测试过程中曾让 ZFS 遭受过数以百万次强制的严重数据崩溃。可 ZFS 从未丧失过数据完整性,也从未遗漏过任何一个数据块。另外,ZFS 也是唯一一个对所有数据都执行端对端 64 位校验和以防止无记载数据崩溃的文件系统。它在读取任何数据时都将检验其校验和,从而保证了应用程序更新的数据就是返回的数据。“执行诸如校验和之类的作已不再因成本太高而遥不可及。占用一小部分的 CPU 来了解数据是否还完整,管理员非常愿意作出这样的牺牲。”Bonwick 说到。作为 Sun 所寻求的真正的自我修复系统的一部分(参阅 9 月 7 日的 Sun.com 功能事例),ZFS 可通过镜像配置或 RAID 配置实现对数据的自我修复。典中一份副本被损坏时,ZFS 可通过校验和检测出来并使用另一份副本来修复它。创造巨大的容量Sun 工程师们对当前 64 位性能的文件系统再过 10 到 20 年是否仍然够用感到置疑。他们的答案是否定的。如果摩尔定律成立,那么人们在 10 到 15 年内将需要有 65 位性能的文件系统。而作为 128 位系统,ZFS 是专为支持更多的存储空间,更多的文件系统、更多的快照副本、更多的目录项和更多的文件而设计的——它能支持的较之在可预知的未来能创建的还要多。这种可伸缩性也意味着存储设备可动态地添加到存储池中或从存储池中删除,而无需中断服务,从而使被全局访问的应用程序服务的灵活性和可用性上升到了另一个全新的高度。为了有效地充分利用这种容量,文件系统会根据用户添加或删除数据的情况自动地进行扩展和收缩。管理员也可以设置限额来限制空间分配和预留,以保证将来空间的可用性。ZFS 还提供了压缩功能,从而可以减少对磁盘空间和 I/O 带宽的需求。当然,下一个问题将是 ZFS 的 128 位又是否足够。按 Bonwick 的说法,这已经足够了。“装上 128 位的文件系统将超越地球上的存储量界限。您不可能填满 128 位的存储池,否则我们的星球都会蒸发。”

H. 如何在 Oracle Linux 上使用 PHP DTrace

DTrace 是一个受欢迎的、“总是可用”的跟踪实用程序,用于识别开发和生产系统中的性能和行为问题。适用于 Oracle Linux 的标准“UEK3”内核包括了 DTrace 支持。通过跟踪 PHP 核心和 PHP OCI8 扩展中的用户探测器,我们可以有效地识别 PHP 脚本问题。DTrace 让您可以跟踪用户应用程序与操作系统之间的交互。在 Oracle Linux 上,DTrace 实用程序需要一个 Oracle Unbreakable Linux Network (ULN) 订阅。安装 Oracle Linux 和 Oracle Unbreakable Enterprise Kernel 版本 3首先,通过 Oracle E-Delivery 安装 Oracle Linux 6.4。安装 Oracle Linux 6.4 之后,确保在 ULN 中启用了“Unbreakable Enterprise Kernel Release 3 for Oracle Linux 6 (x86_64) – Latest”频道。安装 UEK3 内核:# yum install kernel-uek在 ULN 中启用“Oracle Linux 6 Dtrace Userspace Tools (x86_64) – Latest”频道,安装 DTrace 实用程序:# yum install dtrace-utils重新引导到新的 UEK3 3.8.13 内核。安装 PHP需要使用 –enable-dtrace 参数构建 PHP。您可以安装一些启用了 DTrace 的预先构建的评估版 RPM,请参见“使用 Oracle Linux“playground”预构建软件包的 DTrace PHP”。也可以按照如下所述重新构建 PHP:从 php.net 下载 PHP 5.4.20 或 PHP 5.5.4 或更高版本,然后进行解压缩:$ tar -xJf php-5.4.20.tar.bz2$ cd php-5.4.20配置 PHP:$ ./configure \–prefix=$HOME/p54 \–enable-dtrace \–disable-all –disable-cgi \–with-pear –enable-xml –enable-libxml –with-zlib这将构建一个启用了 DTrace 的最小的命令行 PHP。所有不需要的扩展均被禁用。您可根据需要包含其他扩展。–prefix 选项表示安装到一个本地目录,方便您查看安装的文件。用完快照之后,清理该目录很容易。pear、xml 和 zlib 选项允许使用 pecl 命令。生成 PHP 二进制文件并进行安装:$ make$ make install将 php.ini-development 复制到 $HOME/p54/lib/php.ini,编辑该文件来设置时区,例如:date.timezone = America/Los_Angeles安装适用于 Oracle Database 的 PHP OCI8评估版 PHP RPM 包括可以连接到 Oracle Database 的 OCI8 扩展;请参见前面提到的博文。不过,如果您自己编译 PHP,需要手动将 PHP OCI8 作为一个“共享的”扩展添加:在 ULN 上启用“Oracle Software for Oracle Linux 6 (x86_64)”频道。以 root 用户身份安装 Oracle Instant Client:# yum install oracle-instantclient12.1-basic oracle-instantclient12.1-devel作为普通用户,设置 PHP 的 PATH:$ export PATH=$HOME/p54/bin:$PATH如果需要访问 http://pecl.php.net,请设置一个 PEAR 代理:$ pear config-set http_proxy http://myproxy.example.com:80/设置用来启用 DTrace 的环境变量 PHP_DTRACE,然后安装 PHP OCI8:$ PHP_DTRACE=yes pecl install oci8-2.0.2本文后面将要用到的 DTrace 探测器定义基于 PHP OCI8 2.0.2,因此需要安装明确的版本。如果您要安装更高的版本,请查看探测器及其参数,了解最新版本中的小改进。当提示 ORACLE_HOME 目录时,无需输入文本,直接按 Return。安装将自动检测 Oracle Instant Client RPM。配置将继续,输出将包含类似下面的内容:[ . . . ]checking for Oracle Database OCI8 support… yes, sharedchecking PHP version… 5.4.20, okchecking OCI8 DTrace support… yes[ . . . ]configure: WARNING: OCI8 extension: ORACLE_HOME is not set, looking for default Oracle Instant Client insteadchecking Oracle Instant Client directory… /usr/lib/oracle/12.1/client64/libchecking Oracle Instant Client SDK header directory… /usr/include/oracle/12.1/client64checking Oracle Instant Client library version compatibility… 12.1[ . . . ]再次编辑 php.ini,添加 PHP OCI8:extension=oci8.so确认安装:$ php –ri oci8oci8OCI8 Support => enabledOCI8 DTrace Support => enabledOCI8 Version => 2.0.2-devRevision => $Id: $Oracle Run-time Client Library Version => 12.1.0.1.0Oracle Compile-time Instant Client Version => 12.1Directive => Local Value => Master Valueoci8.max_persistent => -1 => -1oci8.persistent_timeout => -1 => -1oci8.ping_interval => 60 => 60oci8.privileged_connect => Off => Offoci8.statement_cache_size => 20 => 20oci8.default_prefetch => 100 => 100oci8.old_oci_close_semantics => Off => Offoci8.connection_class => no value => no valueoci8.events => Off => OffStatistics => Active Persistent Connections => 0Active Connections => 0PHP OCI8 安装说明为了支持 DTrace,需要从 PECL 安装 PHP OCI8 2.0,因为 PHP 5.4 和 PHP 5.5 包含的 PHP OCI8 1.4 没有 DTrace 探测器。将来,在 PHP 5.6 发布后,您就能够在构建 PHP 时配置支持 DTrace 的 PHP OCI8。当然,您可以通过 Oracle Instant Client zip 文件安装 PHP OCI8,也可以仅使用现有的 ORACLE_HOME 安装。您可以在不包含或未配置 DTrace 的 PHP 版本上安装启用 DTrace 的 PHP OCI8。这包括 PHP 早期版本。您将能够跟踪 PHP OCI8 探测器,但无法跟踪核心 PHP 探测器。类似地,您可以在启用 DTrace 的 PHP 上安装禁用 DTrace 的 PHP OCI8。如果您使用 phpize 和 configure(而不是 pecl)从 PECL 安装 PHP OCI8 2.0 ,则仍需设置 PHP_DTRACE=yes。这是因为 PECL 软件包有限的 configure 脚本将忽略 –enable-dtrace 选项。PHP OCI8 2.0 配置脚本适合“真正的”DTrace 使用,但 Linux SystemTap 不会跟踪扩展。注意,DTrace 优化后的二进制文件产生的输出可能与我们所见到的代码不尽相同。验证 PHP DTrace 探测器以 root 用户身份启用 DTrace,允许普通用户记录跟踪信息:# modprobe fasttrap# chmod 666 /dev/dtrace/helper您可以使用 ACL 软件包规则限制特定用户对设备的访问,而非使用 chmod 命令。作为普通用户运行 php,不带任何选项。PHP 将启动,然后等待输入:$ php以 root 用户身份列出可用的 DTrace 探测器。列出了 PHP 核心探测器和 PHP OCI8 探测器:# dtrace -l -m php -m oci8.so 4 php9559 php dtrace_compile_file compile-file-entry 5 php9559 php dtrace_compile_file compile-file-return 6 php9559 php zend_error error 7 php9559 php ZEND_CATCH_SPEC_CONST_CV_HANDLER exception-caught 8 php9559 php zend_throw_exception_internal exception-thrown 9 php9559 php dtrace_execute_ex execute-entry10 php9559 php dtrace_execute_internal execute-entry11 php9559 php dtrace_execute_ex execute-return12 php9559 php dtrace_execute_internal execute-return13 php9559 php dtrace_execute_ex function-entry14 php9559 php dtrace_execute_ex function-return15 php9559 php php_request_shutdown request-shutdown16 php9559 php php_request_startup request-startup17 php9559 oci8.so php_oci_dtrace_check_connection oci8-check-connection18 php9559 oci8.so php_oci_do_connect oci8-connect-entry19 php9559 oci8.so php_oci_persistent_helper oci8-connect-expiry20 php9559 oci8.so php_oci_do_connect_ex oci8-connect-lookup21 php9559 oci8.so php_oci_pconnection_list_np_dtor oci8-connect-p-dtor-close22 php9559 oci8.so php_oci_pconnection_list_np_dtor oci8-connect-p-dtor-release23 php9559 oci8.so php_oci_do_connect oci8-connect-return24 php9559 oci8.so php_oci_do_connect_ex oci8-connect-type25 php9559 oci8.so php_oci_error oci8-error26 php9559 oci8.so php_oci_statement_execute oci8-execute-mode27 php9559 oci8.so php_oci_create_spool oci8-sesspool-create28 php9559 oci8.so php_oci_create_session oci8-sesspool-stats29 php9559 oci8.so php_oci_create_session oci8-sesspool-type30 php9559 oci8.so php_oci_statement_create oci8-sqltextPHP 手册中详细记载了核心 PHP 探测器。PHP OCI8 探测器如下所述。在用户终端,用 Ctrl-C 停止 php 可执行文件。$ php^C$PHP OCI8 2.0 DTrace 探测器概述静态 PHP OCI8 2.0 探测器可分为“用户”探测器和“维护者”探测器。后者对于 PHP OCI8 维护者更有用,可在扩展开发期间验证功能。所有探测器均以参数形式返回数据。官方文档中详细介绍了 PHP OCI8 DTrace 探测器。在 OCI8 2.0.2 中,用户探测器包括:oci8-connect-entry — 由 oci_connect()、oci_pconnect() 和 oci_new_connect() 启动。在建立数据库连接之前触发。char *username — 连接用户名。char *dbname — 数据库连接字符串。char *charset — 指定的字符集。long session_mode — OCI_SYSDBA (0x2)、OCI_SYSOPER (0x4) 和 OCI_CRED_EXT (1<<31) 的二进制“或”(或者过去我所使用平台上的 -2147483648)。默认情况下,设置为 0。int persistent — 如果调用了 oci_pconnect(),则设置为 1;否则设置为 0。int exclusive — 如果调用了 oci_new_connect(),则设置为 1;否则设置为 0。oci8-connect-return — 在连接的末尾触发。void *connection — 连接结构的地址。oci8-check-connection — 如果 Oracle 错误可能已经导致连接失效,则启动。void *connection — 连接结构的地址。int is_open — 如果 errcode 或 server_status 指示连接无效且必须重新创建,则为 0。long errcode — Oracle 错误编号。unsigned long server_status — 为 Oracle 库的一个指示器,指示连接是否无效。如果因为 errcode 指示连接无效导致 is_open 为 0,则 server_status 为其默认值 1。oci8-sqltext — 执行 oci_parse() 时启动。void *connection — 连接结构的地址。char *sql — 所执行的 SQL 语句的文本。oci8-error — 如果发生 Oracle 错误,则启动。int status — Oracle 返回失败的 Oracle 库调用的状态,如 -1 代表 Oracle 的 OCI_ERROR,1 代表 Oracle 的 OCI_SUCCESS_WITH_INFO。请参见 Oracle 的 oci.h,了解所有定义。long errcode — Oracle 错误编号。oci8-execute-mode — 指示 oci_execute() 调用的提交状态。void *connection — 连接结构的地址。unsigned int mode — 传递给 Oracle 库的模式,如 OCI_NO_AUTO_COMMIT (0x00)、OCI_DESCRIBE_ONLY (0x10) 或 OCI_COMMIT_ON_SUCCESS (0x20)。注:最新的 OCI8 2.0.6 中包含 oci8-connection-close 探测器,有几个探测器现在也具有 client_id 参数和指向语句结构的指针。维护者探测器如下所示。参数描述请参考 PHP OCI8 源代码。oci8-connect-p-dtor-closevoid *connectionoci8-connect-p-dtor-releasevoid *connectionoci8-connect-lookupvoid *connectionint is_stuboci8-connect-expiryvoid *connectionint is_stublong idle_expirylong timestampoci8-connect-typeint persistentint exclusivevoid *connectionlong num_persistentlong num_connectionsoci8-sesspool-createvoid *session_pooloci8-sesspool-statsunsigned long freeunsigned long busyunsigned long openoci8-sesspool-typeint typevoid *session_poolPHP OCI8 2.0 中的探测器代替了 PHP OCI8 1.4 中使用的 oci_internal_debug() 跟踪。该函数已变成一条空指令,不执行任何操作。使用 PHP OCI8 和 DTrace执行以下步骤。创建一个简单的 PHP 文件 oci8.php 来查询数据库: <?php error_reporting(0); ini_set('display_errors', 'Off'); function do_query($c, $sql) { $s = oci_parse($c, $sql); if (!$s) return; $r = oci_execute($s); if (!$r) return; while (($row = oci_fetch_row($s)) != false) { foreach ($row as $item) { echo $item . " "; } echo "\n"; } } $c = oci_new_connect('hr', 'welcome', 'localhost/pdborcl'); do_query($c, "select city from locations where rownum < 5 order by 1"); do_query($c, "select something from does_not_exist"); ?>创建一个 D 脚本 user_oci8.d 来探测 oci8.php 的执行: #!/usr/sbin/dtrace -Zs # This script is for OCI8 2.0.2 php*:::oci8-connect-entry { printf("PHP connect-entry\n"); printf("\t username %s\n", arg0 ? instr(arg0) : ""); printf("\t dbname %s\n", arg1 ? instr(arg1) : ""); printf("\t charset %s\n", arg2 ? instr(arg2) : ""); printf("\t session_mode %ld\n", (long)arg3); printf("\t persistent %d\n", (int)arg4); printf("\t exclusive %d\n", (int)arg5); } php*:::oci8-connect-return { printf("PHP oci8-connect-return\n"); printf("\t connection 0x%p\n", (void *)arg0); } php*:::oci8-connection-close { printf("PHP oci8-connect-close\n"); printf("\t connection 0x%p\n", (void *)arg0); } php*:::oci8-error { printf("PHP oci8-error\n"); printf("\t status %d\n", (int)arg0); printf("\t errcode %ld\n", (long)arg1); } php*:::oci8-check-connection { printf("PHP oci8-check-connection\n"); printf("\t connection 0x%p\n", (void *)arg0); printf("\t is_open %d\n", arg1); printf("\t errcode %ld\n", (long)arg2); printf("\t server_status %lu\n", (unsigned long)arg3); } php*:::oci8-sqltext { printf("PHP oci8-sqltext\n"); printf("\t connection 0x%p\n", (void *)arg0); printf("\t sql %s\n", arg0 ? instr(arg1) : ""); } php*:::oci8-execute-mode { printf("PHP oci8-execute-mode\n"); printf("\t connection 0x%p\n", (void *)arg0); printf("\t mode 0x%x\n", arg1); }使用 OCI8 2.0.6,一些参数的数值需要调整,才能满足现在一些新增参数的需要。以 root 用户身份启动 D 脚本。该脚本将暂停,等待探测器触发: # chmod +x user_oci8.d # ./user_oci8.d(稍后,体验完 PHP 之后,可以使用 Ctrl-C 关闭此终端。)在另一个窗口中运行命令行 PHP。显示成功查询的输入: $ php oci8.php Beijing Bern Bombay Geneva 在运行 D 脚本的 root 终端,将显示 PHP 执行期间触发的探测器: # ./user_oci8.d dtrace: script 'user_oci8.d' matched 0 probes CPU ID FUNCTION:NAME 1 18 php_oci_do_connect:oci8-connect-entry PHP connect-entry username hr dbname localhost/pdborcl charset session_mode 0 persistent 0 exclusive 0 0 23 php_oci_do_connect:oci8-connect-return PHP oci8-connect-return connection 0x7f64e112cff0 0 31 php_oci_statement_create:oci8-sqltext PHP oci8-sqltext connection 0x7f64e112cff0 sql select city from locations where rownum < 5 order by 1 0 27 php_oci_statement_execute:oci8-execute-mode PHP oci8-execute-mode connection 0x7f64e112cff0 mode 0x20 0 31 php_oci_statement_create:oci8-sqltext PHP oci8-sqltext connection 0x7f64e112cff0 sql select something from does_not_exist 0 27 php_oci_statement_execute:oci8-execute-mode PHP oci8-execute-mode connection 0x7f64e112cff0 mode 0x20 0 26 php_oci_error:oci8-error PHP oci8-error status -1 errcode 942 0 17 php_oci_dtrace_check_connection:oci8-check-connection PHP oci8-check-connection connection 0x7f64e112cff0 is_open 1 errcode 942 server_status 1 0 25 php_oci_connection_close:oci8-connection-close PHP oci8-connect-close connection 0x7f64e112cff0(将 -q 添加到 user_oci8.d 的 /usr/sbin/dtrace 参数将隐藏 CPU 和 ID 详细信息。)在多 CPU 计算机上,探测器可能不会顺序出现,具体取决于哪个 CPU 正在处理探测器。显示探测器时间戳将有助于消除混淆,例如: php*:::oci8-connect-entry { printf("PHP connect-entry at %lld\n", walltimestamp); }从 user_oci8.d DTrace 输出中,您可以看到以下内容:发起的连接 (oci8-connect-entry)。连接到 localhost/pdborcl 数据库的用户 hr。因为 exclusive 和 persistent 均为 0,所以是一个 oci_connect() 调用。未请求任何显式的字符集。请求的是默认的会话模式(oci_connect 的第五个可选参数)。对两条 SQL 语句进行分析 (oci8-sqltext),并以 0x20(即 OCI_COMMIT_ON_SUCCESS)模式执行 (oci-execute-mode)。生成了 (oci8-error) 一条 Oracle 错误 — ORA-942(表或视图不存在)。该错误导致要验证连接状态 (oci8-check-connection)。is_open 的值为 1,表示连接正常。通过这些信息,您可以跟踪有问题的语句执行和连接问题。总结DTrace 是一个非常强大的实用程序,本文只是有关其用法的只言片语。通过上述示例,可将 PHP OCI8 跟踪与核心 PHP 跟踪相集成。您可以设置 PHP 函数调用的时间,计算调用的次数。您可以深入了解 PHP 进行的操作系统调用。Bryan Cantrill 在 DTrace 和 PHP(演示)中发布了一些核心 PHP 跟踪的示例。(注意,博客平台升级导致其博文中的一个反斜杠显示为两个反斜杠。而且,您不再需要单独的 PHP DTrace 扩展。)Brendan Gregg 的 DTrace Toolkit 包含许多有用的 DTrace 脚本。还有各种不同的博客。记住,DTrace 的目的是始终启用其功能,适合开发和生产(此过程最需要 DTrace)。DTrace 的设计意味着探测器不受监视时零开销。

I. 华为的trace tmf怎么打开

所有的IDE工具都是要打开项目文件(project 文件),其描述了项目工程的配置数据:那些源代码文件,系统的路径、编译的选项; 1、点击菜单File-> Open Project, 2、选择项目目录下需要打开的工程文件即可。

J. 如何选择一个 Linux Tracer

tracer 是一个高级的性能分析和诊断工具,但是不要让这名词唬住你,如果你使用过 strace 和tcpmp,其实你就已经使用过 tracer 了。系统 tracer 可以获取更多的系统调用和数据包。它们通常能跟踪任意的内核和应用程序。有太多的 linux tracer 可以选择。每一种都有其官方的(或非官方的)的卡通的独角兽吉祥物,足够撑起一台"儿童剧"了。那么我们应该使用哪个 tracer 呢?我会为两类读者回答这个问题,大部分人和性能/内核工程师。过一段时间这些可能会发生变化,我会持续跟进并补充,大概会一年更新一次。多数人多数人 (开发者,系统管理员,开发管理者,运维人员,评测人员,等等) 不关心系统追踪器的细节。下面是对于追踪器你应该知道和做的:1. 使用perf_events分析CPU性能使用 perf_events 做 CPU 性能分析。性能指标可以使用flame graph 等工具做可视化。git clone –depth 1 https://github.com/brendangregg/FlameGraphperf record -F 99 -a -g — sleep 30perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > perf.svgLinux perf_events (又称 "perf",同命令名) 是 Linux 用户的官方追踪器和性能分析器。内置于内核代码,有很好维护(近来获得快速增强),通常通过 linux 命令行工具包添加。perf 有很多功能,如果只能推荐一个,我选择 CPU 性能分析。尽管这只是采样,而不是从技术上追踪事件。最难的部分是获取完整的栈和信息,我为 java 和 node.js 做的一个演讲 Linux Profiling at Netflix中已经说过这个问题2.了解其他的Tracer正如我一个朋友说的:“你不需要知道如何操作 X 射线机器,但是一旦你吞了一枚硬币,你得知道这得去做 X 射线”,你应该了解各种 tracer 都能做什么,这样就能在你工作中真正需要 tracer 的时候,你既可以选择稍后学习使用,也可以雇相应的人来完成。简短来说:几乎所有的东西都可以使用 tracer 来进行分析和跟踪。如,文件系统,网络处理器,硬件驱动器,全部的应用程序。可以看一下我的个人网站上关于 ftrace的文章,还有我写的关于perf_events 文档介绍,可以做为一个追踪(或者性能分析)的例子。3. 寻求前端支持工具如果你正想买一个能支持跟踪 Linux 的性能分析工具(有许多卖这类工具的公司)。想像一下,只需要直接点击一下界面就能“洞察”整个系统内核,包括隐藏的不同堆栈位置的热图,我在Monitorama talk 中介绍了一个这样带图形界面的工具。我开源了一些我自己开发的前端工具,尽管只是 CLI (命令行界面)而不是(图形界面)。这些工具也会让人们更加快速容易的使用 tracer。比如下面的例子,用我的 perf_tool,跟踪一个新进程:# ./execsnoopTracing exec()s. Ctrl-C to end.PID PPID ARGS22898 22004 man ls22905 22898 preconv -e UTF-822908 22898 pager -s22907 22898 nroff -mandoc -rLL=164n -rLT=164n -Tutf8[…]在 Netflix 上,我们创建了一个 Vector,一个分析工具的实例同时也是 Linux 上的 tracer 的最终前端。致性能或内核工程师我们的工作变的越来越困难,很多的人会问我们怎么样去追踪,哪种路径可以用!为了正确理解一个路径,你经常需要花上至少100个小时才能做到。理解所有的 linux 路径去做出理性的决定是一个浩大的工程。(我可能是唯一一个接近做到这件事情的人)这里是我的建议,可以二选其一:A) 选中一个全能的路径,并且使它标准化,这将涉及花费大量的时间去弄清楚它在测试环境中的细微差别和安全性。我现在推荐 SystemTap 的最新版本(ie,从源代码构建)。我知道有些公司已经选用 LTTng,而且他们用的很好,尽管它不是非常的强大(虽然它更安全)。Sysdig 可以成为另一个候选如果它可以增加追踪点或者 kprobes。B) 遵循我上面提供的流程图,它将意味着尽可能更多的使用 ftrace 或者 perf_event, eBPF 会得到整合,之后其他的路径像 SystemTap/LTTng 会去填补这个空白。这就是我目前在 Netflix 做的工作。tracer 的评论:1. ftrace我喜欢用 ftrace,它是内核 hacker 的首选,内置于系统内核,可以使用跟踪点(静态检查点),能调用内核 kprobes 和 uprobes 调试工具。并且提供几个这样的功能:带可选过滤器和参数的事件追踪功能;在内核中进行统计的事件计数和定时功能;还有函数流程遍历的功能。可以看一下内核代码中 ftrace.txt 例子了解一下。ftrace 由 /sys 控制,仅支持单一的 root 用户使用(但是你可以通过缓冲区实例破解以支持多用户)。某些时候 Ftrace 的操作界面非常繁琐,但是的确非常“hack”,而且它有前端界面。Steven Rostedt,ftace 的主要作者,创建了 trace-cmd 命令工具,而我创建了 perf 的工具集。我对这个工具最大的不满就是它不可编程。举例来说,你不能保存和获取时间戳,不能计算延迟,不能把这些计算结果保存成直方图的形式。你需要转储事件至用户级别,并且花一些时间去处理结果。ftrace 可以通过 eBPF 变成可编程的。2.perf_eventsperf_events 是 Linux 用户的主要跟踪工具,它内置在内核源码中,通常通过 linux-tools-commom 加入。也称“perf”,同前端工具名称,通常用来跟踪和转储信息到一个叫做 perf.data 的文件中,perf.data 文件相当于一个动态的缓冲区,用来保存之后需要处理的结果。ftrace 能做到的,perf_events 大都也可以做到,perf-events 不能做函数流程遍历,少了一点儿“hack”劲儿(但是对于安全/错误检查有更好的支持)。它可以进行 CPU 分析和性能统计,用户级堆栈解析,也可以使用对于跟踪每行局部变量产生的调试信息。它也支持多用户并发操作。和 ftrace 一样也不支持可编程。如果要我只推荐一款 tracer,那一定是 perf 了。它能解决众多问题,并且它相对较安全。3. eBPFextended Berkeley Packet Filter(eBPF)是一个可以在事件上运行程序的高效内核虚拟机(JIT)。它可能最终会提供 ftrace 和 perf_events 的内核编程,并强化其他的 tracer。这是 Alexei Starovoitov 目前正在开发的,还没有完全集成,但是从4.1开始已经对一些优秀的工具有足够的内核支持了,如块设备I/O的延迟热图。可参考其主要作者 Alexei Starovoitov 的BPF slides和eBPF samples。4. SystemTapSystemTap 是最强大的tracer。它能做所有事情,如概要分析,跟踪点,探针,uprobes(来自SystemTap),USDT和内核编程等。它将程序编译为内核模块,然后加载,这是一种获取安全的巧妙做法。它也是从tree发展而来,在过去有很多问题(多的可怕)。很多不是 SystemTap 本身的错——它常常是第一个使用内核追踪功能,也是第一个碰到 bug 的。SystemTap 的最新版本好多了(必须由源代码编译),但是很多人仍然会被早期版本吓到。如果你想用它,可先在测试环境中使用,并与irc.freenode.net上 的 #systemtap 开发人员交流。(Netflix 有容错机制,我们已经使用了 SystemTap,但是可能我们考虑的安全方面的问题比你们少。)我最大的不满是,它似乎认为你有常常没有的内核 debug 信息。实际上没有它也能做很多事情,但是缺少文档和例子(我必须自己全靠自己开始学习)。5. LTTngLTTng 优化了事件采集,这比其他 tracers 做得好。它从 tree 发展而来,它的核心很简单:通过一组小规模的固定指令集将事件写入追踪缓冲区,这种方式使它安全、快速,缺点是它没有内核编码的简单途径。我一直听说这不是一个大问题,因为尽管需要后期处理,它也已经优化到可以充分的度量。此外,它还首创了一个不同的分析技术,更多对所有关注事件的黑盒记录将稍后以 GUI 的方式进行研究。我关心的是前期没有考虑到要录制的事件缺失问题如何解决,但我真正要做的是花更多时间来看它在实践中用的怎么样。这是我花的时间最少的一个 tracer(没有什么特殊原因)。6. Ktapktap 在过去是一款前景很好的 tracer,它使用内核中的 lua 虚拟机处理,在没有调试信息的情况下在嵌入式设备上运行的很好。它分为几个步骤,并在有一段时间似乎超过了 Linux 上所有的追踪器。然后 eBPF 开始进行内核集成,而 ktap 的集成在它可以使用 eBPF 替代它自己的虚拟机后才开始。因为 eBPF 仍将持续集成几个月,ktap 开发者要继续等上一段时间。我希??今年晚些时候它能重新开发。7. dtrace4linuxdtrace4linux 主要是 Paul Fox 一个人在业余时间完成的,它是 Sun DTrace 的 Linux 版本。它引入瞩目,还有一些 provider 可以运行,但是从某种程度上来说还不完整,更多的是一种实验性的工具(不安全)。我认为,顾忌到许可问题,人们会小心翼翼的为 dtrace4linux 贡献代码:由于当年 Sun 开源DTrace 使用的是 CDDL 协议,而 dtrace4linux 也不大可能最终进入 Linux kernel。Paul 的方法很可能会使其成为一个 add-on。我很乐意看到 Linux 平台上的 DTrace 和这个项目的完成,我认为当我加入 Netflix 后将会花些时间来协助完成这个项目。然而,我还是要继续使用内置的 tracers,如 ftrace 和 perf_events。8.OL DTrace Oracle Linux DTrace为了将 DTrace 引入 Linux,特别是 Oracle Linux,做出了很大的努力。这些年来发布的多个版本表明了它的稳定进展。开发者们以一种对这个项目的前景看好的态度谈论着改进 DTrace 测试套件。很多有用的 provider 已经完成了,如:syscall, profile, sdt, proc, sched 以及 USDT。我很期待 fbt(function boundary tracing, 用于内核动态跟踪)的完成,它是 Linux 内核上非常棒的 provider。OL DTrace 最终的成功将取决于人们对运行 Oracle Linux(为技术支持付费)有多大兴趣,另一方面取决于它是否完全开源:它的内核元件是开源的,而我没有看到它的用户级别代码。9. sysdigsysdig是一个使用类tcpmp语法来操作系统事件的新tracer,它使用lua提交进程。它很优秀,它见证了系统跟踪领域的变革。它的局限性在于它只在当前进行系统调用,在提交进行时将所有事件转储为用户级别。你可以使用系统调用做很多事情,然而我还是很希望它能支持跟踪点、kprobe和uprobe。我还期待它能支持eBPF做内核摘要。目前,sysdig开发者正在增加容器支持。留意这些内容。延伸阅读我关于 tracer 的工作包括:ftrace:我的 perf-tools工具集(参考实例目录);我在 lwn.net 上的 关于ftrace的文章;LISA14的发言;还有帖子:函数计数, iosnoop,opensnoop,execsnoop,TCP转发, uprobes 以及USDT。perf_evenets:我的网页 perf_events实例;SCALE上的发言Netflix的Linux性能分析;还有帖子CPU采样,静态追踪点,热点图,计数,内核行追踪,off-CPU时间图。eBPF:帖子eBPF:迈出一小步,和一些BPF工具(我需要发布更多)。SystemTap:我很久以前写了一篇有点过期的帖子使用SystemTap。最近,我发布了一些工具systemtap-lwtools来演示如何在没有内核诊断信息的情况下使用SystemTap。LTTng:我只花了一点时间,还不足以发表任何内容。ktap:我的网页ktap实例包含一些早期版本的单行小程序和脚本。dtrace4linux:我在系统性能一书中给出了一些实例,并曾经开发了一些小的修复程序,如timestamps。OL DTrace:由于它直接由DTrace转变而来,很多我早期关于DTrace的工作都有相关性(如果在这里给出链接的话就太多了,可以在我的主页上搜索)。当它更完善时,我会开发一些特殊工具。sysdig:我向 fileslower 和 subsecond offset spectrogram 贡献了代码。其他:我写了关于strace 的注意事项。请不要有更多的 tracer!如果你想知道为什么 Linux 不仅仅只有一个 tracer,或者只用本身的DTrace,你可以在我的演讲稿从DTrace到Linux中找到答案,从28张幻灯片开始。感谢Deirdré Straughan的编辑,以及与 General Zoi 的小马宝莉创作者一起创作的 tracing 小马。


赞 (0)