我正在研究一个基准测试工具,其中包括测量执行操作的外部过程使用的时间和内存。我最感兴趣的是峰值可分页内存大小(a.k.a. PageFileBytesPeak性能计数器/ Process.PeakPagedMemorySize64 /峰值专用字节)。这是一个.NET项目,所以纯.NET解决方案会更好,但这很可能不是一种可能性。测量过程高峰内存使用率验尸
这里的问题是我不知道进程退出前的峰值内存使用情况。当过程不再存在时,我无法读取过程的性能计数器。所以我可以在流程运行的时候轮询它。
然而,这并不是优选的,因为如果我经常轮询,我会干扰该过程完成其工作所花费的时间,并且如果轮询结果太少,结果将不准确(该过程很可能会中断它的峰值内存使用权在退出之前)。所以我希望有一些方法来做到这一点确实比我想出了迄今为止的解决方案少哈克:
- 进样DLL注入过程中,通过对DLL_PROCESS_DETACH IPC机制报告的价值。
- 在执行真正的ExitProcess之前,在目标进程中修补/挂钩ExitProcess,通过IPC机制报告值。
- 假装为调试器,测量EXIT_PROCESS_DEBUG_EVENT上的值(在调用ContinueDebugEvent之前,内核不会清理进程)。
即使忽略与使用我还是有问题的过程可能最后一次量子内分配大量内存的问题时干扰的可能性,这将意味着我不能如果我的代码被安排在与分配内存的线程相同的内核中,无论我轮询的速度如何,都可以看到它。这个操作可能需要不到200ms才能完成,而在服务器系统上的时间约为180ms,我甚至没有机会在流程启动和退出之间获得时间片。 – poizan42 2013-03-22 17:29:16
我同意,如果您担心流程关闭(或民意调查之间)的巨大峰值,那么投票是不够的。我只是想知道这是否真的像你想象的那样是一个问题,考虑到它的额外成本。 – 2013-03-22 17:49:49
不幸的是,这是一个基准工具,其主要目的是基准新的后端(它实际上是测试不同的引擎进行PDF转换和连接,但这不是真的与问题相关),所以你可能是对的,它赢了不需要,但我事先不知道。似乎我将不得不去dll注入路线。 – poizan42 2013-03-25 12:04:35