“节流”功能

时间:2015-06-30 20:53:22

标签: c# .net c#-5.0

我正在开发一款MMORPG游戏服务器,而游戏服务器中80%的功能都不需要这种方法,使用它的20%的功能占资源使用的99%。

我正在尝试完成一个限制功能。 假设您调用了一个庞大的函数,或者您正在搜索特定条件的海量数据结构。被激活的一个调用可能导致大量的CPU使用。

例如,一个庞大的功能,当被调用时,在4秒内使用稳定的30%的CPU来完成,比如我们按照标准在拍卖系统中搜索数百万个条目。想象一下,我们有4个人同时这样做。我想制作相同的方法只需1%或更少的CPU,可能需要超过15-20秒才能返回相同的结果而不会使硬件匮乏。

截至目前,我正在使用这门课程。

public class AsyncLazy<T> : Lazy<Task<T>> 
{ 
    public AsyncLazy(Func<T> valueFactory) : 
        base(() => Task.Factory.StartNew(valueFactory)) { }
    public AsyncLazy(Func<Task<T>> taskFactory) : 
        base(() => Task.Factory.StartNew(() => taskFactory()).Unwrap()) { } 
}

这不会阻止值的初始化,并且在使用惰性值时不会阻塞。但是,在大规模操作期间,执行操作会使硬件无法完成任务,从而导致4秒内CPU使用率达到30%。我的目标是在几乎无限的时间内限制呼叫,这样他们就可以在不使硬件匮乏的情况下完成任务。

编辑: 感谢Scott Chamberlin用正确的“行话”来纠正我。我不想懒惰地调用方法,但我希望“Throttle”特定的方法调用。

1 个答案:

答案 0 :(得分:3)

如何使用您的编程语言来限制函数

正如willaien所提到的,线程优先级是你在进程中唯一的CPU限制机制之一,甚至是间接的。这是因为直接控制CPU利用率不是应用程序的责任;操作系统和处理器负责管理线程等系统资源。这允许操作系统防止单个应用程序崩溃。

如何在编程语言之外限制

您可以将强烈的计算分解为完全独立的服务。然后将此服务放在另一台可以直接控制系统或操作系统级别资源的计算机上(例如,通过硬件或使用VM添加更多内存或CPU电源)。使用VM,您可以通过设置VM CPU来“限制”该功能。您可以使用中间件(如负载均衡器)或使用队列来“限制”纯硬件解决方案或虚拟机,以限制进程内请求的数量。只要需要,这将满足您对每次计算的要求。而其他服务可能只是一个分布式缓存,(正如Scott Chamberlain所提到的)数据库存储过程,或者数据库位于不同机器上的查询。

如果采用这种方法,您可能需要调查.NET的异步模式。这还可以确保您的原始服务不受使用分布式服务时阻塞的线程的线程限制。