Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1150962
  • 博文数量: 286
  • 博客积分: 3124
  • 博客等级: 中校
  • 技术积分: 5186
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-24 23:42
个人简介

Bomi

文章存档

2015年(1)

2013年(1)

2012年(281)

2008年(3)

分类: 虚拟化

2012-02-05 12:49:22

一 D语言特性
我们在学习计算机语言的时候,大都有过这样的经历,那就是语法和规则看起来很简单,但是一旦组合起来之后,就有了千变万化。 一般来说越高级的语言越容易理解,和英语的常用语法就越类似。
D语言是Dtrace里面用来编程的一种语言, 这种语言的设计目的是让我们能够显示,统计操作系统内核的信息。而不是完成复杂的商业逻辑和运算,这个目的决定着这种语言的特性,他的语法相对简单易懂, 很多地方和C语言非常类似, 没有了C语言里面的if, while这些条件循环。
当前UNIX环境被很多企业选择为商业应用的基本平台,其中一个重要的原因就是它的稳定性,能够提供一个稳定的应用环境。在计算机技术发展飞速的今天,Unix仍然具有无可替代的作用。尤其在用作企业级服务器方面,Unix的高性能、高可靠性仍然是其他操作系统的计算机所不能比拟的。
Unix操作系统的历史漫长而曲折,它的第一个版本是1969年由Ken Thompson在AT&T贝尔实验室实现的。后来Ken Thompson和Denni Ritchie使用C语言对整个系统进行了再加工和编写,使得Unix能够很容易的移植到其他硬件的计算机上。从那以后,Unix系统开始了令人瞩目的发展。

Solaris 10操作系统是行业领先的UNIX平台,它集成了强大的全新功能,性能、可用性和安全性极高。Solaris 10不仅支持SPARC处理器,在AMD Opteron 和 Intel Xeon
处理器的服务器上也同样可以运行Solaris 10,这不仅为用户提供了更多的平台选择,而且也意味着可以在低端和高端系统中使用同样的操作系统,而不折损性能、可用性、可扩展性或安全性。
虽然操作系统提供了很好的稳定性,但是在实际应用中,会发生各种可能的意外事件.比如某个进程在某些极端的情况下发送了一个退出信号给我们的应用, 造成了应用的异常退出,这个过程发生了以后很难重现,我们在实验室里不论怎样模拟都不可能找到应用退出的原因. 那么,到底是谁关闭了这个进程,就成为了一个谜. 很难跟踪到真正的凶手.
为了解决在这种意外情况下发生的问题,我们往往需要建立一个模拟环境. 这不是一个 容易的工作, 比如我们用到了很多的服务器和很多的应用, 如何安装和调整这些环境, 让他们运行在一个和实际相同的环境下,是一个十分复杂的工作, 花费的开销也是巨大的.
我们也可以通过强制产生一个Core Dump的方法, 将运行时刻的内存复制到一个文件中. 通过某些工具比如dbx, mdb来对这个内存文件进行分析,找到当初产生问题的原因. 这样做的缺点是很明显的,如何掌握这个时间? 我们不能希望程序在出错以前通知,也不太可能通过事先估计时间来进行监控.
传统上的UNIX/Linux系统提供一些统计分析工具, 比如vmstat,iostat,mpstat这些工具可以提供一些系统级别的统计分析信息,但是缺乏对每个进程,每个用户的分析和统计的能力.
所以,我们需要建立一套新的跟踪系统.
这个系统应该是一个动态的,可以观察的系统, 我们可以根据自己的兴趣选择所要观察的对象,可以动态的打开和关闭观察点; 这套系统应该足够强大,有足够的能力来收集我们感兴趣的任何数据; 这套系统应该有很好的性能,在产品环境下打开这套系统不会对应用性能有什么影响; 这套系统应该足够安全, 不会因为观察某个应用而对应用本身产生不良的后果.
SUN在Solaris10的代码里实现了这套系统,这就是Dtrace.
二 什么是Dtrace
在Solaris 10当中, 操作系统的开发人员实现了大概有3万多个Dtrace的观测点(Probe), 这个数目还在不断的增加当中. 如此强大的功能保证了用户可以对任何感兴趣的数据进行追踪. 用户也可以根据自己的需要,编写自己需要的观测点,
Dtrace 里面的观测点,采用了一种新的编程语言, Language D, 语法类似于C,很多C语言的开发人员会比较熟悉.这些观测点都是轻量级的, 打开观测点对系统性能的影响几乎是可以忽略不计的. 因为这些观测点是在操作系统内部实现的, 操作系统的开发人员保证了这些观测点是安全的, 我们可以完全透明的使用它们,就好像使用其他操作系统的功能一样方便.
我们首先来看一个实际的例子:
# dtrace -n BEGIN -n END
dtrace: description BEGIN3 matched 1 probe
dtrace: description END3 matched 1 probe
CPU ID FUNCTION:NAME
0 1 :BEGIN
^C
0 2 :END

