Ted*_*ddy 20 java performance multithreading servlets
在Java servlet环境中,有哪些因素是同时用户数量的瓶颈.
还有其他因素吗?
编辑:为了使业务逻辑脱离图片,假设只有一个servlet在Log4j上打印一行.
每个连接生成的垃圾量是否会产生影响?例如,如果对于每个HTTP连接,由Tomcat创建并留下20KB的对象,则在处理2500个请求时将使用100MB堆,这可能会触发300毫秒的GC暂停.
我们可以这样说:如果Tomcat使用0.2秒的CPU时间来处理单个HTTP请求,那么它将能够在一秒钟内处理大约500个http连接.因此,6000个连接需要5秒.
我遇到的最大瓶颈是处理请求所需的时间.您可以更快地为请求提供服务,您可以处理的连接越多.
由于每个应用程序都不同,这是一个难以回答的问题.为了解决我支持的应用程序,我创建了一个生成许多线程的单元测试,并在eclipse中观察VisualVM中的内存使用情况.
您可以看到内存消耗如何随着使用的线程数而变化.你应该能够获得一个线程转储,看看线程使用了多少内存.您可以推断平均值,以了解N个用户可能需要多少RAM.
瓶颈将是一个移动目标,因为你将优化一个区域,直到你可以扩大规模,然后另一个区域将成为你的瓶颈.
如果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)?
尽管设置线程池太高可能会让应用程序服务器接收太多请求,但空闲线程并不需要担心.如果发生这种情况,您最终可能会因为无法处理的连接而淹没您的数据库,或者您的内存分配可能不足以处理这么多请求.这可能会降低整体应用程序性能.
设置得太低,您的应用服务器可能会再次启动排队请求,从而导致性能下降.
通常在峰值或高音量时间内进行一些排队,但您不希望重载应用程序服务器.查看排队理论以了解更多相关信息.
此外,这是在应用服务器前面有一个Web服务器可以帮助您的地方.如果您使用Apache提供静态内容,则在大多数情况下,只有动态请求才会到达应用程序服务器.
调整非常适合您的个人应用.我建议保留默认值并优化代码,直到你可以收集足够的数据来知道应该转动哪个旋钮.
我可以将oracle连接池大小设置为500个连接(空闲连接是否需要CPU/RAM)?
与应用程序线程池大小相同的情况.虽然DB的池大小应该比应用程序线程数小得多.
对于大多数Web应用程序来说,500都太高,除非您的数量非常大,在这种情况下,您可能需要像Oracle RAC这样的数据库集群环境.
如果池设置得太高而您开始使用大量连接,则数据库硬件将无法跟上,最终会导致数据库服务器出现性能问题.
返回查询所需的时间可能会增加,从而导致应用程序响应时间增加."日志堵塞"效果.
使用概要分析或指标来确定正常使用下的活动数据库连接的平均数,并将其用作确定最大允许数的基准.
每个连接生成的垃圾量是否会产生影响?例如,如果对于每个HTTP连接,由Tomcat创建并留下20KB的对象,则在处理2500个请求时将使用100MB堆,这可能会触发300毫秒的GC暂停.
数字会有所不同,但是是的.还记得Full GC更值得关注.增量GC不会暂停您的应用程序.查看"并发标记和扫描"和"垃圾优先".
我们可以这样说:如果Tomcat使用0.2秒的CPU时间来处理单个HTTP请求,那么它将能够在一秒钟内处理大约500个http连接.因此,6000个连接需要5秒.
当每个请求进入时,它并不那么容易,还有一些正在处理和完成.查看排队理论以更好地理解这一点. http://www4.ncsu.edu/~hp/SSME_QueueingTheory.pdf
有趣的问题,如果我们将所有性能决定属性分开,最后归结为你在servlet中做了多少工作,或者如果它具有最高的I/O,CPU和内存需要花费多少时间.现在让我们向下移动,并列出上述说法; -
服务器可以允许每个端口的HTTP连接数
文件描述符存在限制,但是再次由servlet完成请求的时间或从请求第一个字节接收到完成发送整个响应所花费的时间来触发.因为如果它只需要1ms并且您正在使用Netty和持久连接,那么您可以达到非常高的>> 6000.
池中的servlet数
理论上>> 6000.但有多少线程正在处理您的请求?是否有一个线程池正在烧毁您的请求?所以你想增加线程,但多少可以说2000并发线程.您的CPU在上下文切换时表现不佳吗?它是I/O绑定的吗?如果是,那么上下文切换是有意义的,但是你会遇到那些网络限制,因为很多线程正在等待网络I/O,所以最终你花了多少时间在一项工作上.
D B
如果它是oracle,请用连接管理祝福你,你肯定需要在这里进行严格的监控.现在这只是另一个限制因素,可以被视为另一个阻塞I/O. 根据I/O的定义,延迟/吞吐量很重要,并且当它变得比最小的工作更大时成为瓶颈.
因此,最后,您需要细分所有servlet的以下或更多属性
现在您知道需要完成多少工作,而您所做的就是除以您所拥有的并继续调整,以便您找到最佳状态并找出您未考虑的其他属性并考虑它们.
还有另一个常见的瓶颈:数据库连接池的大小.但我还有一个注意事项:当你耗尽允许的HTTP连接数量,允许服务请求的线程数量时,你只会拒绝一些请求.但是当你耗尽内存(例如,过多的会话中有太多数据)时,你可能会崩溃整个应用程序.
不同之处在于,在短时间内负载较重的情况下,当负载稍后下降时:
编辑:
我忘了记住真实的用例.我发现服务大量并发连接的最大问题是数据库请求的质量(假设您使用数据库).由于没有最大数量,因此没有直接影响,但您可以轻松地占用所有数据库服务器资源.数据库请求不佳的常见示例:
更糟糕的是,这些问题是,当数据库很年轻时,它们在测试中不会造成任何伤害,因为没有那么多行,但随着时间和行数的增加,性能下降给少数用户带来了无法使用的应用.