Tomcat 使用 Jersey Jax-RS 在单个服务器上执行 15K 请求/秒

Posted

技术标签:

【中文标题】Tomcat 使用 Jersey Jax-RS 在单个服务器上执行 15K 请求/秒【英文标题】:Tomcat doing 15K req/second on a single server using Jersey Jax-RS 【发布时间】:2011-12-19 17:25:03 【问题描述】:

我尝试在 VPS 上进行测试,结果接近每秒 10K 请求,那是 simple 'hello world' servlet,更不用说调用 membase。

我的 VPS 是 2 x Intel Xeon X5570,四核“Nehalem”架构。

注意:我不是 java 专家,也不是 tomcat 专家,这是默认设置。

还有其他人可以处理如此高的流量吗?

我使用了 apache bench,大概运行了 4-5 次,向服务器发出了大约 100K 的请求。

原文:how to handle 2000+ requests/sec on tomcat?

【问题讨论】:

希望@Brian Roach 能加入 :) 你确定你没有被client绑定吗?我们很难从任何“测试工具”中获得准确的数字,因为我们会在 tomcat 之前最大化客户端。我们最终编写了自己的简单测试类,这些类产生了足够多的线程来保持查询率足够高,从而获得准确的数字。另外,@BalusC 在下面说了什么。 @Brian 好点,我也在同一台机器上运行它。但是让我觉得它很简单,就像你可以得到'hello world'一样,我想你的有更多的逻辑,比如身份验证等,然后写入数据库。令人惊奇的是,将红宝石从水中吹出! JMeter 是一个非常宝贵的网络服务器压力测试工具。它的用户界面非常简陋,不完全有品位和用户友好,但它的工作非常好。 我们通过连接池保持与 membase 的持久连接,我们的中位查询时间 【参考方案1】:

开启 NIO(非阻塞 IO)。默认情况下未启用此功能。如果没有 NIO,每个 HTTP 连接都由单个线程处理,并且限制取决于可用线程的数量。使用 NIO,单个线程可以处理多个 HTTP 连接,并且限制取决于可用的堆内存量。使用大约 2GB 的空间,您最多可以连接 20K。

开启 NIO 就是将 Tomcat 的 /conf/server.xml<Connector> 元素的 protocol 属性更改为 "org.apache.coyote.http11.Http11NioProtocol"

<Connector
    protocol="org.apache.coyote.http11.Http11NioProtocol"
    port="80"
    redirectPort="8443"
    connectionTimeout="20000"
    compression="on" />

【讨论】:

我已经准备好了,当你有很多短暂的请求时,码头可能会更好,对吗? 我从未密切使用过 Jetty。从过去 8 年我在 Java 相关论坛和问答网站上阅读的内容来看,没有什么能激励我认真对待 Jetty。不过,我不会阻止您自己尝试和对其进行基准测试。 想知道是否有关于每个核心应该在 tomcat 中设置多少线程的建议?我猜你可以在配置中告诉它?即最大线程数或者知道你有多核等是否开箱即用。 点击我回答中蓝色的&lt;Connector&gt; 部分。它会引导您查看文档,其中包含所有可能设置的有价值的概述。最后但同样重要的是:测量就是知道。很大程度上取决于底层硬件和软件(!)。 奇怪,切换到 Nio 实际上减慢了速度(在单核和多核 vm 上),我什至尝试了 apache bench 请求和并发连接的各种组合(-n 和 -c 开关)。此外,每个请求时间大约多 0.2 毫秒。我很高兴使用 http 1.1 或 Http11Protocol(两者都是相同的)的 rps 速率可能提高了 20%。奇怪吗?

以上是关于Tomcat 使用 Jersey Jax-RS 在单个服务器上执行 15K 请求/秒的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jax-RS(Jersey) 在 Tomcat7 上运行应用程序 Hibernate 5.x、Jpa 2.1、Java EE7(javaee-api 7.0)

为啥使用 JAX-RS / Jersey?

如何使用 JAX-RS 和 Jersey 处理 CORS

如何使用JAX-RS和Jersey处理CORS

Jersey / JAX-RS ExceptionMapper MySQL

JAX-RS (Jersey 2) - 使用 JSR 250 注释的授权