System Usage(Instruments)
似乎仅跟踪显式文件io调用(open
,close
,write
,read
)。 System Trace(Instruments)
跟踪page fault
,但是它是由调用堆栈组织的,因此很难进行过滤。
那么,任何工具都可以跟踪特定文件的低级io事件?
答案 0 :(得分:1)
DTrace可以执行某些操作(至少在Solaris中,您必须在macOS上尝试一下)。 vm
提供程序具有名为fspgin
,fspgout
和fsfree
的探针,当FS支持的页面被调入或调出内存或在未修改的情况下被释放时,它们将触发, 分别。还有一种更通用的名称为maj_fault
,它在页面错误导致IO时触发。
唯一的问题是DTrace不能为您提供从这些探针返回文件名的方法,如果您主要是在单个文件上出现页面错误,那么这可能没问题,或者如果您这样做,可能真的很烦人。重新尝试找出要分页的文件。但是,在有帮助的情况下,您仍然可以获取导致页面错误的过程的execname
或pid
。
Here’s,您可以在其中查看vm
提供程序的文档。那里有一些示例脚本,但是这可能是最适合使用的脚本:
vminfo:::maj_fault,
vminfo:::zfod,
vminfo:::as_fault
/execname == "soffice.bin" && start == 0/
{
/*
* This is the first time that a vminfo probe has been hit; record
* our initial timestamp.
*/
start = timestamp;
}
vminfo:::maj_fault,
vminfo:::zfod,
vminfo:::as_fault
/execname == "soffice.bin"/
{
/*
* Aggregate on the probename, and lquantize() the number of seconds
* since our initial timestamp. (There are 1,000,000,000 nanoseconds
* in a second.) We assume that the script will be terminated before
* 60 seconds elapses.
*/
@[probename] =
lquantize((timestamp - start) / 1000000000, 0, 60);
}
这会为每种类型的故障打印出内存活动的时间表,文档会对此进行更详细的说明。
答案 1 :(得分:0)
这两个系统使用工具都依靠Kdebug来获取其信息。您可以使用内置的ktrace(1)(或第三方工具,如kdv(http://newosxbook.com/tools/kdv.html))直接监视Kdebug(如果您是root用户),这两种方法都会为您提供所有的Kdebug消息,您可以稍后使用grep(1)等应用的过滤器。如果启用了SIP,则无法使用Dtrace(并且在性能方面也很痛苦)-因此Kdebug是一个不错的选择。