Filemon 是一款出色的文件
系统监视软件,它可以监视应用程序进行的文件读写操作。它将所有与文件一切相关操作(如读取、修改、出错信息等)全部记录下来以供用户参考,并允许用户对记录的信息进行保存、过滤、查找等处理,这就为用户对系统的维护提供了极大的便利。
简介
用途监视
文件系统的
性能,并且报告代表
逻辑文件、
虚拟内存段、逻辑卷和物理卷的
I/O活动。
语法
filemon [ -d ] [ -i Trace_File -n Gennames_File] [ -o File] [ -O Levels] [ -P ] [ -T n] [ -u ] [ -v ]
命令描述
工作原理
filemon命令监控文件系统和 I/O 系统事件的跟踪,并且
报告一个周期内的文件和 I/O 的访问
性能。
在它的一般
模式中,当一个或多个
应用程序或者系统
命令正在被
执行和
监控的时候,filemon 命令在后台运行。filemon 命令自动
启动并且实时
监控程序的文件系统和 I/O 事件的
跟踪。作为
缺省值,跟踪是立刻启动的;可选的是,跟踪可能被延缓直到用户发出一个 trcon 命令。为了能随意的关闭和运行监控,用户可以发出 trcoff 和 trcon 命令,当filemon 命令在运行的时候。当跟踪被 trcstop 命令中止的时候,filemon 命令生成一个 I/O 活动报告并退出。
filemon 命令也可以处理一个
跟踪文件,这个文件已经先前被跟踪工具所记录。文件和 I/O 活动报告将会基于那个文件中记录的事件。
为了更完整的提供一个应用程序的文件系统
性能的理解,filemon 命令以下面的四种水平来监控文件和 I/O 活动:
逻辑文件系统 filemon 命令监控在
逻辑文件上的
逻辑I/O 操作。被监控的操作包括所有的
读、
写、
打开、和lseek等系统调用,这个可能会还是不会导致实际的
物理 I/O,取决于这些文件是否在内存中已经被缓冲。I/O 统计信息被保存在一个基本文件中。
虚拟内存系统 filemon 命令监控
磁盘上段和它们的映像之间的物理 I/O
操作(也就是,页面调度)。I/O 统计
信息被保存在一个基本段中。
逻辑卷 filemon 命令监控
逻辑卷上的 I/O 操作。I/O 统计信息被保存在一个基本的
逻辑卷中。
物理卷 filemon 命令监控物理卷上的 I/O 操作。在这个级别上,获取了物理资源的使用。I/O 统计信息被保存在一个基本的物理卷中。
正如命令行标志所指定的那样,这四种
级别的任何组合都可以被监控。作为
缺省值, filemon 命令只监控
虚拟内存、
逻辑卷和物理卷级别的 I/O 操作。这些级别都与真实的磁盘 I/O 的请求相关。
filemon 命令把它的报告写到一个标准的输出或者一个指定的文件上。这个报告以每个被监控级别的 I/O 活动的摘要作为开始,以每个被监控级别的 I/O 活动的详细统计信息为结束。摘要和详细报告内容表述在 Reports 部分中。
注的描述
filemon命令产生的报告可能会相当长。因此,-o 选项经常被用来把报告写到一个输出文件上。当打开一个物理设备并被应用程序直接访问时,只有那些读和写的完整的 512 个字节的块会被反映到报告中。设备
驱动程序为了发出设备命令和读取设备状态所使用的『简短』读和写都被忽略。
光盘驱动器没有同心的 『
磁道』 或者 『柱面』,象在固定文件中那样。(只有一个螺旋
磁道。)因此,不可能根据柱面来报告
光盘驱动器的搜索间隔统计信息。
-u 标志被用来产生先前为了启动 trace
守护进程而打开的文件上的报告。这个数据的一些部分可能是很有用的,但是大部分的都应用到了
守护进程和其它不相关的活动中去了。这个背景信息可以是压倒性的,特别是在大的系统中。如果 /unix 文件和正在运行的
内核不是一样的,那么内核地址可能是不正确的,会导致filemon命令退出。当从一个 shell
脚本中使用 filemon 命令时,允许在显示filemon输出文件的内容之前有一个轻微的延迟。filemon 命令可能会花费几秒钟来产生这个报告。
系统跟踪工具
filemon命令使用系统跟踪工具获得原始的 I/O
性能资料。通常地,跟踪工具只支持一个输出流。因此,只有一个 filemon 或者跟踪进程能在一个时间是激活的。如果另外一个filemon或者跟踪进程已经在运行,filemon 命令会响应下列的消息:
/dev/systrace: Device busy当监控很强的 I/O 应用程序时,filemon命令可能不能实时地处理产生的跟踪事件。当上面的情况发生时,错误消息如下:
Trace kernel buffers overflowed, N missed entries这个消息将显示在 stderr上,标志着当跟踪缓冲区满的时候到底有多少跟踪事件被丢失。filemon 命令将继续监控 I/O 活动,但是报告的精确性降低到了某个未知程度。一个避免溢出的方法是监控文件和 I/O 子系统的较少的级别:跟踪事件产生的数目是与监控级别的个数成比例的。另外,跟踪缓冲区的大小可以通过使用 -T 选项来增加,这样就能在溢出前提供更大的跟踪事件容量。记住增加跟踪缓冲区的大小会导致更多的引脚内存,并且因此可能影响 I/O 和页面调度的行为。
在
存储受限的环境(要求的
存储容量比可供给的内存要多),-P 选项可以被用来引脚内存中的实时 filemon 进程中的文本和资料页,这样这些页面就不会被替换掉。如果不用 -P 选项,允许 filemon 进程被替换掉,filemon 命令的前进可能被延迟,地点是在它不能足够快地处理跟踪事件的地方。这个情况导致跟踪缓冲区如上面情况描述的那样溢出。当然,插入这个进程将从应用程序(尽管 filemon 命令不是一个大程序,但是它的
进程映像也能达到 500KB)中释放内存。
在使用 filemon 命令去处理一个存在的跟踪数据文件前,您必须使用 -r 选项在 trcrpt 命令中去把跟踪资料顺序的重写入一个新的文件。否则,filemon 命令产生下列的错误消息然后退出:
error: run 'trcrpt -r' on logfile first-i Trace_File 和 -n Gennames_File 标志允许跟踪数据文件的 filemon
脱机处理,这些文件是利用 trace 命令创建的。如果有一个存在,两个标志都必须指定。当必须后期处理一个来自远程机器的
跟踪文件或者在一个时间执行跟踪资料收集工作而在另一个时间后期处理它的时候,这些标志是很有效的。当系统负载很大或者 filemon 丢失了跟踪 hook 时,这些标志也是很有用的。
gennames 文件(包括文件系统信息)必须使用在跟踪来源处的机器上。而且,在与系统
跟踪文件创建接近的时刻运行 gennames 是明智的,这样两个系统配置就是一样的了。
与 filemon 相关的跟踪 hook 必须被 trace 命令所收集并且被 trace -j 标志所指定。当filemon 以 -v 标志调用时,相关的跟踪 hook 会列出。包含 -f 选项的 gennames 命令将被执行,它的输出被保存在 Gennames_File 中以收集 filemon 的附加消息。-f 选项被用来和 gennames 命令一起去收集
逻辑卷和物理卷的设备信息。它也用来获取脱机的 filemon 使用的
虚拟文件系统的信息。一旦执行了 trace 命令,trcrpt -r 必须在跟踪日志文件上运行并重定向到另外一个文件中。那么该文件和 Gennames_File 就可能提供给 filemon。
报告
摘要
每个由 filemon 命令生成的报告有一个指示日期、机器名称和按秒计数的监控周期长度的报头。在监控周期内的 CPU 使用情况也在报告中体现。
下一个,对每个被监控的文件系统级别,都会生成摘要报告。作为
缺省值,
逻辑文件和
虚拟内存的报告分别限制在最多 20 个活动文件和段,可以通过转换数据的总数量来计算该数目。如果指定了 -v 标志,所有文件和段的活动都会被报告。每个报告文件、段或者卷都有一行。四个摘要报告的每一行的栏都描述如下:
最活动的文件报告
栏 描述
#MBS 到/从文件中传输的兆字节的总数量。这些行以递减的顺序按该字段排序。
#opns 在评估周期内,文件被打开的次数。
#wrs 对文件的系统写入调用数目。
file 文件名(完整的路径名称在详细报告中)。
volume:inode 包含文件和文件 i 节点数目的卷的名称。该字段可以用来把一个文件和它的相应的持久段联系起来,在
虚拟内存I/O 报告中显示。该字段可以是空的;例如,对于在执行过程中创建和删除的临时文件。
最活动的段报告
栏 描述
#MBS 从/到段的传输的兆字节的总共数目。这些行以递减的顺序按该字段排序。
#rpgs 从
磁盘(也就是页)读入到段的那些 4096 个字节的页的数目。
#wpgs 从段写入到磁盘(到处页)的那些 4096 个字节的页的数目。
segid 段的内部标识。
segtype 输入段:工作段、持久段(本地文件)、客户机段(远程文件)、页面表段、系统段、或者特殊的永久段,这些特殊的段包含文件系统数据(
日志、根目录、.inode、.inodemap、.inodex、.inodexmap、.indirect、.diskmap)。
volume:inode 对持久的段来说,包含关联文件的卷的名字和文件的 i 节点数目。该字段可以用来把一个永久段和它的相应文件联系起来,在文件 I/O 报告中显示。该字段对非持久段来说是空的。
注:
虚拟内存分析工具,
svmon可以用来显示关于一个给定段标志(segid)的段的更多信息,如下:
栏 描述
#rblk 从卷中读入的 512 字节的块的数目。
#wblk 写入卷的 512 字节的块的数目。
volume 卷的名称。
描述 卷的内容:或者是一个文件系统的名字,或者是
逻辑卷的类型(调页、jfslog、引导、或者系统转储)。还指示文件系统是否是片段的或者压缩的。
最活动的物理卷报告
栏 描述
util 卷的使用情况(忙的时间片)。这些行以递减的顺序按该字段排序。
#rblk 从卷中读入的 512 字节的块的数目。
#wblk 写入卷的 512 字节的块的数目。
volume 卷的名称。
描述 卷的类型,例如,120MB disk、355MB SCSI、或者 CDROM SCSI。
注:
逻辑卷 I/O 请求在物理卷的 I/O 请求之前开始,之后结束。因为这个原因,总共的
逻辑卷利用率看起来要比总共的物理卷利用率高一些。
详细
最后,为每个被监控的文件系统级别都会产生详细报告。可以通过传输数据的总数量来计算该数目。如果指定了 -v 标志,所有文件和段的活动都报告。每个被报告的文件、段或者卷都有一个记录。
一些字段报告一个单独的值,其他的一些报告表现许多值的分布情况的统计信息。例如,对所有被监控的读和写的请求,响应时间的统计信息都会被保留。平均的、最小的和最大的响应时间和响应时间的标准差被报告出来。标准差用来显示个别响应时间偏离平均值的程度。大约有三分之二的样本响应时间是在平均值 - 标准偏差和平均值 + 标准偏差以内。如果响应时间的分布散布在较大范围中,标准偏差相比平均响应时间就会很大。在以下列表中描述了四个详细报告:
文件状态详细报告
栏 描述
FILE 文件名称。如果可能的话,给出完整的路径名称。
volume 包含文件的
逻辑卷或者文件系统的名称。
inode 在文件系统中的文件的 I 节点数目。
opens 监控时打开文件的次数。
total bytes xfrd 从/到文件的读或者写操作的字节总数目。
reads 对文件的读取调用的数目。
read sizes (bytes) 按
字节的读取的传输大小的统计信息(avg/min/max/sdev)。
writes 对文件的写入调用的数目。
write sizes (bytes) 写入传输大小的统计信息。
write times (msec) 写入的响应时间的统计信息。
seeks 子例程调用 lseek 的数目。
VM 段状态的详细报告
栏 描述
SEGMENT 内部的段标识。
segtype 段内容的类型。
segment flags 不同的段属性。
volume 对永久段来说,包含相应文件的
逻辑卷的名字。
inode 对持久段来说,相应文件的 i 节点数目。
reads 读入段(也就是页)的 4096 字节的页的数目。
read times (msec) 按毫秒计的读取响应时间的统计信息(avg/min/max/sdev)。
read sequences 读取序列的数目。一个序列就是被连续读入的页面的一个字符串。读取序列的数目是顺序访问数量的一个指示符。
read seq. lengths 按页面来描述读取序列长度的统计信息。
writes 从段写的页面数目。
write times (msec) 写入响应时间的统计信息。
write sequences 写入序列的数目。一个序列就是被连续写入的页面的一个字符串。
write seq.lengths 按页面描述的写入序列长度的统计信息。
逻辑卷和物理卷状态的详细报告
栏 描述
VOLUME 卷的名字。
描述 卷的描述。(如果讨论一个
逻辑卷则描述内容,如果处理一个物理卷则描述类型。)
reads 对卷的读取请求的数目。
read sizes (blks) 以 512 字节的块为单位的读取传输大小的统计信息(avg/min/max/sdev)。
read sequences 读取序列的数目。一个序列就是能连续读入和显示顺序访问数量的 512 字节块的一个字符串。
read seq. lengths 按块描述读取序列长度的统计信息。
writes 对卷的写入请求的数目。
write sizes (blks) 写入传输大小的统计信息。
write sequences 写入序列的数目。一个序列就是被连续写入的 512 字节块的一个字符串。
write seq. lengths 按块描述写入序列长度的统计信息。
seeks 读取或者写入请求之前的搜索数目;也可以表达为需要搜索的读取和写入总数的百分比。
seek dist (blks) 以 512 字节块为单位搜索间距统计信息。除了通常的统计信息(avg/min/max/sdev)以外,初始搜索操作(假定从块 0 作为开始位置)的间距也被单独报告。这个搜索间隔有的时候会很大,因此单独报告以避免偏移其他的统计信息。
seek dist (cyls) (只是固定文件。)以磁盘柱面为单位搜索间距的统计信息。
time to next req 按毫秒描述的时间长度的统计信息(avg/min/max/sdev),这个时间是在对卷的连续读取或者写入的请求之间。这一栏显示卷的被访问率。
throughput 总共的卷吞吐量,按千字节每秒。
utilization 卷的时间片忙。在这个报告中的记录以递减的顺序按这个字段排序。
标志
-i Trace_File 从指定的 Trace_File 中读取 I/O 跟踪数据,而不是从实时的跟踪进程。filemon 报告概括了
跟踪文件显示的系统和周期的 I/O 活动。
注:
跟踪数据文件通常以循环的方式记录。如果跟踪数据环绕舍入,那么跟踪的顺序开始和结束就可能在文件的中间发生。使用 trcrpt 命令的原始方式来顺序重写数据,这项工作要在调用 filemon 命令之前执行,如下:
trcrpt -r file > new.file为了报告能精确,
跟踪文件必须包括被 filemon 命令所需要的所有 hook。
还必须指定 -n 选项。
-n Gennames_File 为了脱机跟踪处理而指定一个 Gennames_File。该文件通过运行带有 -f 选项的 gennames 命令来创建,并且把输出重定向到一个文件中,如下:
gennames -f > file也必须指定 -i 选项。
-o File 写 I/O 活动报告到指定的 File,而不是到stdout 文件。
-d 启动 filemon 命令,但是一直推迟跟踪直到用户执行 trcon 命令。作为缺省值,跟踪是立刻启动的。
-T n 设置
内核的跟踪缓冲区大小为 n 字节。缺省值的大小是 32,000 字节。如果可以,缓冲区的大小可以通过提供更大的事件容量来增加。(一个典型的事件记录大小是 30 字节。)
注:
内核中的跟踪
驱动程序使用
双缓冲区,这样事实上就有两个大小分配为 n 字节的缓冲区。而且,注意这些缓冲区是插入到存储器中的,所以它们不受页面调度支配。大的缓冲区可能会影响页面调度和其他 I/O 的性能。
-P 在
存储器中插入监控进程。-P 标志导致 filemon 命令的文本和数据页按监控周期的时间插入到存储器中。使用该标志可以保证当运行一个存储受限环境时,实时的 filemon 过程不会 page out。
-v 在报告中打印额外的信息。-v 标志最重要的影响是被访问的所有的
逻辑文件和所有的段都包括在了 I/O 活动报告中,而不是仅仅有最多 20 个活动文件和段。
-O Levels 只监控指定的文件系统级别。有效的级别标识是:
lf
vm
虚拟内存级别
lv
逻辑卷级别
pv
物理卷级别
all
lf, vm, lv, pv的简单表示
vm、lv,和 pv 级别都是默认的缺省值。
-u 关于将在 trace
守护进程的启动之前先打开的文件的报告。进程标识(PID)和
文件描述符(FD)被文件名所代替。
注:
既然 PIDs 和 FDs 都是可重用的,那么就有可能看到以相同名字的字段报告的不同文件。
示例
要监控文件系统的
虚拟内存、逻辑卷和物理卷级别的物理 I/O 活动,请输入:
filemonfilemon 命令自动启动系统跟踪并且把它放到后台。该命令后,输入在这个时刻要运行的应用程序和系统命令,请输入:
trcstop在执行了trcstop 命令后,I/O 活动报告就会显示在标准的输出设备上(但是可能无法滚屏)。
虚拟内存的 I/O 报告会被限制在可能导致最多 I/O 的 20 个段。
要按所有的文件系统级别来监控活动,并把报告写入到文件 fmon.out 中,请输入:
filemon -o fmon.out -O allfilemon 命令自动启动系统跟踪并且把它放到后台。该命令后,要输入在这个时刻要运行的应用程序和系统命令,请输入:
trcstop在执行了 trcstop 命令后,I/O 活动报告被写入fmon.out 文件中。所有的四个级别的文件和 I/O 系统(
逻辑文件、虚拟内存、逻辑卷和物理卷级别)都会被监控。逻辑文件和虚拟内存的 I/O 报告限制在导致最多 I/O 的 20 个文件和段(分别地)。
要监控在所有文件系统级别上的活动,并且把一个详细的报告写到文件 fmon.out 中,请输入:
filemon -v -o fmon.out -O allfilemon 命令自动启动系统跟踪并且把它放到后台。该命令后,输入在这个时刻要运行的应用程序和系统命令,请输入:
trcstop除了详细的报告是生成在文件 fmon.out 中的以外,本例和前面的一个例子是类似的。主要的区别在于 filemon 命令将指出它正在启动跟踪的步骤,并且摘要和详细信息的报告将包括所有导致任何的 I/O(可能有很多)的文件和段,而不是只有最多 20 个。
要报告先前记录的一个跟踪会话捕获的 I/O 活动,请输入:
filemon -i trcfile | pg在本示例中,filemon 命令从输入文件 trcfile中读取文件系统跟踪的事件。输入文件必须已经是初始的跟踪格式,作为运行 trcrpt -r 命令的一个结果。既然跟踪数据已经在一个文件中被捕捉,filemon 命令就不再把它自己放置到后台以使其他的应用程序能够运行。整个文件读取后,一个关于
虚拟内存、逻辑卷和物理卷级别的 I/O 活动报告将会被显示在标准输出(这种标准输出,在本例中,是通道 pg)。
要只监控
逻辑和物理卷的 I/O 活动,同时使用 trcon 和 trcoff 命令控制监控的间隔,请输入:
filemon -d -o fmon.out -O pv,lvfilemon 命令自动启动系统跟踪并且把它放到后台。该命令之后,输入要在这个时刻运行的不被监控的应用程序和系统命令,请输入:
trcon在该命令后,输入要在这个时刻运行的被监控的应用程序和系统命令,请输入:trcstop在本示例中,-O 标志只被用来限制监控
逻辑和物理卷。只有那些与
逻辑和物理卷相关的跟踪事件才被启用。而且,作为使用 -d 标志的一个结果,监控最初是被延缓一直到执行了 trcon 命令。通过使用 trcoff 和 trcon 命令,系统跟踪可以被间断地禁用和重启用,这样就能只监控特殊的间隔。
为了在
脱机方式下运行 filemon,分别运行trace 和 gennames 命令,然后把从那些命令中得到的输出作为 filemon 命令的输入,如下:
trace -a -T 768000 -L 10000000 -o trace.out -j 000,000,001,002,003,005,006,139,102,10C,106,00A,107,
101,104,10D,15B,12E,130,163,19C,154,3D3,1BA,1BE,1BC,10B,221,1C9,222,228,232,45B运行被监控的应用程序和系统命令,请输入:
trcstop然后格式化文件 trace:
trcrpt -r trace.out > trace.rpt创建文件 gennames:
gennames -f > gennames.out然后运行 filemon 附带着 -i 和 -n 标志:
filemon -i trace.rpt -n gennames.out -O all