线程池是否会在 "pure async" 程序中创建多于 {number of cores} 个线程?
Will the Thread Pool create more than {num of cores} Threads in a "pure async" program?
考虑一个理论上的 "pure async" .NET 程序(一个 Web 服务器,就此而言)- 没有线程被阻塞,所有 I/O 都是完全异步的。现在,假设该服务器负载很重,并且请求(任务)排队的速度比入队的速度快(由于I/O 延迟)。显然,在那种情况下,超过 num_of_cores 个线程不会提高吞吐量 - 服务器只是处于极限状态。但是,ThreadPool 会认识到这个事实还是会尝试创建越来越多的线程来减少任务缓冲区的压力?
*num_of_cores 指的是 OS 看到的逻辑核心数。
But, will the ThreadPool recognize that fact or will it try to create
more and more thread to decrease the pressure on the Tasks buffer?
CLR 线程池不知道底层 OS 可以处理的 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
考虑一个理论上的 "pure async" .NET 程序(一个 Web 服务器,就此而言)- 没有线程被阻塞,所有 I/O 都是完全异步的。现在,假设该服务器负载很重,并且请求(任务)排队的速度比入队的速度快(由于I/O 延迟)。显然,在那种情况下,超过 num_of_cores 个线程不会提高吞吐量 - 服务器只是处于极限状态。但是,ThreadPool 会认识到这个事实还是会尝试创建越来越多的线程来减少任务缓冲区的压力?
*num_of_cores 指的是 OS 看到的逻辑核心数。
But, will the ThreadPool recognize that fact or will it try to create more and more thread to decrease the pressure on the Tasks buffer?
CLR 线程池不知道底层 OS 可以处理的 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