TPL的性能指标?

时间:2011-10-26 08:48:35

标签: c# task-parallel-library performance

有没有办法看到(最好是通过内置的性能计数器)TPL排队等待它正在努力完成多少工作?

以下是关于我正在尝试做什么以及我所看到的内容的一些细节:

我有一个很大的工作负载,我正在使用Task.Factory.StartNew()(默认调度程序)卸载到.NET Threadpool。当负载超过我的系统可以处理的负载时,工作会排队,直到负载减少或内存不足。我确实更新了一个自定义性能计数器(它是一个每秒计数器)作为我处理的一部分,我可以看到这个计数器不会超过大约27 000(每秒消息数),无论我排队多少消息Task.Factory.StartNew()。

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

现在发生的是每秒低于27 000条消息,如果我停止输入,我会看到“每秒处理的消息数”计数器降至零。超过这个突破点,计数器继续记录每秒27k(取决于我积压积压的时间长度),直到其余的负载通过系统。

1 个答案:

答案 0 :(得分:2)

我认为最简单的方法就是维护另一个性能计数器,在每个任务排队时递增,并在每个任务开始时递减。

更复杂的选择是编写一个处理发布所有必需事件的自定义TaskScheduler,但我想这可能会大大减慢速度,除非小心实施,但这就是你为仪器付出的代价。然后,您可以在需要检测时切换您使用的调度程序。

以下是撰写自定义TaskSchedulerhttp://msdn.microsoft.com/en-us/library/ee789351.aspx

的文章

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