我想了解Tomcat BIO 和 NIO 连接器的线程模型。我参考了官方 Tomcat 7 连接器文档,可以在此处找到。根据文档,这是我所怀疑的:
- acceptorThread(s):这是一个或最多两个线程(如文档中所述),仅负责接受进入的连接。可以使用acceptorThreadCount进行配置,建议在多CPU机器上使用两个以上 - - 为什么要这样做? - 这是否意味着同时打开的连接数会随着CPU数量而缩放,而不是与服务器系统允许的打开文件描述符数有关?
- maxConnections(s): - 此设置与acceptCount和系统上打开的文件描述符数量之间有何关系。 - 为什么NIO连接器的默认值(10000)比BIO连接器高得多(= maxThreads)?
- acceptCount:当所有请求处理线程都忙时,这是请求队列。 - 当将请求放入此队列时,是否也为其分配文件描述符?或者只有在主动处理请求时,才会消耗文件描述符?
- request processing threads:此池中的线程数由maxThreads和minSpareThreads属性配置。 - 此线程池与acceptorThreads之间的关系是什么?接受线程是否会生成此池中的线程? - 据我了解,NIO模型比BIO模型在请求处理线程方面更高效。它如何实现这种效率?根据多个来源的阅读,NIO模型中的线程遵循“每个请求一个线程”的范例,而BIO模型中则是“每个连接一个线程”的范例。此外,在NIO连接器模型中,实际的请求处理被委托给不同的应用程序监控线程,而服务器的请求处理线程则返回到线程池中,可以自由地接受更多的连接。 因此,这是否意味着只有当连接到服务器的方式是HTTP Keep-Alive或应用程序使用Servlet 3.0的异步处理功能时,NIO模型的优势才会显现?
Servlet 3.0:
- acceptorThread(s):这是一个或最多两个线程(如文档中所述),仅负责接受进入的连接。可以使用acceptorThreadCount进行配置,建议在多CPU机器上使用两个以上 - - 为什么要这样做? - 这是否意味着同时打开的连接数会随着CPU数量而缩放,而不是与服务器系统允许的打开文件描述符数有关?
- maxConnections(s): - 此设置与acceptCount和系统上打开的文件描述符数量之间有何关系。 - 为什么NIO连接器的默认值(10000)比BIO连接器高得多(= maxThreads)?
- acceptCount:当所有请求处理线程都忙时,这是请求队列。 - 当将请求放入此队列时,是否也为其分配文件描述符?或者只有在主动处理请求时,才会消耗文件描述符?
- request processing threads:此池中的线程数由maxThreads和minSpareThreads属性配置。 - 此线程池与acceptorThreads之间的关系是什么?接受线程是否会生成此池中的线程? - 据我了解,NIO模型比BIO模型在请求处理线程方面更高效。它如何实现这种效率?
- 在使用Servlet 3.0时,为了实现最佳效率,应用程序Servlet线程池的大小(相对于连接器线程池大小)应该是多少?
- 当使用BIO模型时,这两者一起使用时,请求处理的方式是否会有所不同(考虑到连接器线程仍然使用“每个连接一个线程”的模式)?
请注意:所有讨论均与tomcat 7相关。