java - Tomcat 8 NIO,它是如何工作的?
问题描述
我创建了简单的 Spring Boot MVC 应用程序并注意到(使用JVisualVM
)我所有的线程都有前缀 nio。这意味着Tomcat使用java.nio
包。我们可以将以下参数添加到 Tomcat 配置中maxThreads,maxConnections
:据我所知,这意味着:例如我们有maxThreads
= 2 ,maxConnections
= 10000,那么第一个线程的 Selector (from java.nio
) 可以处理10000
并发请求,但是根据selectorKeys
第二个线程的相同行为顺序执行每个请求。
它是否以这种方式工作,如果是,您通常如何选择最佳选项?maxConnections
预先感谢
(顺便说一句,我使用 Tomcat 8 )
解决方案
最大客户端连接数为acceptCount
+ maxConnections
。太低,请求可能会被不必要地拒绝。太高了,如果吞吐量跟不上,客户可能会饿死。
acceptCount:
- 默认为 100 - 这backlog
用作ServerSocket.bind
. 操作系统的 TCP 堆栈将排队最多acceptCount
挂起的套接字连接。这发生在 Tomcat 开始处理连接之前。
maxConnections:
- 默认为 10,000 - Tomcat 允许在内部进行的最大连接数。
maxThreads:
- NIO 和 NIO2 下默认为 200 - 最大并发请求处理线程数。
目标是优化服务可用性和性能并有效利用资源。这些设置将取决于您的请求处理器的延迟和负载分布。
根据目标,有许多不同的容量规划方法。一个简单的选择是增加到maxThreads
服务器无法在合理的时间段内安全地处理任何其他请求的程度。在这个饱和点,接受更多的连接是不可取的,因为清除它们需要很长时间。因此,请考虑每个处理线程需要多少 CPU 时间和 RAM,以及有多少可以安全地同时运行。
推荐阅读
- node.js - Express JS - 从 REST 调用加载数据并在应用程序启动时设置为应用程序变量
- php - 将 mailchimp 与 CRM 集成
- quill - QuillJs 处理大文档时速度很慢
- css - CSS - 带有边框半径的动画比例
- python - 在Python中每行打印一个编号列表
- ios - 只有最后 2 个值的索引超出范围?
- html - 如何在容器外显示导航栏下拉菜单?
- mysql - MacOS Mojave 上的 WordPress 数据库连接错误
- webrtc - Edge WebRTC 加入了显示旧帧的媒体流
- javascript - 单击我的选择中的另一个项目时如何访问 json 对象的其他属性?