我想了解Tomcat的BIO和NIO连接器的线程模型。我正在引用可以找到here的连接器的官方Tomcat 7文档。基于此,这就是我所怀疑的:
请注意:关于tomcat 7的所有讨论。
答案 0 :(得分:11)
acceptorThread(s):这是一个或最多2个主题(如 文件中提到的,只负责接受 即将到来的连接。这可以使用配置 acceptorThreadCount,它建议可以使用两个以上 对于多CPU机器 -
为什么会这样?
接受连接是一项成本非常低的操作,因此将多个线程专用于此任务是没有意义的。
Does this imply that the number of simultaneous open connections scales with the number of cpus versus the number of open file descriptors allowed on the server system ?
不,它不是因为它在CPU方面成本非常低。对于文件描述符,每个接受的连接都将使用文件描述符,因此服务器可以接受的最大连接数受可用文件描述符数量的限制。
maxConnections(s):
此设置与acceptCount和数字之间的关系是什么 在系统上打开文件描述符。
maxConnections不能高于系统上打开文件描述符的数量。请记住,其他进程也使用文件描述符,因此可能希望对可用文件描述符的maxConnections保守,让我们说maxConnections<文件描述符/ 2.
Why is the default value for this so much higher for the NIO connector ( 10000 ) than for the BIO ( = maxThreads ) ?
这是因为在NIO中,单个处理所有IO,而在BIO中,服务器需要创建/使用单独的每个线程连接。
acceptCount :当所有请求处理线程都忙时,这是请求的队列。
当请求被放入此队列时,是否也分配了一个文件描述符?
是的,接受连接请求是正确的,但服务器尚未准备好提供请求,因此连接被放入队列中。这样做是为了防止TCP /堆栈超时连接请求,从客户端的角度来看,这些请求可能看起来像服务器。换句话说,服务器说“我在这里,一旦有资源就会处理您的请求”。
或者仅在请求被主动处理时,它是否使用文件描述符?
不。
希望这会有所帮助。
此致
Slava Imeshev