考虑一个理论上的“纯异步”.NET程序( web服务器)--没有线程被阻塞,所有I/O都是完全异步的。现在,假设服务器上负载很重,请求(任务)排队的速度比排队快(因为I/O延迟)。显然,在这种情况下,比num_of_cores线程更不能提高吞吐量--服务器只是处于极限。但是,ThreadPool会认识到这个事实吗?还是会尝试创建越来越多的线程来减少对任务缓冲区的压力?
*num_of_cores指的是操作系统所看到的逻辑核的数量。
发布于 2015-09-06 09:33:40
但是,ThreadPool会认识到这个事实吗?还是会尝试创建越来越多的线程来减少对任务缓冲区的压力?
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操作的延迟,但我非常肯定,您需要付出一定的努力才能真正达到这个极限。
通常,如果您对本机实现感兴趣,可以使用在GitHub上浏览它
https://stackoverflow.com/questions/32421443
复制相似问题