这个例子里面打开了两个观测点, 一个是BEGIN, 在所有其他观测点之前执行, 一个是END, 在关闭了所有其他的观测点之后打开执行。 有与我们只是打开了这两个观测点,而并没有在其中执行任何程序,所以系统只是把缺省的输出打印出来。
首先显示找到了这样的两个观测点,然后执行里面的代码, 因为用户没有编写任何代码, 所以把BEGIN的名字和所运行的CPU编号,还有这个观测点的编号打印出来。
当我们ctrl + C退出这个命令的时候,激活了END观测点, 这时候把里面缺省的显示内容打印出来,和BEGIN 一样。

三 Hello World
我们学习语言最快的方法莫过于自己动手编写一个例子,而编写离子最常见的就是"Hello World", 下面让我们看一看在Dtrace的D语言里面是如何编写一个打印 "Hello World"内容的程序的。
#!/usr/sbin/dtrace -s
BEGIN
{
printf("Hello Worldn");
exit(0);
}
END
{
printf("Goodbye n");
}

首先我们用编辑器编写一个这样的文本文件, 编辑器的种类有很多,我个人最常用的还是vi, 这里面第一行的内容是说明下面的这个脚本文件用 dtrace命令来解释, -s表示这是一个脚本文件。 然后是观测点的名字, 我们首先编写的是BEGIN, 大括号里面的内容就是实际代码,这里面只做两件事,首先打印"Hello World", 然后退出这段程序,退出的时候就会激活END观测点,里面的代码打印一个"Goodbye"的信息。
结果就像这样:
# chmod 777 hello.d
# ./hello.d
dtrace: script. './hello.d' matched 2 probes
CPU ID FUNCTION:NAME
0 1 :BEGIN Hello World
0 2 :END Goodbye

四 Dtrace的原理

首先我们要区分里面不同的dtrace名词, 第一个是小写的dtrace(1M), 这是一个Solaris的命令,第二个是小写的dtrace(7D), 这是一个设备和网络的接口,第三个是首字母大写的Dtrace, 这是一个操作系统底层结构。了解这些dtrace 之间的不同对我们后面的原理部分会非常有帮助。
他们的工作原理是这样的, 我们编写了一个文本的D语言程序, 比如a.d, 交给dtrace负责解释,他首先编译这段代码,然后进行一段安全性检查,好像 Java编译器的工作一样,编译好的代码通过接**给Dtrace来执行,Dtrace结构的后面是各个功能系统的真正实现(Provider)。因为Dtrace只是一个可观测的系统结构, 真正的观测是在不同的功能系统中实现的。
在Solaris 10里面,我们的很多统计命令,比如lockstat, plockstat都进行了重写,通过Dtrace结构来实现。
在后面我们如果不作说明,Dtrace将表示Solaris的底层系统结构。

五D语言
下面我们看看具体的D语言是如何编写的, 也就是说,我们应该按照什么规则编写一段Dtrace代码。
probe description
/ predicate /
{
action statements
}
Dtrace 程序的执行过程非常简单, 首先是一个名字,就是这个观测点的名字描述, 然后是一个断言, 熟悉C语言的读者都会很清楚断言的作用,只有当断言为真的时候, 才会往下继续执行。 这样做的原因是Dtrace支持通配符,很可能我们的调用的观测点名字匹配了成千上万个观测点,那么这段程序就会被调用很多次,观测出来的结果淹没在信息的大海中,失去了原来的意义。里面的Action就是程序的基本部分了。
这里我们浏览一遍Dtrace 的执行原理, 这个可观测的系统是由无数个小的观测点组成的,让我们假想一个摩天大楼, 里面有无数的探测器,好比烟雾探测器, 温度探测器,等等。 通过观测这些探测器的状态, 我们可以知道当前发生的情况。这些探测器只是表面的部分,在这个大楼的内部,还有很多很多的管道,电线,数据装置来支持这些探测器。 这就是我们说的功能实现部分。
为了便于理解,每一个探测器都有一个名字, 这个名字是一个四段组成的组合。 好比一个大楼,我们要定位一个探测器的时候首先要说明楼层,然后说明房间号,然后说明具体的哪一个屋子,和什么类型的探测器。在Dtrace里面,命名规则是这样的:
provider:module:function:name
第一个就是provider的名字, 第二个是模块的名字,第三个是函数的名字,最后一个是观测点的名字。
例如:
proc:unix:mutex_exit_critical_start:start
这个观测点的名字表示他是一个proc系统功能中,unix模块里面,mutex_exit_critical_start函数上的观测点,这个观测点的名字叫start.
如果我们省略其中一个字符串,比如不写函数的名字, 那么就表示通配该模块下面所有的函数。
六 结论
Dtrace 是Solaris 10上的一个新功能。 通过Dtrace,用户可以实时跟踪、调节系统并进行故障排除。 Dtrace是一个动态的可观测框架。可以让用户到看整个Solaris内部感兴趣的任何数据。配合以Dtrace 简单易学的D语言, 管理员可以发现先前隐蔽的问题。而对于开发人员来说,通过观察Dtrace内核之间的活动,可以分析和优化应用程序性能,缩短了测试周期。
阅读(1886) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~