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 中设置多少线程的建议?我猜你可以在配置中告诉它?即最大线程数或者知道你有多核等是否开箱即用。 点击我回答中蓝色的<Connector>
部分。它会引导您查看文档,其中包含所有可能设置的有价值的概述。最后但同样重要的是:测量就是知道。很大程度上取决于底层硬件和软件(!)。
奇怪,切换到 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)