我经历的最大瓶颈是处理请求所需的时间。
您能够更快地服务请求,就能处理更多的连接。
这是一个困难的问题,因为每个应用程序都不同。
为了解决这个问题,我创建了一个单元测试来生成许多线程,并在Eclipse中的VisualVM中监视内存使用情况。
您可以看到您的内存消耗如何随着使用的线程数量而变化。
并且您应该能够获得线程转储并查看线程使用的内存量。
您可以推断出平均值,以了解可能需要多少RAM才能支持N个用户。
瓶颈将是一个移动目标,因为您将优化一个区域,直到您可以扩展更大,然后另一个区域将成为您的瓶颈。
如果servlet的响应时间是瓶颈,您可以使用一些排队数学方法来确定根据平均响应时间可以最佳排队多少个请求。
http://www4.ncsu.edu/~hp/SSME_QueueingTheory.pdf
希望这可以帮到您。
更新以回答您的其他问题:
我的Tomcat服务器能处理6000个同时的HTTP连接吗?为什么不行(文件句柄?每个请求的CPU时间?)
可能是可能的,但很可能不行。如果您计划进行高流量操作,还应该在应用程序服务器前添加Web层。
假设有6000个用户都在使用您的应用程序。每个用户发送的请求只存在于服务器上一瞬间[希望如此],您的峰值线程数可能从未超过20。
我建议设置一些监控,了解您的应用程序在实际使用情况下的性能。查看http://Hawt.io,它使用Jolokia通过http获取JMX指标。
如果您真的关心分析,我建议使用类似Graphite之类的东西来聚合您的JMX指标。 https://github.com/graphite-project/graphite-web
我编写了一个Jolokia收集器,可以将指标发送到Carbon/Graphite,并且如果得到管理批准,可能会将其开源化。如果您有兴趣,请告诉我。
我可以将线程池大小设置为5000吗(空闲线程会消耗CPU / RAM)?
空闲线程不用太担心,但是将线程池设置得过高可能会导致您的应用服务器接收到太多请求。如果发生这种情况,您可能会使DB受到无法处理的连接洪水,或者您的内存分配可能无法处理如此多的请求。这可能会开始整体应用程序性能下降。
设置太低,您的应用程序服务器可能会再次排队请求,从而导致性能下降。
在峰值或高容量时有一些排队是正常的,但您不希望过载您的应用程序服务器。查看排队理论以了解更多信息。
此外,这就是在应用服务器前面拥有Web服务器可以帮助您的地方。如果Apache提供您的静态内容,则大多数情况下只有动态请求会到达应用程序服务器。
调整非常特定于您的个人应用程序。我建议保持默认设置,并优化您的代码,直到您可以收集足够的数据以知道应该转动哪个旋钮。
我可以将Oracle连接池大小设置为500个连接吗(空闲连接会消耗CPU / RAM)?
与应用程序线程池大小相同的情况。尽管您的数据库池大小应该比应用程序线程计数小得多。
除非您有非常高的流量,否则500对于大多数Web应用程序来说都太高了,在这种情况下,您可能需要像Oracle RAC这样的DB集群环境。
如果池设置过高并且开始使用大量连接,则您的DB硬件将无法跟上,并且您最终会在数据库服务器上遇到性能问题。
查询返回所需的时间可能会增加,反过来会导致应用程序响应时间增加。 “日志卡住”效应。
使用分析或指标确定正常使用下的平均活动DB连接数,并将其用作确定允许的最大值的基线。
每个连接生成的垃圾数量是否有影响?例如,如果为每个HTTP连接创建并留下Tomcat 20KB的对象..那么在处理2500个请求时将使用100MB堆,这可能会触发300ms的GC暂停。
数字会有所不同,但是是的。还记得完整的GC更值得关注。增量GC不会暂停您的应用程序。查看“并发标记和清除”和“Garbage First”。
如果Tomcat在处理单个HTTP请求时使用0.2秒的CPU时间,则它可以处理大约500个HTTP连接/秒。因此,6000个连接需要5秒钟。但实际情况并不是这么简单,因为每个请求进来的同时,也有一些正在被处理和完成。请查看排队理论以更好地理解此概念。
http://www4.ncsu.edu/~hp/SSME_QueueingTheory.pdf