当前位置: 首页 > 知识库问答 >
问题:

什么决定了同时连接的数量

郜谦
2023-03-14

在JavaServlet环境中,哪些因素是同时用户数量的瓶颈。

  1. 服务器每个端口允许的HTTP连接数

还有其他因素吗?

编辑:为了不考虑业务逻辑,假设只有一个servlet在Log4j上打印一行。

  • 我的Tomcat服务器能同时处理6000个HTTP连接吗?为什么不呢(文件处理?每个请求的CPU时间?)

为每个连接生成的垃圾量是否会产生影响?例如,如果Tomcat为每个HTTP连接创建并留下20KB的对象。。然后,在处理2500个请求时,将使用100MB堆,这可能会触发300毫秒的GC暂停。

我们可以这样说吗:如果Tomcat使用0.2秒的CPU时间来处理单个HTTP请求,那么它将能够在一秒钟内处理大约500个HTTP连接。因此,6000个连接需要5秒钟。

共有3个答案

桂学
2023-03-14

还有另一个常见的瓶颈:数据库连接池的大小。但我还有一句话:当您耗尽了允许的HTTP连接数,以及允许为请求提供服务的线程数时,您只会拒绝一些请求。但是,当内存耗尽时(例如,使用太多数据的会话太多),可能会导致整个应用程序崩溃。

不同之处在于,在短时间重载的情况下,当负载随后下降时:

  • 在第一种情况下,应用程序已启动,可以正常服务请求
  • 在第二种情况下,应用程序关闭,必须重新启动

编辑:

我忘了记得真正的用例。我发现,为众多并发连接提供服务的最大问题是数据库请求的质量(假设您使用数据库)。这不会产生直接影响,因为没有最大数量,但您可以轻松占用所有数据库服务器资源。不良数据库请求的常见示例:

  • 在有大量行的表上没有索引
  • 不使用任何索引的请求(在大表上)
  • n 1综合症:当您将一对多关系映射到集合时,使用ORM,当您总是需要集合中的数据时,不要急切地
  • 加载完整数据库综合症:使用ORM,当您将所有关系映射为急切时,任何单个请求都以加载大量依赖数据而告终。

这些问题更糟糕的是,当数据库处于年轻状态时,它们不会对测试造成伤害,因为没有那么多行,但随着时间的推移和行数的增加,性能会下降,从而使应用程序无法在少数用户上使用。

阮健
2023-03-14

我遇到的最大瓶颈是处理请求所需的时间。您为请求提供服务的速度越快,您可以处理的连接就越多。

这是一个很难回答的问题,因为每个应用程序都不同。为了让我支持的应用程序明白这一点,我创建了一个单元测试,生成了许多线程,并在eclipse中观察VisualVM中的内存使用情况。

您可以看到内存消耗是如何随使用的线程数而变化的。您应该能够获得线程转储,并查看线程正在使用多少内存。您可以推断出平均值,以了解N个用户可能需要多少RAM。

瓶颈将是一个移动的目标,因为你将优化一个区域,直到你可以扩大,然后另一个区域将成为你的瓶颈。

如果servlet的响应时间是一个瓶颈,那么您可以使用一些排队数学来确定多少请求可以基于平均响应时间以最佳方式排队。

http://www4.ncsu.edu/~hp/SSME_QueueingTheory.pdf

希望这有帮助。

我的Tomcat服务器可以同时处理6000个HTTP连接吗?为什么不(文件处理?每个请求的CPU时间?)?

这是可能的,但可能不会。此外,如果您计划进行大容量操作,您可能应该在应用程序服务器前面添加一个Web层。
假设您有6000名用户都在您的应用程序上忙碌。用户发送的每个请求仅在服务器上存在片刻[希望],并且您的峰值线程数可能从未超过20个。
我建议设置一些监控以了解您的应用程序在真实用例下的表现。查看超文本传输协议://Hawt.io它使用Jolokia通过超文本传输协议获取JMX指标。
如果您对分析很认真,我建议使用像Graphite这样的东西来聚合您的JMX指标。https://github.com/graphite-project/graphite-web
我已经为Jolokia编写了一个收集器,用于将指标发送到Carbon/Graphite,并且可能能够在我的管理层批准的情况下将其开源。如果您感兴趣,请告诉我。

我可以让线程池大小为5000(空闲线程是否需要CPU/RAM)?

空闲线程没什么好担心的,尽管将线程池设置得太高可能会让您的应用程序服务器接收太多请求。如果发生这种情况,您最终可能会用它无法处理的连接淹没您的数据库,或者您的内存分配可能不足以处理这么多请求。这可能会开始整体应用程序性能下降。
设置太低,您的应用程序服务器可能会再次开始排队请求,导致性能下降。
通常在高峰或高容量期间会有一些排队,但您不想让您的应用程序服务器过载。查看排队理论以了解有关此的更多信息。
此外,这也是在应用服务器前面设置Web服务器可以帮助您的地方。如果您让Apache提供静态内容,在大多数情况下只有动态请求才会到达应用程序服务器。
调整非常特定于您的单个应用程序。我建议保留默认值并优化您的代码,直到您收集到足够的数据以知道应该打开哪个旋钮。

我可以让oracle连接池大小为500个连接(空闲连接是否需要CPU/RAM)?

