TPL的性能计数器

本文关键字:性能计数器 TPL | 更新日期: 2023-09-27 18:12:30

是否有任何方法可以查看(最好通过内置的性能计数器)TPL有多少工作排队,它正在尝试完成?

这里有一些关于我正在尝试做的事情和我所看到的细节:

我有一个大的工作负载,我正在卸载到。net线程池使用Task.Factory.StartNew()(默认调度程序)。当负载超过系统的处理能力时,工作将排队,直到负载减少或内存耗尽。作为处理的一部分,我更新了一个自定义性能计数器(这是一个每秒计数器),我可以看到,无论我用Task.Factory.StartNew()队列中有多少消息,这个计数器都不会超过27000(每秒消息)左右。

我的问题更多的是关于监控,而不是关于使系统性能更好的建议——我可以做微优化,但目前在性能计数器中没有可见性,工作正在建立。除了优化之外,我还希望能够准确地看到TPL缓冲了多少工作,这样我就可以衡量系统的响应性。我想看看在输入端放入一个新消息是否会导致立即处理(零延迟),或者在我看到请求的结果之前是否会有一些延迟。

现在发生的是低于每秒27000条消息,如果我停止输入,我看到"每秒处理的消息"计数器降为零。在这个断点之上,计数器继续以每秒27k的速度注册一段时间(取决于我让积压积累了多长时间),直到剩余的负载通过系统。

TPL的性能计数器

我认为最简单的事情是维护另一个性能计数器,每个任务排队时递增,每个任务启动时递减。

更复杂的选择是编写一个自定义的TaskScheduler来处理发布所有必需的事件,但我再次想象,除非仔细实现,否则这可能会大大降低速度,但这是您为仪表付出的代价。然后,您可以仅在需要检测时才切换使用的调度器。

这是一篇关于编写自定义TaskScheduler的文章:http://msdn.microsoft.com/en-us/library/ee789351.aspx

如果你确实写了这个TaskScheduler实现,虽然我认为它对社区有用,所以请在这里发布结果,也许把代码放在GitHub上:)