考虑理论上的纯粹异步" .NET程序(Web服务器,就此而言) - 没有线程被阻止,所有I / O都是完全异步的。现在,假设该服务器负载很重,请求(任务)的排队速度比排队的速度快(由于I / O延迟)。显然,在这种情况下,超过num_of_cores线程不会提高吞吐量 - 服务器只是在它的限制。但是,ThreadPool会识别这个事实,还是会尝试创建越来越多的线程来减轻Tasks缓冲区的压力?
* num_of_cores是指操作系统看到的逻辑核心数。
答案 0 :(得分:1)
但是,ThreadPool会识别这个事实还是会尝试创建 越来越多的线程来减少Tasks缓冲区的压力?
CLR线程池不知道底层操作系统可以处理的IO请求数据包(IRQ)的实际数量。它有一个人工限制,它在线程池的VM实现中设置:
SVAL_IMPL_INIT(LONG,ThreadpoolMgr,MaxLimitTotalCPThreads,1000);
您可以通过调用ThreadPool.SetMaxThreads
来改变该值。执行此操作时,VM会执行此操作:
MaxLimitTotalCPThreads =
min(MaxIOCompletionThreads, (DWORD)ThreadCounter::MaxPossibleCount);
ThreadCounter::MaxPossibleCount
等于0x7FFF
(524287)完成端口线程。
线程池尝试从您那里抽象出这些操作,这是您不应该非常担心的事情。让线程池为您平衡工作,根据需要分配和销毁线程。在最糟糕的情况下,您将开始注意与IO操作相关的延迟,但我非常确定您需要花费一些精力来实际达到上限。
通常,如果您对本机实施感兴趣,可以browse it on GitHub