我的工作量类似于以下内容:
while True:
data = get_data_from_network();
filename = sha1(data);
write_to_file(filename, data, data.size());
偶尔我会读回文件,但这并不常见。重要的是,我收到了很多这样的网络请求。对我来说,用这种方法把1G的数据存储到磁盘上并不罕见.因此,在大多数情况下,我实际上只是将大量数据流式传输到磁盘。Raymond Chen的this article建议客户不要使用该标志,因为正如Raymond所说:
如果应用程序从文件中回读,则可以从磁盘缓存中完成读操作,从而完全避免物理I/O
但我不确定这是否适用于我,因为根据该高速缓存的大小,当我再次读取该数据时,它很有可能已经被其他数据挤出。
当我调用CreateFile()
时,我可以用FILE_FLAG_NO_BUFFERING
绕过这个问题,但是在我盲目地这样做之前,我想知道如何从性能的Angular 来研究这个问题的影响。我可以给我的申请计时,当然,但我想更深入。
对于初学者来说,操作系统缓存有多大?它是按进程、按文件还是全局的?尺寸是否可配置?我可以通过API查询它的大小吗?有没有办法让我调查它是否因为我的工作量而被击败?有没有一种方法可以运行我的程序,然后确定有多少磁盘读取是从内存缓存而不是从物理介质进行的?
2条答案
按热度按时间9rnv2umw1#
您可以使用Windows性能工具包(Windows SDK的一部分)来分析ETW数据。记录很容易:
然后,您可以在WPA中分析数据。对你来说,最重要的是文件I/O和磁盘使用。
磁盘显示实际的(未缓存的)硬盘访问,而文件IO显示所有文件操作,无论它们是否缓存。如果您刷新该高速缓存,则会看到由于阅读以前可以缓存的数据而导致以后的高磁盘IO。Windows缓存在待机列表中读取的所有文件,该列表基本上是空闲内存。如果你分配所有的物理内存,那么也没有磁盘缓存。您可以在任务管理器中查看大小,
“内存”选项卡并将鼠标悬停在第二个区域上。要查看实际的文件系统内容,您可以使用SysInternals中的Rammap,它可以显示哪些文件存储在Standby和其他OS maanged列表中。
有关ETW视图的更详细说明,请参见https://aloiskraus.wordpress.com/2016/10/09/how-buffered-io-can-ruin-performance/
sr4lhrrt2#
正如我在评论中所说,您可以使用性能计数器收集磁盘统计信息,如
\Storage Spaces Write Cache\
。尽管该文件警告说,Windows性能计数器针对管理/诊断数据发现和收集进行了优化。它们不适用于高频率数据收集或应用程序分析,因为它们的设计目标是每秒收集一次以上。
...
对于性能分析,您可以使用tracelog.exe和-critsec、-dpcisr、-eflag或-ProfileSource选项收集包含系统性能分析数据的ETW日志,也可以使用Hardware Counter Profiling。
System Providers未完成文档和also are not well documented。
“C:\Windows\System32\perfmon.exe”