与应用程序线程池大小相同的情况。尽管您的DB池大小应该比应用程序线程数小得多。
500对于大多数Web应用程序来说都太高了,除非您的容量非常大,在这种情况下,您可能需要像Oracle RAC这样的DB集群环境。
如果池设置得太高并且您开始使用大量连接,您的DB硬件将无法跟上,最终您将在数据库服务器上遇到性能问题。
查询返回所需的时间可能会增加,进而导致您的应用程序响应时间增加。
使用分析或指标来确定正常使用下活动DB连接的平均数量,并将其用作确定允许的最大值的基线。

为每个连接生成的垃圾量是否会产生影响?例如,如果Tomcat为每个HTTP连接创建并留下20KB的对象。。然后,在处理2500个请求时,将使用100MB堆,这可能会触发300毫秒的GC暂停。

数字会有所不同,但的确如此。还请记住,完整的GC更值得关注。增量GCs不会暂停您的应用程序。查看“并发标记和清理”和“垃圾优先”。

我们可以这样说吗:如果Tomcat使用0.2秒的CPU时间来处理单个HTTP请求,那么它将能够在一秒钟内处理大约500个HTTP连接。因此,6000个连接需要5秒钟。

这并不是很容易,因为每一个请求都会进来,还有一些请求正在处理和完成。看看排队论,更好地理解这一点。http://www4.ncsu.edu/~hp/SSME_排队理论。pdf

秦禄
2023-03-14

有趣的问题是,如果我们最终把所有决定性能的属性都撇开,那就归结为您在servlet中做了多少工作,或者如果它具有最高的I/O、CPU和内存,则需要多少时间。现在让我们带着上面的陈述一起往下看-

服务器每个端口允许的HTTP连接数

文件描述符是有限制的,但这同样是由servlet完成一个请求的时间或从请求的第一个字节接收到完成发送整个响应的时间触发的。因为如果只需要1毫秒,并且你正在使用网络和持久连接,你可以达到一个非常高的速度

池中的servlet数

理论上

分贝

如果是甲骨文,祝福你连接管理,你肯定需要严格的监控。现在,这只是另一个限制因素,可以被视为一个又一个阻塞I/O。根据I/O的定义,延迟/吞吐量很重要,当它变得比最小的工作块更大时,它就会成为一个瓶颈。

因此,最后,您需要分解所有servlet的以下或更多属性

  1. 是CPU限制吗?如果是,需要多少周期,或者可以安全地转换为某个时间单位。e、 g.1ms,仅用于计算工作
  2. 是否为I/O绑定,如果是,则查找该单元
  3. 和其他人
  4. 一长串你拥有的东西,例如CPU、内存、GB/s

现在你知道需要做多少工作,你所做的就是除以你所拥有的,并继续调整,这样你就找到了最优,也找到了你没有考虑和考虑的其他属性。

 类似资料:
  • 问题内容: 在Java Servlet环境中,什么因素是并发用户数量的瓶颈。 服务器每个端口可以允许的HTTP连接数 服务器可以跨多个端口允许的HTTP连接数(我可以在多个HTTP端口上具有多个WAS配置文件) 池中的servlet数量 为WAS配置用于服务连接的线程数 服务器可用的RAM(假设应用程序内存为0,服务线程数之间是否有任何关联) 还有其他因素吗? 编辑:为了避免出现业务逻辑,假设只有

  • 认证之后,如果我调用任何方法,比如< code>os.compute()。口味()。list()或< code>os.images()。list(),我得到< code >连接超时。为什么会这样? 我在GoogleCloudsPlataform VM上设置了一个带有RDO包堆栈的OpenStack。我正在对域和项目进行身份验证。我尝试了没有项目的身份验证,方法调用没有超时,但是响应是错误的,例如,

  • 问题内容: 我正在尝试从另一个站点获取信息。当我尝试去做 它抛出一个。这是否意味着该站点将不允许自动连接?还有另一种获取此信息的方法吗? 问题答案: 这可能意味着几件事: 该站点有问题并且正在主动断开连接(拒绝与超时不同,拒绝完全没有响应) 中间人可能拒绝了您的连接,例如防火墙,尽管如果您可以通过浏览器访问该站点,则不太可能 您使用了错误的端口,即您输入https://时的意思是http://,反

  • 我玩OpenSSL。我看到不同的openssl类型使用类型。 例如: 每日生活津贴签名 OpenSSL中的< code>BIGNUM是: 我不明白如何为特定的算法选择bignum,bignum数组的大小呢?

  • 问题内容: SQL标准是否为多表查询指定锁定顺序? 例如,给定: SQL标准是保证锁定顺序还是由(特定于实现的)执行计划确定? 有没有办法保证锁定顺序? 如果没有办法保证锁定顺序,我们应该如何防止死锁? 更新 :在未解释您的推理之前,请不要投票结束该问题。就我而言,这是一个编程问题,这使Stackoverflow变得非常重要。如果您认为这个问题需要进一步完善,请解释一下,我们非常乐意为您解答。 问

  • 文件中说: 设置代理的HTTP协议版本。默认情况下,使用1.0版。建议将1.1版用于keepalive连接和NTLM身份验证。 在我的nginx配置中我有 直接http://127.0.0.1:1980,我可以看到我的应用程序在一个连接上收到许多请求(当我刷新时)。这是我发送的响应 HTTP/1.1 200 OK\n内容类型:text/html\n内容长度:14\n连接:保持活动\n\n Hell