限制程序集执行的cpu周期数

时间:2008-10-24 17:06:10

标签: .net multithreading process measurement cpu-cycles

我有一个项目,可以在实现指定接口的未知程序集中动态加载。除了实现我的界面之外,我不知道程序集的内容或目的。

我需要以某种方式限制这些程序集可用的处理能力。处理器优先级不是我正在寻找的。我不能使用秒表并为程序集分配一定的时间来运行,因为服务器可能是任意繁忙的。

最理想的是,我想指定一些完全独立于负载的CPU使用量度量。如有必要,我可以在自己的进程中运行程序集。

有没有办法以某种方式衡量给定线程(或进程的总超时CPU使用率,尽管线程是最优的)?

我可能会使用流程性能计数器,还是我怀疑它们太不可靠了?虽然我不需要循环精度,但我需要相当高的精度来限制分配给每个程序集执行的计算能力。


根据我的情况推断一下。我不是在寻找流程优先级的原因是我不怕耗尽我的资源,我只需要确保我可以测量给定程序集使用的“多少”资源 - 因此我对服务器任意的观点忙。

想象一下你有两个程序集X和Y的示例场景。每个程序集实现一个给定的算法,我想对哪个程序集最快地完成工作进行原始测试。我运行每个程序集并让它运行,直到它使用“Z”资源,此时我评估哪个程序集做得最好。在这种情况下,我不介意一个程序集在100%CPU下运行三秒钟,而另一个程序集在5分钟内运行2%CPU - 这是总资源使用量很重要。

我想我可能能够使用CPU时间来实现原始限制。在新线程中运行每个程序集并让它运行,直到它使用给定量的CPU时间,此时我将终止该进程并评估结果。我只是害怕它不够准确。

3 个答案:

答案 0 :(得分:1)

我想我记得Terrarium做了类似于你想要的事情我建议看看http://www.codeplex.com/terrarium2

不幸的是,我认为只需配置加载DLL的AppDomain即可轻松实现此目的。你可能不得不重新实现Terrarium的功能。

答案 1 :(得分:1)

我很好奇为什么你认为你不能(不应该)使用优先权。微软的人们花了很长时间来开发任务调度程序,为所有线程/进程提供相同的CPU权限。如果您的计算机上运行的优先级较高的进程并且您不希望您的程序/第三方dll影响其他程序,那么只需将您的优先级设置为低于其他程序,您就不会。这是优先考虑的事项。即使你的程序以100%的速度最大化CPU,那么即使在优先级相同的情况下,其他程序也会取代你想要运行的进程或线程,但尤其是当它具有更高的优先级时。

如果您仍然坚定,那么您将不得不使用PerformanceCounter或Win32 API来监控您的进程/线程,并在超过阈值时使用Thread.Sleep。这看起来太乱了。

更好的选项(IMO)是使用自定义线程池,它允许您配置最大线程数,为您加载的每个程序集排队一个线程,将其优先级设置为低于正常值,并监视以确定最大数量产生所需性能限制的线程。可以找到一个非常好的自定义线程池here。 (.NET threadpool不允许您限制需要使用自定义线程池的原因。)


如果您在多CPU机器上运行,另一个选择是使用affinity来将程序限制为某些内核。例如,在一台四核机器上,如果你将程序限制在core3,那么它可能会变得非常疯狂并最大化cpu,而系统的其余部分仍将拥有3个内核以保持高可用性。

答案 2 :(得分:1)

大多数X86操作系统的工作方式是使用抢占式线程调度。操作系统初始化主板上的定时器,该定时器每隔100ms向处理器发送一个中断。 (这是一个执行片。表现良好的计算密集型程序通常应该开始等待在此限制之前将它们置于等待队列中的某些东西。)当处理器获得中断时,它会将执行切换到OS内核。

因此,在技术上不可能将单个核心系统上的线程执行限制为比此计时器更精细的程序。

通过“公平”调度,您可以拥有一个旋转管理器(因为您对节省功率不感兴趣),它会查看相应线程的执行时间,并在执行时间过长时终止它们。