云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

域名交易_开源数据库软件_代金券

小七 141 0

存储云平台_如何使用_云计算和高性能计算

我们最初开发DTrace的口号是让不可能的事情成为可能,而不是让简单的事情变得简单。自从将其编撰之后,开发人员工具中倾向于后者的趋势就很明显了。然而,我们对前者的关注却留下了一些阻碍新手的可用性问题,也让兽医很恼火。最近的DTrace开发大多集中在一个中间类别上:简化本应简单的难处理的事情。print()操作出于这种想法,我的同事Eric Schrock在11月份就向DTrace添加了print()操作。在此之前,我的工作流程是这样的:"我要跟踪xdr\u bytes()"放入mdb(1)以打印出我要检查的结构编写一个D脚本来发出我感兴趣的成员:fbt::xdr_字节:条目{跟踪(args[0]->;x\u base);跟踪(args[0]->;x\u handy);}重复一千次,考虑错误,个人如何建站,在跟踪的指针上迭代,并总结时间。通过Eric的修复,DTrace更易于使用:"我要跟踪xdr\u bytes()"繁荣:fbt::xdr_字节:条目{打印(参数[0]);}用于转换类型的print()当然,除了跟踪任何内核函数之外,DTrace还有稳定的探针,可以识别众所周知的(合理的)有良好记录的活动点。这些探测与内核函数不对应,所以mdb没有那么有用。工作流程有点烦人:"我想追踪IO"任何一个google"dtrace io provider",找到参数和类型定义或者(更经常)dtrace-lvn io:::以查看类型名称更少的/usr/lib/dtrace/io.d来查找类型定义编写D脚本:io:::启动{跟踪(args[1]->;设备名称);跟踪(args[1]->;dev\u路径名);}再重复一千次,更烦人的次数。不幸的是,print()在这种情况下没有那么有用:#dtrace-n'io:::开始{print(*args[1]);}'dtrace:无效的探测说明符io:::start{trace(*args[1]);}:print()不能应用于动态表达式诸如io:::start探测之类的稳定探测可以使用转换的参数,这些参数是DTrace用不稳定的底层实现中的稳定数据填充的合成类型。例如,尽管实现非常不同,但io::start提供程序在illumos、FreeBSD、Mac OS X和Oracle Solaris上公开相同的数据。有效地一次转换一个参数;*(解引用)运算符对于这些表达式无效。在最近对illumos的一次推广中,我添加了以下支持:#dtrace-n'io:::开始{print(*args[1]);}'dtrace:描述"io:::start"匹配了6个探测器CPU ID功能:名称0 11307溴二苯醚_策略:启动devinfo{int dev_major=0x62int dev_小调=0x40int dev_实例=0x1字符串dev_name=["sd"]字符串dev_statname=["sd1"]string dev_pathname=["/devices/pci@0,0/pci15ad,大数据分析数据库,1976@10/标准差@0,0:a"]}在Eric的加入和我自己的加入之间,我最常遇到的DTrace烦恼不再了。幕后对于那些DTrace超级书呆子来说,我想我应该分享一些实现。为了trace()或print()一个表达式,它必须存在于内存中的某个地方。转换后的类型不存在于内存中,而是静态地翻译单个成员。我们可以在DTrace DIF(D intermediate form)反汇编程序的输出中看到这一点:#dtrace-n'io:::start{trace(args[1]->;dev_name);}'-SeDIFO 0x75e940按ref返回字符串(未知)(大小256)非操作码指令00:25000001 setx DT_整数[0],%r1!0x0个01:28000101 ldga DT_VAR(0),%r1,%r110000r1%移动2%03:25000103 setx DT_整数[1],%r3!0xe004:07020302添加%r2、%r3、%r205:22020002 ldx[%r2],%r206:25000003 setx DT_整数[0],%r3!0x0个07:0f020300 cmp%r2,什么是云计算和大数据,%r308:1200000年11月09:0e000002移动%r0,%r210: 1100000摄氏度ba 1211: 25000202 setx DT_整数[2],%r2!0x1个12: 10020000总吨%r213: 1200011年17月14: 26000102设置DT_字符串[1],%r2!"nfs"15: 0e020002移动%r2,%r216: 1100001e巴3017: 25000302 setx DT_整数[3],%r2!0xfffffffffc03111018: 22020002 ldx[%r2],%r219: 0e010003移动%r1,%r320: 2500004 setx DT_整数[4],%r4!A8个21:07030403添加%r3、%r4、%r322:22030003 ldx[%r3],%r323:33000000次刷新24:31000003 pushtv DT_类型(0),%r3!DT_型(0)=D型25:2f001403呼叫DIF_SUBR(20),%r3!getmajor公司26:25000504 setx DT_整数[5],%r4!0x70型27:08030403乘%r3,%r4,%r328:07020302添加%r2、%r3、%r229:22020002 ldx[%r2],快速自助建站,%r230:23000002 ret%r2在本例中,此逻辑来自/usr/lib/io.d,尤其是以下翻译:dev_name=B->;B\u dip==NULL?"nfs":stringof(`devnamesp[getmajor(B->;B_edev)].dn_name);为了实现allow trace()和print()对转换后的类型起作用,我们现在生成代码,首先使用alloca()函数中的DTrace build获取一些暂存空间,然后为转换后的类型的每个成员生成转换。例如:#dtrace-n'io:::开始{print(*args[1]);}'-SeDIFO 0x9466b0按ref返回D类型(struct)(大小780)非操作码指令00:25000001 setx DT_整数[0],%r1!0x0个01:28000101 ldga DT_VAR(0),%r1,%r102:25000102 setx DT_整数[1],%r2!0x30摄氏度03:33000000次刷新04:31000002 pushtv DT_类型(0),%r2!DT_型(0)=D型05:2f000f02呼叫DIF_SUBR(15),%r2!阿洛卡06:0e010003移动%r1,%r307:25000204 setx DT_整数[2],%r4!0xe008:07030403添加%r3、%r4、%r309:22030003 ldx[%r3],%r310: 25000004 setx DT_整数[0],%r4!0x0个11: 0f030400 cmp%r3,%r412: 1300000法国法郎1513: 0e000003移动%r0,游戏返利,%r314: 邮编:11000,邮编:0011615: 25000303 setx DT_整数[3],%r3!0x1个...316:2f001603呼叫DIF_SUBR(22),%r3!ddi_路径名317:25001204 setx DT_整数[18],%r4!0x20摄氏度318:0702004添加%r2、%r4、%r4319:25000e05 setx DT_整数[14],%r5!0x100个320:3B03004副本%r3,%r5,%r4321:23000002 ret%r2还有更多可用性是dtrace.conf几个月前。希望看到更多关于这个主题的贡献。