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

.net 限制cpu周期的程序集执行数,.net,multithreading,process,measurement,cpu-cycles,.net,Multithreading,Process,Measurement,Cpu Cycles,我有一个项目,动态加载实现指定接口的未知程序集。我不知道程序集的内容或用途,除了它实现我的接口 我需要以某种方式限制这些程序集可用的处理能力。处理器优先级不是我想要的。我不能使用秒表并为程序集分配一定的运行时间,因为服务器可能会任意繁忙 最理想的情况是,我想指定一些完全独立于负载的CPU使用度量。如有必要,我可以在程序集自己的进程中运行程序集 有没有办法测量给定线程(或进程,尽管线程是最佳的)的CPU总使用量 我可能会使用进程性能计数器,还是像我怀疑的那样,它们太不可靠了?虽然我不需要考虑循环精

我有一个项目,动态加载实现指定接口的未知程序集。我不知道程序集的内容或用途,除了它实现我的接口

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

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

有没有办法测量给定线程(或进程,尽管线程是最佳的)的CPU总使用量

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


来推断一下我的情况。我之所以不寻找流程的优先级,是因为我不怕耗尽资源,我只需要确保我可以度量给定程序集使用的“多少”资源——因此我认为服务器任意繁忙

想象一下这个示例场景,其中有两个程序集X和Y。每个程序集实现一个给定的算法,我想对哪个程序集最快完成任务进行基本测试。我运行每个程序集,让它运行,直到它使用了“Z”资源,在这一点上,我评估哪个程序集做得最好。在这种情况下,我不介意一个程序集以100%的CPU运行3秒钟,而另一个程序集在5分钟内以2%的CPU运行-这是资源的总使用量很重要


我想我可以用CPU时间计数器来做一个粗略的限制。在一个新线程中运行每个程序集,让它运行,直到它使用了给定的CPU时间,在这一点上,我将终止进程并评估结果。我只是担心它不够准确。

我想我记得Terrarium做了一些类似于你想要的东西,我建议你看看


不幸的是,我不认为通过配置加载DLL的AppDomain就可以轻松做到这一点。您可能需要重新实现Terrarium的功能。

我很好奇为什么您认为您不能(不应该)使用优先级。微软公司的人花了很长时间开发任务调度器,使所有线程/进程都能在CPU上获得同等的处理能力。如果您的计算机上运行的进程优先级较高,并且您不希望您的程序/第三方DLL影响其他程序,那么只需将您的优先级设置为低于其他程序,您就不会这样做。这才是最重要的。即使您的程序以100%的速度最大化CPU,当它想要运行时,其他程序也会替换您的进程或线程,即使优先级相等,但特别是当它具有更高的优先级时

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

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



如果您在多cpu机器上运行,另一种选择是使用亲和性将您的程序限制在某些内核上。例如,在一台四核机器上,如果您将程序限制为core3,那么它可能会失控,最大限度地利用cpu和系统的其余部分仍然有3个核来保持高可用性。

大多数X86操作系统的工作方式是使用抢占式线程调度。操作系统初始化主板上的计时器,该计时器每100毫秒向处理器发送一次中断。(这是一个执行片。性能良好的计算密集型程序通常应该在该限制之前开始等待将其放入等待队列中的内容。)当处理器获得中断时,它将执行切换到操作系统内核

因此,在技术上不可能将单核系统上的线程执行限制在比该计时器更细粒度的范围内


使用“公平”调度,您可以有一个旋转管理器(因为您不想节省电源),它可以查看各个线程的执行时间,如果它们执行时间过长,则终止它们。

您加载的程序集是否将从子进程中派生出来?否,子程序集不会派生任何子进程。通常,子进程将只运行非常基本的代码(使用CAS受到严格限制)。请参阅。使用或(后者仅适用于Vista或更高版本)。我不想限制处理器的峰值使用,我感兴趣的是限制CPU的总使用量。想象一个场景,你有两个程序集,X和Y。你让每个程序集运行,直到它们使用了完全相同的CPU功率,在这一点上,你评估哪一个做得更好。我明白了。。。我建议您阅读一些有关System.Diagnostics命名空间的文档。PerformanceCounter和ProcessThread都有您可以使用的东西。您也可以使用第三方档案器(Google for“.Net profiler”)。英特尔也有一种叫做VTune的东西。