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

标签 java multithreading performance servlets

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

  1. 服务器允许每个端口的 HTTP 连接数
  2. 服务器允许跨多个端口的 HTTP 连接数(我可以在多个 HTTP 端口上拥有多个 WAS 配置文件)
  3. 池中的 servlet 数量
  4. 为 WAS 配置的用于服务连接的线程数
  5. 服务器可用的 RAM(假设应用程序中的内存泄漏为 0,服务线程数之间是否存在任何关联)

还有其他因素吗?

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

  • 我的 Tomcat 服务器能否同时处理 6000 个 HTTP 连接?为什么 不是(文件句柄?每个请求的 CPU 时间?)?
  • 我可以将线程池​​大小设为 5000(空闲线程是否会消耗 CPU/RAM)?
  • 我能否将 oracle 连接池大小设置为 500 个连接(空闲 连接会消耗 CPU/RAM)?

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

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

最佳答案

有趣的问题,如果我们不考虑所有决定性能的属性,最终归结为您在 servlet 中做了多少工作,或者如果它具有最高的 I/O、CPU 和内存则需要多少时间。现在让我们带着上面的陈述向下移动列表;-

Number of HTTP connections the server can allow per port

limit对于文件描述符,但这又会被 servlet 完成请求所花费的时间或从请求第一个字节接收到完成发送整个响应所花费的时间触发。因为如果只需要 1ms 并且你使用的是 Netty 和持久连接,你可以达到非常高的 >> 6000。

Number of servlets in pool

理论上>> 6000。但是有多少线程正在处理您的请求?是否有一个线程池正在燃烧您的请求?所以你想增加线程,但是有多少可以说 2000 个并发线程。您的 CPU 在上下文切换时表现不佳吗?是否受 I/O 限制?如果是的话,上下文切换是有意义的,但是你会遇到这些网络限制,因为有很多线程在网络 I/O 上等待,所以最终你花了多少时间在一项工作上。

DB

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

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

  1. 是否受 CPU 限制?如果是,它需要多少周期或者可以安全地转换为某个时间单位。例如仅计算工作需要 1 毫秒。
  2. 是否受 I/O 限制,如果是,同样查找单元。
  3. 和其他人
  4. 您拥有的一长串 list ,例如CPU、内存、GB/s

现在你知道需要做多少工作,你所做的就是除以你拥有的东西并不断调整,这样你就可以找到最佳的,也找出你没有考虑过的其他属性并考虑它们。

关于java - 什么决定了同时连接的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26576718/

相关文章:

java - 将操作添加到表单页面中的工具栏

java - 如何使用apache common vfs上传字节数组

Java 线程教程

php - 提供数千张动态加水印的图像?

Python "Memory Error."/节省内存

python - Pandas 应用使用最小/最大在可变滚动窗口上执行缓慢

java - 在 MigLayout 中显示所有边框

Java:从 PrivateKey 对象生成证书(X509Certificate 对象)

java - Ubuntu 无法启动另一个 Java 线程

ruby - Thin 中的用户线程,Heroku 上的 Sinatra 应用程序