如何调查Win32应用程序中的磁盘缓存使用情况?

问题描述 投票:0回答:1

我的工作量类似于以下内容:

while True:
    data = get_data_from_network();
    filename = sha1(data);
    write_to_file(filename, data, data.size());

我偶尔会从文件中读回,但这种情况并不常见。重要的是,我收到了“很多”这些网络请求。以这种方式将一千兆字节的数据写入磁盘对我来说并不罕见。因此,在大多数情况下,我实际上只是将大量数据流式传输到磁盘。 Raymond Chen 发表了这篇文章,他建议客户不要使用该旗帜,因为正如 Raymond 所说:

如果应用程序从文件中读回,则可以从磁盘缓存中满足读取,完全避免物理 I/O

但我不确定这是否适用于我,因为根据缓存的大小,很有可能当我再次读取该数据时,它已经被其他一些数据推出了。

当我调用

FILE_FLAG_NO_BUFFERING

时,我可以用

CreateFile()
绕过这个,但在我盲目地这样做之前,我想知道如何从性能的角度来调查它的影响。当然,我可以为我的申请计时,但我想更深入。
对于初学者来说,操作系统缓存有多大?是按进程、按文件还是全局?大小可以配置吗?我可以通过 API 以编程方式查询其大小吗?有没有办法让我调查它是否因我的工作量而受到打击?有没有办法运行我的程序,然后确定从内存缓存而不是从物理介质提供了多少磁盘读取?

正如我在评论中所说,您可以使用

性能计数器
windows winapi etw windows-kernel
1个回答
0
投票
\Storage Spaces Write Cache\

。尽管文件警告说

Windows 性能计数器针对以下方面进行了优化
管理/诊断数据发现和收集。他们不是
适用于高频数据收集或应用
分析,因为它们的设计目的不是多次收集
每秒。
...

为了进行分析,您可以使用系统收集 ETW 日志 使用
tracelog.exe

和 -critsec、-dpcisr、-eflag 或 - 来分析数据 -ProfileSource 选项,或者您可以使用硬件计数器分析。

系统提供商

没有完成文档记录,并且
也没有很好的文档记录

“C:\Windows\System32\perfmon.exe”

© www.soinside.com 2019 - 2024. All rights reserved.